我之所以问这个问题,是因为我正在考虑在我拥有的这个庞大的多维数组中存储一堆DOM节点。
成本:占用内存中的空间。问题是空间有多大,这取决于我是获得引用还是实际的DOM节点。
好处: 1)它将使我的代码变得更简单。2)我可以避免遍历,而只是从数组中引用DOM节点。
有什么想法?
发布于 2015-07-20 16:13:04
简言之:
JavaScript:
HTMLCollection和NodeList包含对DOM节点的引用。它们似乎不是很大的物体。


活的与非活的
来自MDN
在某些情况下,NodeList是一个活动集合,这意味着DOM中的更改反映在集合中。例如,Node.childNodes是实时的: var parent = document.getElementById('parent');var child_nodes = parent.childNodes;console.log(child_nodes.length);//假设"2“child_nodes console.log(child_nodes.length);//应输出"3” 在其他情况下,NodeList是一个静态集合,这意味着DOM中的任何后续更改都不会影响集合的内容。document.querySelectorAll返回一个静态NodeList。

jQuery
来自learn.jquery.com
jQuery对象是围绕一个或多个DOM元素的类似数组的包装器。要获得对实际DOM元素(而不是jQuery对象)的引用,您有两个选项。第一个(也是最快的)方法是使用数组表示法: $( "#foo“)0;//等效于document.getElementById( "foo”) 第二个方法是使用.get()函数: $( "#foo“).get( 0 );//与上述相同,只是速度较慢。 您还可以不使用任何参数调用.get()来检索真正的DOM元素数组。
发布于 2015-07-20 14:25:48
这个答案是错误的,请看下面的评论。
Document.getElementById()和依赖它的方法或包装器返回引用。
Document.querySelector()也是如此。
所有这些都来自于DOM4规范,它指出(强调我的):
collection是一个表示DOM节点列表的对象。collection可以是live,也可以是static。除非另有说明,集合必须是live**.**
从编程的角度来看,这个概念很容易理解,您浪费更少的内存,并且不用花时间复制东西,从而导致更快的执行。
然而,对于Document.querySelectorAll(),我们有一个有趣的案例:
由
NodeList方法返回的querySelectorAll()对象必须是static。
这意味着,正如MDN所说,那个Document.querySelectorAll()
返回所有匹配元素节点的非活动
NodeList。
这意味着返回的集合不是对原始节点的一组引用,而是对在执行查询时表示节点的一组节点的引用。这意味着必须创建所有匹配节点的副本,并且不再使用对活动节点的引用。
发布于 2015-07-20 14:28:38
来自jQuery网站:
…jQuery() --也可以写成$() --在DOM中搜索与提供的选择器匹配的任何元素,并创建引用这些元素的新jQuery对象
jQuery文档
https://stackoverflow.com/questions/31519004
复制相似问题