今日在博客园看了一篇<javascript:像操作Array一样操作NodeList>,发现有些问题,后来查阅了W3C标准,发现其混淆了DOM中的NodeList和javascript的Array。
NodeList和Array是不同的东西。NodeList是DOM中定义的一个辅助对象,而Array是程序语言定义的一个数据结构。
NodeList是DOM中定义一个对象,在W3C文档中可以看到:
The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live.
接口定义为:
1 interface NodeList {
2 Node item(in unsigned long index);
3 readonly attribute unsigned long length;
4 };
2 Node item(in unsigned long index);
3 readonly attribute unsigned long length;
4 };
从上面的描述可以看到,W3C规定了NodeList的接口,如何实现依赖于各浏览器。现在各浏览器都实现了DOM,只是实现的Level不一样(DOM目前是Level3,Level3只有少部分浏览器支持其中的一部分功能)。
所以,在实际编程中,不要把NodeList和Array对象混淆了。
比如,在web编程中,可能我们会这么用:
1 var divDoms = document.getElementsTagName("div");
2 for(var index=0; i<divDom.length;i++)
3 // do something
4
2 for(var index=0; i<divDom.length;i++)
3 // do something
4
当得到divDoms对象后,其上的操作就向Array一样,误以为其为Array,而实际是不同的东西。
另外,脚本语言并不能直接操纵DOM,而需要通过BOM(Brower Object Module),才能与浏览器窗口进行交互。DOM是有一些列Node构成的,而BOM则是有一些列Object对象构成。