2015-08-20 71 views
1

我使用创建数组:2种不同长度的数组?

var links = document.getElementsByTagName('a'); 

如果我做的:

console.log(links.length); 

我得到:2

但是,如果我这样做:

console.log(links); 

我得到一个看起来像这样的对象:

[a.elm-skip-link,a]

当我展开这个对象时,其中有33个链接对象。

为什么链接对象的长度会改变?如果它是一个数组,它不会保留创建时的大小吗?

这里是我正在使用的代码:

var links = document.getElementsByTagName('a'); 
console.log('links:'); 
console.log(links); 
console.log('length:'); 
console.log(links.length); 

BTW:我想选择不会有一个“id”或“类”属性页面上的特定链接,这样我需要获取所有链接,然后循环查找具有我要查找的“标题”属性的链接。但是,当我试图循环访问这个“链接”对象时,循环只运行两次,尽管页面上有33个链接。

+0

首先,这不是一个数组,它是[节点列表](https://developer.mozilla.org/en-US/docs/Web/API/NodeList) – WhiteHat

+1

只是一个注释:有一个*文档。链接*集合即页面中的所有链接。一个元素不一定是链接。此外,[* getElementsByTagName *](http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-A6C9094)会返回一个[* NodeList *](http:// www。 w3.org/TR/DOM-Level-3-Core/core.html#ID-536297177),而不是数组。 – RobG

+0

由于HTMLCollection(我不知道)的行为,此问题不是console.log同步或异步问题的重复。我知道console.log不是异步的,但我不知道HTMLCollection对象的特殊行为。 –

回答

3

getElementsByTagName实际上并没有返回一个数组,它返回的是一个类似于对象的数组,它是活的HTMLCollection

现实的意思是,任何时候DOM被修改,集合(或返回的数组像对象)被修改。所以,如果我不得不冒险猜测,我会假设你的DOM没有完全加载,当你运行第一次调用这个函数。它返回的集合仅包含两个元素,并且它们被发送到控制台。后来,当您在该集合上展开时,DOM已被修改,并且您会看到最终的33个元素。

+0

我不知道实时HTMLCollection对象。这是问题。我在document.ready间隔中封装了我的调用,并且它正常工作。谢谢! –