Какое использование Array.prototype.slice.call(array, 0)? - программирование
Подтвердить что ты не робот

Какое использование Array.prototype.slice.call(array, 0)?

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Другое использование преобразования в массив состоит в том, чтобы сделать список статическим. NodeLists обычно живут, а это означает, что при изменении документа объект 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

Ответ 2

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

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

Ответ 3

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