poa*_*oas 4 javascript foreach
考虑以下代码:
var els = document.querySelectorAll('.myClassName');
Array.prototype.forEach.call(els, function(el) {
console.log(el.id);
});
Run Code Online (Sandbox Code Playgroud)
varels包含一个节点列表,它不是一个数组,并且forEach只适用于数组,对吗?上面的代码实际上是一个黑客吗?
...而 forEach 仅适用于数组吗?
不。Array.prototype.forEach是故意通用的,它可以应用于任何类似数组的对象。从规范:
注2:该
forEach功能是有意通用的;它不要求它的 this 值是一个 Array 对象。因此,它可以转移到其他类型的对象以用作方法。
规范清楚地列出了在处理过程中将使用的属性和/或方法forEach;只要this在调用期间通过引用的对象具有那些,forEach就可以在该对象上使用。这就是为什么使用forEach.call这样的原理:call在函数对象的方法(forEach就是一个函数对象)调用使用你给第一个参数的函数call作为this在通话过程中,并沿以下参数作为参数传递给原有的功能传递。所以Array.prototype.forEach.call(x, y)调用forEach与this设置为x与第一参数设置为y。forEach不关心 的类型this,只关心它具有规范的算法中描述的相关属性和方法。
大多数Array.prototype方法都是这样,实际上其他标准原型上的许多其他方法也是如此。
旁注:最近NodeList返回的 by在现代浏览器上querySelectorAll变得可迭代,这意味着: 1. 它适用于 ES2015+ 的for-of,以及 2. 它forEach现在具有本机。(在现代浏览器上。)
| 归档时间: |
|
| 查看次数: |
633 次 |
| 最近记录: |