【问题标题】:Iterating through NodeList遍历 NodeList
【发布时间】:2020-04-05 01:04:21
【问题描述】:

我正在寻找一种面向未来的方式来遍历 NodeList(即来自element.querySelectorAll(selector))以及跨浏览器兼容。以前我一直在使用 ES6 的传播功能,但是 IE 不支持传播,所以我使用了一个 shim 来代替它。我觉得这有点矫枉过正和低效。然后我遇到了黑客Array.prototype.forEach.call。它有效,但对我来说看起来很臭。

迭代 NodeList 的最佳方法是什么?

我偏爱向后兼容性和干净的代码,但如果您的答案也适用于以下任何其他标准,那将不胜感激。

  1. 可读性
  2. 面向未来
  3. 速度

我查看了JavaScript iterate through NodeList,其中介绍了几种方法。但是,没有可读性、兼容性等方面的问题。只要它有效。

我遇到的几种方法是:

const elems = document.querySelectorAll('img');

[].forEach.call(elems, function (o) { console.log(o) });

[...elems].foreach(function (o) { console.log(o) });

for (var i = 0; i < elems.length; i++) {
    console.log(elems[i]);
}

for (var i = elems.length - 1; i >= 0; i--) {
    console.log(elems[i]);
}

// User-defined
var forEach = function (array, callback, scope) {
    for (var i = 0; i < array.length; i++) {
        callback.call(scope, i, array[i]);
    }
};
forEach(elems, function (index, value) {
    console.log(index, value);
});

【问题讨论】:

  • 1.大多数是可读的。这取决于您对什么感到满意。最简单的只是一个for 循环,但您也可以使用[].forEach.call,我认为这是惯用的。 2. 我不希望将来删除其中的任何,所以我不确定为什么你希望它比现在已经工作的更“面向未来”。如果它适用于 IE 和现代浏览器,它会在几年后运行。 3. 速度可能不是问题。我怀疑任何常见的方法都会使您的应用程序陷入停顿。简单的迭代很少成为瓶颈——性能问题通常在其他地方。

标签: javascript cross-browser nodelist


【解决方案1】:

我推荐使用 MDN 的 Array.from polyfill

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from#Polyfill

Array.from(nodeList).forEach(node => {})

【讨论】:

  • 或者只是[].prototype.slice.call(nodeList) 不需要一个完整的polyfill,旧的可靠的转换类似数组的方法仍然有效。我想除非你打算更多地使用Array.from,包括其他类型的调用。
  • 我个人这样做是为了便于阅读。其他人查看我的代码,[].prototype.slice.callArray.from() imo 相比有点晦涩难懂。见鬼,即使只是我在看自己的代码!
  • 现在已经很流行了。当然,局外人可能会感到困惑,但是……我猜,他们对 JS 来说是完全的新手。我不确定为不熟悉该语言的人编写代码是一个好方法,因为它会让你远离很多应该常见但你不能使用的东西,因为你可能会混淆其他人。我们是否应该禁止使用document.querySelector,因为现在有人可能知道 CSS 选择器是什么?
  • .slice 用于复制数组:arr2 = arr1.slice()。这是一个长期存在的复制机制。 call 是您调用具有新目标的方法的方式。所以,它把自己描述为“以此为目标制作一个数组副本”
  • 不,我知道它的全部作用,这是一个反问,用来描述它的作用并不明显。我只是说完整的字符串[].prototype.slice.call 字面上没有一个词来描述它的作用。 “使用这个作为目标制作一个数组副本”——这些词都不在[].prototype.slice.call
猜你喜欢
  • 2019-11-21
  • 2018-09-02
  • 1970-01-01
  • 1970-01-01
  • 2010-11-25
  • 2013-01-12
  • 2013-11-04
  • 1970-01-01
  • 2020-10-01
相关资源
最近更新 更多