Javascript 奇怪的行为;对于在……中”;建造

Javascript 奇怪的行为;对于在……中”;建造,javascript,html,for-loop,Javascript,Html,For Loop,我有一个有4个复选框的div。然后运行以下javascript: var elements = document.getElementById('myDiv').getElementsByTagName('input'); alert(elements.length); // output: 4 for (element in elements) { alert(element); } alert('finish!'); 在4次警报之后,我将按顺序收到以下警报: 0 1 2 3 ite

我有一个有4个复选框的div。然后运行以下javascript:

var elements = document.getElementById('myDiv').getElementsByTagName('input');
alert(elements.length); // output: 4
for (element in elements) {
    alert(element);
}
alert('finish!');
在4次警报之后,我将按顺序收到以下警报:

0
1
2
3
item
namedItem
length
finish!

从0到3的数字是元素的索引。但是这里的“item”、“namedItem”和“length”是什么意思呢?

元素在代码中不是javascript数组,而是类似数组的对象。它实际上是HTMLCollection,它具有一些额外的可枚举属性

for…in语句迭代对象的可枚举属性


请参阅和

文档。getElementById('myDiv')。getElementsByTagName('input')
不返回真实数组。它是一个类似于
对象的
数组。所以像
forEach
map
这样的函数不存在于它上面。和<代码>用于。。。在…
中,它有一种奇怪的行为

您可以使用
切片
将其转换为真实数组:

var elements = Array.prototype.slice.call(document.getElementById('myDiv').getElementsByTagName('input'));

如本链接所示,您正在输出输入元素的属性和方法。

不要将
用于。。。在…
中循环数组,
用于。。。在…
中迭代对象属性,而不是索引,这样您将获得数组的所有属性:这将有助于:避免像瘟疫一样在…中迭代对象属性…除非您想迭代对象属性…尽管getElementsByTagName不返回“真实”数组-对于大多数情况,它仍然是一个数组。因此,请参考注释中列出的问题,以了解更多有关为什么使用for-in迭代数组是个坏主意的信息。您能稍微扩展一下吗?现在它只是链接,所以-1.现在它只是复制另一个答案是错误的…我使用了旧的for(I=0;我不明白这个问题与select元素有什么关系?我是网友,但他想知道的三件事:item namedItem length编辑后的答案更切题,所以我将删除我的否决票。