本篇存在的初始原因是因为一场有对有错的争论开始的, 关于一场获取子节点返回的值的类型的争论~ ~ ~
开始的时候我认为是一个array集合, 却发现array的对象方法都不能使用, 后来看到他的类型发现他并不是一个数组~
为什么NodeList不是数组:
开始的时候我log()出来是[xx, xx, xx]这种形式的, 于是就以为是array类型的,但是在看返回结果的原型的时候发现array的特有方法它却没有,果然还是太年轻, 太傻太天真~~
Array 的原型大概是这样的
concat : function concat()
constructor : function Array()
copyWithin : function copyWithin()
entries : function entries()
every : function every()
fill : function fill()
filter : function filter()
find : function find()
findIndex : function findIndex()
forEach : function forEach()
includes : function includes()
indexOf : function indexOf()
join : function join()
keys : function keys()
lastIndexOf : function lastIndexOf()
length : 0
map : function map()
pop : function pop()
push : function push()
reduce : function reduce()
reduceRight : function reduceRight()
reverse : function reverse()
shift : function shift()
slice : function slice()
some : function some()
sort : function sort()
splice : function splice()
toLocaleString : function toLocaleString()
toString : function toString()
unshift : function unshift()
Symbol(Symbol.iterator) : function values()
Symbol(Symbol.unscopables) : ObjectNodeList 的原型大概是这样的
entries : function entries()
forEach : function forEach()
item : function item()
keys : function keys()
length : (…)
values : function values()
constructor : function NodeList()
Symbol(Symbol.iterator) : function values()
Symbol(Symbol.toStringTag) : “NodeList”
get length : function ()
不难看出, NodeList的方法还是挺少的.
遍历NodeList
如果我们想要遍历一个NodeList对象的话, 可以循环它的长度, 再根据长度去取值.1
2
3for(var i = 0; i< nodeList.length; i++){
......
}
不能使用for…in或者for each …in 因为他会去遍历当前对象的方法
如下:1
2
3
4
5
6
7
8
9
10
11
12<ul id=”ul-test”>
<li class=”li-1”></li>
<li id=”li-2”></li>
<li></li>
<li></li>
<li></li>
</ul>
var result = ‘’;
for(var i in document.querySelectorAll(“#ul-test li”)) {
result = result + i + ‘, ‘;
}
console.log(result);
结果是 0, 1, 2, 3, 4, length, item, keys, values, entries, forEach
出现NodeList对象的场景.
使用如下方法后返回的子节点列表~ ~1
2
3
4Node.childNodes
document.querySelectorAll()
document.getElementsByName()
...
NodeList对象的方法:
length: 返回节点个数,
item: 返回指定节点个数
动态\非动态:
Node.childNodes返回的NodeList结果
一个动态集合, 当节点发生变化时nodeList也会随即发生改变
document.querySelectorAll返回的NodeList结果
多数情况下, NodeList对象是一个动态集合(即文档中的节点树发生变化,那么已经存在的NodeList对象也可能会变化)
如Node.childNodes, document.getElementsByName()是动态的
然而在某些情况下NodeList是静态的(即文档中节点树发生变化, 已经存在的NodeList对象也不会改变)
如document.querySelectorAll 是静态的
像数组一样使用
如果在某些场景下需要像使用数组的一样去使用NodeList
使用call
1 | var arr = Array.prototype.slice.call(NodeList);// IE 问题 |
arr既是一个array类型的数组, 此时就可以使用array的方法
es6
1 | var arr = Array.from(NodeList) |