javascript - Array.prototype.map.call 与 Array.map

标签 javascript arrays dom

我正在阅读有关 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。

但是有两种选择:

  1. 使用Array.from :Array.from(nodes, n => n.innerHTML) ES6 中引入,但 Internet Explorer 不支持。然而,当这并不重要时,我更喜欢这个。
  2. 使用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/

相关文章:

javascript - 通过 jQuery 选择完全删除innerHTML img

javascript - vuejs中的Array.prototype.splice和arr.splice有什么区别?

c - 循环内循环 - 我快到了,但这段代码只是稍微偏离

java - 数组索引越界异常但不知道为什么?

javascript - React onClick 函数仅在渲染到 DOM 时触发一次

Javascript 选择所有周围的元素

javascript - 如何正确地将鼠标坐标传递给WebGL?

javascript - 从本地文件获取 Json

arrays - 以字符串格式对包含日期的数组进行排序

JavaScript getElementsByCustomTag ('value')?