首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >循环通过NodeList: Array.prototype.forEach.call() vs Array.from().forEach

循环通过NodeList: Array.prototype.forEach.call() vs Array.from().forEach
EN

Stack Overflow用户
提问于 2017-04-17 10:47:12
回答 3查看 2.3K关注 0票数 6

因此,我希望找到一种简单的方法来遍历nodelists,而且我一直讨厌不能在nodeLists上使用nodeLists。

所以,现在我知道了:Array.prototype.forEach.call(nodeList, callback)

对于索引,我需要:Array.prototype.indexOf.call(nodeList, node)

而且,我在nodeLists上使用的几乎所有东西都是nodeLists。

但我想知道这些是不是被认为是黑客?

他们是正确的方法吗?

另外,假设我实际上不需要来自nodeList的数组,那么使用Array.from(nodeList).forEach(callback)是否有优势呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-04-17 10:49:42

Array.prototype.forEach.call(nodeList, callback)将在节点列表上应用forEach的逻辑。forEach中只有一个for循环,从索引0this.length,并对每个项调用一个回调。此方法调用传递节点列表的forEach作为其this值,因为节点列表具有类似的数组属性(length01、.),所以一切都正常。

Array.from(nodeList).forEach(callback)将从节点列表中创建一个新数组,然后在该新数组上使用forEach。第二种方法可以分成两个不言自明的行:

代码语言:javascript
运行
复制
var newArray = Array.from(nodeList);  // create a new array out of the node list
newArray.forEach(callback);           // call forEach on the new array

第一种方法更好,因为它不创建额外的未加载资源,而且它直接在节点列表上工作。

票数 4
EN

Stack Overflow用户

发布于 2017-04-17 11:09:56

第一种方法是ES5兼容的:

代码语言:javascript
运行
复制
Array.prototype.forEach.call(nodeList, callback).

第二个方法使用Array.from,它仅在ES6中定义:

代码语言:javascript
运行
复制
Array.from(nodeList).forEach(callback)

但是,这里没有优化Array.from的使用,因为您首先创建整个数组,然后使用forEach对其进行迭代。

相反,使用Array.from的第二个参数

代码语言:javascript
运行
复制
Array.from(nodeList, callback)

现在,整个操作在一次迭代中发生。

好的是,在上面的表达式中,回调被用作映射函数,所以如果它返回一个值,那么整个表达式将返回由这些返回值定义的数组。但使用这个当然是可选的。例如,您可以创建一个数组,其中包含如下节点的文本内容:

代码语言:javascript
运行
复制
texts = Array.from(nodeList, node => node.textContent)

警告

如果您在回调中使用Array.from,并且节点列表是一个活动节点列表(请参阅NodeList),并且在回调中对节点列表进行了变异,那么这可能会产生意想不到的效果。在这种情况下,使用两个步骤方法,首先将节点列表转换为数组,然后对其条目执行回调。

票数 4
EN

Stack Overflow用户

发布于 2017-04-17 10:50:44

代码语言:javascript
运行
复制
var array=Array.from(nodeList);
//after some time
var array2=Array.from(nodeList);

如果比较这些数组,就会发现它们不一定相等。NodeLists反映了DOM的变化,当您复制它们时,数组将保持静态。如果你想要这种行为/不在乎,你会没事的。然而,Array.from是非常新的,因此它不能被旧的浏览器理解,所以它不应该在生产环境中使用(如果您不使用像Babel这样的东西)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43449971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档