【问题标题】:Why is key a string in for ... in为什么在 for ... in 中键入一个字符串
【发布时间】:2019-01-28 11:44:08
【问题描述】:

我正在用 javascript 编写一个简单的 for...in 循环,想知道为什么 key 是字符串而不是数字?

为什么会这样,我可以将其更改为数字吗?

var array = ["a", "b", "c"];

for (var key in array) {
   console.log(typeof key); //string
   console.log(key + 1); //expected output : 01, 11, 21...
}

【问题讨论】:

  • 这可能是因为 for y in x 将 x 视为一个对象,因此您可以遍历其属性
  • 如果您想访问数组元素,则使用带有数组的 foreach 有点昂贵,因为您必须将 key 解析为 int,最好对对象使用 foreach 循环(@987654325 @) 而不是数组 ([])。数组的标准循环是for(let i=..; i < ....; i++) {}array.forEach(function(val, i) { })

标签: javascript for-loop


【解决方案1】:

这是一个字符串,因为 JavaScript aren't really arrays at all¹ 中的标准数组是具有数组条目属性的对象,而对象属性名称(键)是字符串、符号或(很快)私有名称。

您不能在for-in 中默认将其设为数字​​,但您可以将其转换为数字,或使用其他形式,例如标准forforEach 调用:

for (var key = 0; key < array.length; ++k) {
    // ...
}
// ..or
array.forEach((entry, key) => {
    // ...
});

使用for-in 循环遍历数组几乎总是一种反模式。请参阅my answer here,详细了解循环数组的各种选项。


¹这是我贫血的小博客上的一篇文章。

【讨论】:

  • 感谢您的快速回答,以及您博客上的精彩小解释 :)。
【解决方案2】:

Objects and properties

请注意,方括号符号中的所有键都转换为字符串类型,因为 JavaScript 中的对象只能将字符串类型作为键类型

【讨论】:

  • 多年来一直如此。 ES2015 引入了以符号命名的属性,ES2019 或 ES2020 也将引入私有名称。我已经在链接的文章中修正了上面的引用。
【解决方案3】:

对象属性名称​​总是字符串。

如果需要数字,请使用+parseIntJSON.parse 或任何其他标准方法将字符串转换为数字。

var array = ["a", "b", "c"];

for (var key in array) {
  console.log(+key + 1);
}

【讨论】:

  • “对象属性名称始终是字符串。” 多年来一直如此...... :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-24
  • 1970-01-01
  • 2015-07-20
  • 2019-03-06
  • 1970-01-01
  • 2015-11-02
  • 2020-04-13
相关资源
最近更新 更多