许多JavaScript库(jQuery,Zepto)似乎正在对querySelectorAll(),getElementsByTag或ClassName结果调用Array.prototype.slice.call ...
通过阅读关于StackOverflow的许多类似问题/答案,我确实了解到它可以将NodeList结果转换为真实的Array,以便您可以在NodeLists上不可用的结果上调用Array方法(切片,pop),但是我不怎么做不明白为什么?通常,您实际上并不需要在DOM节点列表上进行切片/弹出操作,而NodeLists已经具有length属性,因此它们仍然可以遍历。
一些答案似乎暗示这是因为NodeList指向活动的DOM对象。但是再次,如果将其转换为数组,则引用仍指向活动的DOM节点-那么有什么区别?
还是我完全想念的其他东西?它是否可以帮助Zepto / jQuery以某种方式缓存DOM元素的多个属性调用? (尽管我真的不知道怎么做,因为它们仍然是实时的DOM引用)
最佳答案
通常,您实际上并不需要在DOM节点列表上进行切片/弹出
实际上,您这样做了,这就是为什么这样做是必要的。
例如,.eq()
,.first()
等如何工作。 jQuery对象在数组中包含NodeList
的副本,然后各个方法获取该数组的切片。同样,您不能将.add()
节点连接到NodeList
。
此外,即使随后从DOM中删除其中的元素,这些数组也必须保持有效。数组中的引用仍然有效,可用于将那些元素重新插入DOM中。
如果您只是活着的NodeList
,则将元素从DOM中删除后,它们会自动从列表中消失,除非您另外引用它们,否则它们将永远丢失。
关于javascript - 为什么Array.prototype.slice.call(nodeList)用于DOM元素?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13295361/