querySelectorAll和getElementsByTagName獲取元素的區別
1、document.querySelectorAll()
根據選擇器獲取所有匹配到的元素
返回的是NodeList
,NodeList
不是一個數組,是一個類似數組的對象(Like Array Object)。雖然 NodeList
不是一個數組,但是可以使用 forEach()
來迭代。它有length屬性
2、document.getElementsByTagName()
根據標籤名獲取所有匹配到的元素
返回的是一個HTMLCollection
,HTMLCollection
不是一個數組,是一個類似數組的對象(Like Array Object),它有length
屬性,不可以forEach()
來迭代
爲什麼 NodeList 不是數組?
摘自
MDN
:https://developer.mozilla.org/zh-CN/docs/Web/API/NodeList
NodeList
對象在某些方面和數組非常相似,看上去可以直接使用從 Array.prototype
上繼承的方法。然而,除了 forEach
方法,NodeList
沒有這些類似數組的方法。
JavaScript 的繼承機制是基於原型的。數組元素之所以有一些數組方法(比如 forEach
和 map
),是因爲它的原型鏈上有這些方法,如下:
myArray --> Array.prototype --> Object.prototype --> null
(想要獲取一個對象的原型鏈,可以連續地調用 Object.getPrototypeOf
,直到原型鏈盡頭)。
forEach
,map
這些方式其實是 Array.prototype
這個對象的方法。
和數組不一樣的是,NodeList
的原型鏈是這樣的:
myNodeList --> NodeList.prototype --> Object.prototype --> null
NodeList的原型上除了類似數組的 forEach
方法之外,還有 item
,entries
,keys
和 values
方法。