Многие библиотеки JavaScript (jQuery, Zepto), похоже, вызывают Array.prototype.slice.call для результатов querySelectorAll(), getElementsByTag или ClassName...
Прочитав много похожих вопросов/ответов на StackOverflow, я понял, что нужно преобразовать результат NodeList в настоящий массив, чтобы вы могли вызывать методы массива (slice, pop) для результатов, которые недоступны в NodeLists, но что я не делаю не понимаю почему? Обычно вам действительно не нужны срезы/выталкивания в списке узлов DOM + NodeLists уже имеют свойство длины, поэтому они все равно проходимы.
Некоторые ответы, кажется, подразумевают, что это потому, что NodeList указывает на живые объекты DOM. Но опять же, если вы преобразуете его в массив, ссылки по-прежнему указывают на живые узлы DOM — так в чем же разница?
Или это что-то еще, чего мне совершенно не хватает? Помогает ли это Zepto/jQuery каким-то образом кэшировать несколько вызовов свойств для элементов DOM? (хотя я действительно не понимаю, как это сделать, поскольку это все еще живые ссылки на DOM)
NodeList
указывает на живые объекты DOM, но это означает, что когда один из них уничтожается (или больше не является допустимым элементом для списка), он и его место удаляются из списка. Когда вы нарезаете массив, это не тот же живой список — живы сами элементы, но не сам список. Когда элемент уничтожается, его место по-прежнему сохраняется в массиве... но он не будет представлять элемент - я предполагаю, что он становится неопределенным или нулевым. - person Ian   schedule 08.11.2012getElementById
,querySelectorAll
и т. д., поэтому библиотека точно не знает, какой список будет возвращен. Это их способ убедиться, что вы получаете статический список элементов, которые возвращаются из любого базового метода в этот конкретный момент времени и всегда будут доступны (если вы не манипулируете списком позже). - person Ian   schedule 08.11.2012