Какая польза от Array.prototype.slice.call (array, 0)? - PullRequest
47 голосов
/ 28 февраля 2011

Я просто просматривал исходный код Sizzle и наткнулся на эту строку кода:

array = Array.prototype.slice.call( array, 0 );

Я посмотрел, что это за функция, но пришел к выводу, что она просто возвращает все элементы массива, начиная с индекса 0, и помещает целое в массив, то есть на самом деле ничего не делает.

Какая польза от этой строки кода? Чего мне не хватает?

Редактировать: Это строка 863 из https://github.com/jquery/sizzle/blob/master/sizzle.js#L863.

Ответы [ 3 ]

75 голосов
/ 28 февраля 2011

DOM обычно возвращает NodeList для большинства операций, таких как getElementsByTagName.

Хотя NodeList почти выглядит как массив, это не так. У него есть свойство length, как у массива, и метод item(index) для доступа к объекту по заданному индексу (также доступный с помощью записи [index]), но на этом сходство заканчивается.

Таким образом, чтобы иметь возможность использовать замечательные методы массива без переписывания их всех для NodeList, приведенная выше строка полезна.

Другое использование преобразования его в массив - сделать список статическим. Списки NodeList обычно являются живыми, что означает, что если изменения документа происходят, объект NodeList автоматически обновляется. Это может вызвать проблемы, если возвращаемый вам объект jQuery постоянно меняется прямо у вас под носом. Попробуйте следующий фрагмент , чтобы проверить жизнеспособность NodeLists.

var p = document.getElementsByTagName('p');
console.log(p.length); // 2
document.body.appendChild(document.createElement('p'));
// length of p changes as document was modified
console.log(p.length); // 3
10 голосов
/ 28 февраля 2011

Что здесь происходит, так это то, что Sizzle создает реальный массив из объекта, похожего на массив. Подобный массиву объект не обязательно имеет метод slice (), поэтому метод-прототип должен вызываться напрямую. makeArray() возвращает копию этого похожего на массив объекта, который является фактическим массивом и может использоваться как таковой, где.

См. здесь для получения дополнительной информации о массивоподобных объектах.

6 голосов
/ 28 февраля 2011

Как говорит BoltClock, он делает (мелкую) копию массива. Его также можно использовать для копирования чего-то, что является почти массивом, например, встроенным arguments, у которого есть длина и элементы, но нет массива в его цепочке прототипов (и, следовательно, нет метода среза).

...