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
方法。