2015-07-25 5 views
1

В чем разница между использованием аргументов и Array.prototype.slice.call (arguments, 0) в функции? Я не вижу, что между ними существует какая-то большая разница, так как я узнаю, когда я должен использовать какой? аргументы против Array.prototype.slice.call (arguments, 0)

function arr(){ 
 
    return arguments; // or return Array.prototype.slice.call(arguments,0); 
 
} 
 
arr([1,2,3],[4,5,6]);

+0

возможно дубликат [Как я могу преобразовать «аргументы» объекта в массив в JavaScript ?] (http://stackoverflow.com/questions/960866/how-can-i-convert-the-arguments-object-to-an-array-in-javascript). Первый абзац объясняет несколько недостатков «аргументов» и почему программист преобразует их в фактический «массив». – Paul

ответ

3

Разница заключается в том, что arguments является «массив типа» объекта, а не массив.

Вы можете преобразовать arguments объект реального массива, нарезая его, как так

Array.prototype.slice.call(arguments, 0); 

Это дает массив со свойствами массива как forEach, pop и т.д., которые такие объекты, как arguments нет (кроме длина, который arguments делаем есть).

Это, как правило, (почти) никогда не является хорошей идеей, чтобы нарезать arguments объект, MDN дает предупреждение

Вы не должны порезать на аргументы, поскольку он препятствует оптимизации в двигателей JavaScript (V8, например). Вместо этого попробуйте создать новый массив , итерации через объект arguments.

Также не должно быть необходимости передавать аргументы функции только для их возвращения.

+0

Чтобы быть конкретным, это массивный объект. Как правило, люди называют не-массивы, индексированные числами, и имеют свойство '.length'. В js есть много таких вещей. «HTMLCollection», возвращаемый 'document.getElementsByClassName()', - это еще один пример: – slebetman

+0

@slebetman. Это действительно просто obect с свойством 'length', часто называемым« array-like ». – adeneo

1

Объект arguments не является реальным массивом. Это особый тип объекта и не имеет никаких свойств Array, кроме «length».

Чтобы создать массив из объекта arguments, используйте Array.prototype.slice.call (arguments, 0);

0

arguments переменная - особый вид Object, а не Array. Таким образом, вы не можете использовать .forEach, .map, '.push' и другие функции массива.

Вы должны преобразовать arguments в Array, а затем вы можете работать со значением в массиве

function test(){ 
 
    console.log(arguments.forEach); // undefined 
 
    var argsArray = Array.prototype.slice.call(arguments,0); 
 
    console.log(argsArray.forEach); // function 
 
} 
 
test();

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