【问题标题】:Strange behavior of "for ... in ..." construct [duplicate]“for ... in ...”构造的奇怪行为[重复]
【发布时间】:2023-03-21 04:53:01
【问题描述】:

我有一个带有 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”是什么意思呢?

【问题讨论】:

  • 不要使用for ... in ...遍历数组,for ... in ...遍历对象属性,而不是索引,所以你会得到一个数组的所有属性:stackoverflow.com/questions/500504/…
  • 像瘟疫一样避免for...in
  • @Shan ...除非您想遍历对象的属性...
  • 虽然 getElementsByTagName 不返回“真实”数组 - 对于大多数人来说它仍然是一个数组。因此,请参阅 cmets 中列出的问题,以获取有关为什么使用 for in 迭代数组是一个坏主意的更多信息。

标签: javascript html for-loop


【解决方案1】:

document.getElementById('myDiv').getElementsByTagName('input') 不返回真正的数组。它是一个array like 对象。所以像 forEachmap 这样的函数不存在。 for ... in ... 的行为很奇怪。

您可以使用slice 将其转换为真正的数组:

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

【讨论】:

  • 我用旧的 for (i=0; i
【解决方案2】:

http://www.w3schools.com/jsref/coll_form_elements.asp 如此链接所示,您正在输出输入元素的属性和方法。

【讨论】:

  • 我不明白这个问题与选择元素有什么关系?
  • 好吧,我也不知道,但他想知道这三件事:item namedItem length
  • 编辑后的答案更中肯,所以我将删除我的反对票。
【解决方案3】:

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

for...in 语句遍历对象的可枚举属性。

for...inHTMLCollection

【讨论】:

  • 你能扩展一下吗?到目前为止,它只是链接,所以 -1。
  • 现在它只是在欺骗另一个答案......
猜你喜欢
  • 2017-12-24
  • 1970-01-01
  • 2013-05-05
  • 2019-03-09
  • 2019-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多