2015-06-29 3 views
3

Так много раз я вижу это выражение:Что именно [] .slice сделать

var args = [].slice.call(arguments, 0); 

Но [].slice.call([1,2,3,4,5], 0) именно [1,2,3,4,5].

И не так просто сказать

var args = arguments?

Итак, что именно делает [].slice?

+0

Он превращает аргументы функции в массив, поэтому на нем можно использовать методы прототипа Array. – Xufox

+0

о второй части вопрос. Я вижу, что многие люди делают «var args = [] .slice.call (arguments, 0);». Есть ли какое-то преимущество в этом шаблоне, а не просто использование 'var args = arguments'? –

+0

Прочитайте мой комментарий выше: он позволяет использовать методы прототипа Array. Вы не можете «сортировать» объект 'arguments', вы не можете« фильтровать »объект' arguments', вы не можете «сопоставить» объект 'arguments'. Вы можете сделать это с помощью объекта Array -slice'd 'arguments'. – Xufox

ответ

3

slice является методом массива, который извлекает подмассив из массива:

Метод slice принимает два аргумента, начать и конца и возвращает массив, содержащий элементы массива от элемента начало до , но не включая элемент конец (или через конец массива , если конец - не определено).

Например:

[0,1,2,3,4].slice(2); // [2,3,4] 
[0,1,2,3,4].slice(-2); // [3,4] 
[0,1,2,3,4].slice(2,4); // [2,3] 
[0,1,2,3,4].slice(); // [0,1,2,3,4] 

В частности, как slice() и slice(0) производят копию массива. Затем вы сможете изменить копию, не затрагивая оригинал, и наоборот.

Дополнительно, он также может быть использован с массивами типа объектов:

slice функция намеренно родовое; он не требует, чтобы его это значение было объектом Array. Поэтому его можно перевести на другие виды объектов для использования в качестве метода.

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

[].slice.call({0:0, 1:1, 2:2, length:3}); // [0,1,2] 

Примечание этот трюк уже не нужно в ECMAScript 6, потому что вы можете использовать Array.from:

Array.from({0:0, 1:1, 2:2, length:3}); // [0,1,2] 

Наличие реального массива вместо объекта, подобного массиву, имеет то преимущество, что вы можете использовать методы массива на них.

+0

спасибо за указание на создание типа массива. –