首页 > 解决方案 > 为什么 for...in 循环中的变量是字符串?

问题描述

我正在使用 for...in 循环来记录值,我注意到 for...in 循环中的变量(i在本例中为 )是一个字符串。

for (var i in ['a', 'b', 'c']) {
  console.log(i, typeof i)
}

我搜索了ECMAScript 规范,在标题为“for-in、for-of 和 for-await-of 语句”的部分中,以获取有关此的任何信息,但找不到任何有关此的信息。

我的问题是,规范中有什么关于这个的吗,如果没有,为什么它是一个字符串?

标签: javascriptloopsfor-in-looplanguage-specifications

解决方案


for..in调用EnumerateObjectProperties,它执行以下操作:

返回一个迭代器对象(26.1.1.2),它的下一个方法迭代O的可枚举属性的所有字符串值键。ECMAScript代码永远不能直接访问迭代器对象。枚举属性的机制和顺序没有指定,但必须符合下面指定的规则。

所有对象属性都是字符串或符号。甚至可以for..in数字一样设置和检索的数组上的属性也被解释为字符串(并在通过或其他属性枚举方法(如Object.keysor )检索时作为字符串检索Object.getOwnPropertyNames)。您还可以看到[[OwnPropertyKeys]](),它说:

返回列表的每个元素的类型是字符串或符号。

例如,使用Array.prototype.push您可以看到

5. For each element E of items, do:
  a. Perform ? Set(O, ! ToString(len), E, true).

属性赋值总是导致设置一个字符串或符号的属性。(参见isPropertyKey-如果 Type(argument) 是 String,则返回 true。如果 Type(argument) 是 Symbol,则返回 true。否则返回 false。


推荐阅读