許多數組方法是通用設計。這意味着它們的內部實現不依賴於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