Я наткнулся на этот удобный ярлык для преобразования DOM NodeList в обычный массив, но я должен признать, я не совсем понимаю, как это работает:
[].slice.call(document.querySelectorAll('a'), 0)
Итак, он начинается с пустого массива []
, а затем slice
используется для преобразования результата call
в новый массив, да?
Немного не понимаю это call
. Как это преобразовать document.querySelectorAll('a')
из NodeList в обычный массив?
javascript
arrays
call
slice
Янского
источник
источник
Array.prototype.slice.call(document.querySelectorAll('a'));
это правильный способ написать кусок кода, который вы написали.Array.from
. Так, например, это будет делать то же самое: Array.from (document.querySelectorAll ('a'));Ответы:
Здесь происходит то, что вы вызываете,
slice()
как если бы это была функцияNodeList
использованияcall()
. Чтоslice()
же в этом случае создать пустой массив, то итерацию через объект он запущен (первоначально массив, теперьNodeList
) и держать добавление элементов этого объекта для пустого массива он создал, который в конце концов вернулся. Вот статья об этом .РЕДАКТИРОВАТЬ:
Это не правильно.
[].slice
возвращает объект функции. Функциональный объект имеет функцию,call()
которая вызывает функцию, назначающую первый параметрcall()
дляthis
; другими словами, заставляя функцию думать, что она вызывается из параметра (NodeList
возвращаемогоdocument.querySelectorAll('a')
), а не из массива.источник
Array.prototype.slice.call(...)
, оно на самом деле создает экземпляр объекта array ([]
) только для доступа к своему методу среза прототипа. Это пустая инстанция.Array.prototype.slice.call(...)
Вместо этого говорить чище, хотя вы добавляете несколько символов к своему JS, если вы считаете ...NodeList
s[]
более надежен, посколькуArray
может быть перезаписан на что-то другое. Если вам нужно использовать повторноArray#slice
, рекомендуется кэшировать его.var array = []; var push = array.push; var slice = array.slice; var splice = array.splice;
делает ли он это из-за проблемы безопасности, о которой упоминает @MathiasBynens?