浏览器是否为每次循环实例化一个新的 nodeList 对象,或者浏览器是否每次都简单地引用一个生成的列表?
您可以通过测试两个调用是否getElementsByTagName
返回相同的对象来轻松测试:
document.getElementsByTagName('div') === document.getElementsByTagName('div')
// true
似乎用相同的参数调用这个方法确实返回了相同的NodeList
对象(至少在 Firefox 和 Chrome 中)。它不会每次都生成一个新列表。
所以你可能认为在循环中一遍又一遍地调用它不会有什么不同。但是,正如我所见,将列表存储在变量中的原因有多种:
我一直想知道将 nodeList 对象存储到变量并在需要时引用它是否更好。
是的。您甚至不必getElementsByTagName
在添加或删除元素时再次调用,因为返回NodeList
的是live,即对文档所做的任何更改都会直接反映在列表中,而无需显式更新。
某些操作,例如访问length
列表的 ,也会触发重新评估。因此,除了将列表存储在变量中之外,您可能还希望缓存长度:
var nodes = object.getElementsByTagName(tagName);
for (var index = 0, l = nodes.length; index < l; index++) {
nodes[index].property = value;
}
这可能非常方便或非常混乱,具体取决于您的需要。如果您只想要调用函数时存在的节点列表,则必须将 NodeList 转换为数组:
var nodes = Array.prototype.slice.call(object.getElementsByTagName(tagName), 0);