许多数组方法是通用设计。这意味着它们的内部实现不依赖于this
为Array
实例。基本上,这种实现只需要这个对象具有数字索引和length
属性。这些对象被称为“类似数组的对象”。
有许多符合此要求的物体。例如您观察到的NodeList为document.getElementById('menu').querySelectorAll
。这是类似数组的对象,因为您可以通过索引访问各个节点,并且此类节点列表具有length
属性。
任何字符串也是类似数组的对象。例如,字符串“hello world”。你可以访问字符“w”str[t]
。并且str.length
等于11.
数值索引和length
的要求允许方法实现遍历集合中的所有单个元素,而无需知道该集合实际上是什么。
这也使人们有可能使用不同对象的通用方法:
const obj = {0: 'one', 1: 'two', length: 2};
Array.prototype.forEach.call(obj, (el, index) => {
console.log(`${index}: ${el}`)
})
或者,对于这种“借用”其他原型方法最常见的用途是用在非阵列方法阵列,通常DOM元素:
const items = document.querySelector('ul > li')
const ids = [].map.call(items, li => li.id)
这里我应该注意,来自ES2015规范的spread operator使得这种借用方法不太需要。
你想在这里完成什么? – hackerrdave
你知道NodeList有一个forEach方法吗? – evolutionxbox
[ECMAScript 5.1,15.4.4.18](http://www.ecma-international。org/ecma-262/5.1 /#sec-15.4.4.18):“_ forEach函数是有意为通用的;它不要求它的这个值是一个Array对象,因此它可以被转移到其他类型的对象中以用作一个方法,forEach函数是否可以成功应用于主机对象,取决于实现._“ – Andreas