2016-04-28 3 views
0

В чем разница междуВ чем разница между ... аргом и аргументами в функции

function(...args) { 
    // args is an array 
} 

и

function() { 
    // arguments is an array-like 
} 

Поскольку это довольно легко преобразовать массив-типа в массив, есть любые другие различия?

Аналогичный вопрос:

myFunction.apply(null, args); 

и

myFunction(...args); 
+0

описание товара opps есть. typo ... – stevemao

+0

несомненно [быстрый google] (https://www.google.ca/search?q=javascript+%22...args%22+vs+arguments&oq=javascript+%22...args%22+ vs + arguments) работал бы здесь? Нажмите первый хит, найдите «...», информацию о предстоящем? –

+0

@Mike 'args' - это произвольное имя, поэтому вы можете просто искать * аргументы javascript *, если вы ожидаете, что страница под названием * Аргумент объекта * будет использоваться для определения параметров отдыха. Конечно, если вы знаете, что они называются параметрами отдыха, было бы лучше искать. – JMM

ответ

6
  1. ...args является новым; не был доступен до ES6
  2. Вы можете использовать его для части структуры аргумента: function(foo, bar, ...others)
  3. Вы получаете массив, так что больше не Array.prototype.slice.call(arguments, 0)
  4. ...args является более очевидным для читателей кода
  5. Теперь, когда у нас есть матчи и зажигалки, нам не нужно втирать палочки, чтобы сделать огонь

Однако, как следствие 1, not everything supports it yet.

2

Re: различия между apply() и распространением (при прохождении null или таких, как thisArg к apply(), как в примере):

myFunction.apply(null, args); 
myFunction(...args); 

Помимо распространения будучи довольно новый, так что не так широко поддерживаются в настоящее время, apply() принимает массив или подобный массиву объект аргументов, тогда как спред будет работать над любым итерабельным. Например, вы могли бы распространять Set или Map в качестве аргументов, в то время как вы не могли передать его в качестве аргумента argArray в apply() (хотя вы могли, конечно, разложить его как аргументы call(): myFunction.call(whatever, ...someIterable)).

Поскольку довольно легко преобразовать массив в массив, есть ли другие отличия?

Это не так-то просто для arguments. Выполнение этого неправильного (или, возможно, вообще) может привести к тому, что механизм JS будет деоптимизировать функцию, и если есть правильный способ сделать это, что позволяет избежать этого, для этого требуется раздражающий шаблон.

+0

Спасибо! iterables - это то, что легко понять неправильно ИМО. – stevemao

Смежные вопросы