我正在阅读有关 querySelector
方法的内容,文章建议例如应使用 Array.prototype.map.call()
而不是 map( )
。我对此没有问题,但是我真的不明白为什么应该选择 Array.prototype.map.call()
而不是 Array.map()
是什么让一个比另一个更好?
let nodes = document.querySelectorAll('div.menu-item')
Array.prototype.map.call(nodes, one => one.innerHTML)
//vs
Array.map(nodes, one => one.innerHTML)
最佳答案
首先,没有Array.map
。前一个变体的用例如下:您将无法调用 map
例如通过document.querySelectorAll('div')[0].map
。事实上,document.querySelectorAll
返回 NodeList
而不是数组并且缺少 map 方法。
What makes one better than the other?
问题实际上不在于哪种变体更好。这是关于无法调用map
的问题在节点列表上。
当作为 thisArg
传递时,数组原型(prototype)中的大多数函数也能够处理类似数组的对象(即,其键是数字索引表示的对象)。至 call (or apply). Hence,
Array.prototype.map.call(array-like, mapFunction)`可以像数组一样映射NodeList。
但是有两种选择:
- 使用Array.from :
Array.from(nodes, n => n.innerHTML)
ES6 中引入,但 Internet Explorer 不支持。然而,当这并不重要时,我更喜欢这个。 - 使用
Array.prototype.slice.call(nodes).map(n => n.innerHTML)
,其工作方式类似(请参阅 how does Array.prototype.slice.call() work? )或坚持使用Array.prototype.map.call
.
但是,根据您的整体代码,(1)的使用似乎非常好,我个人更喜欢这样做。
关于javascript - Array.prototype.map.call 与 Array.map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45564648/