为什么 for...in 循环中的变量是字符串?

Gal*_*105 4 javascript loops language-specifications for-in-loop

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

for (var i in ['a', 'b', 'c']) {
  console.log(i, typeof i)
}
Run Code Online (Sandbox Code Playgroud)

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

我的问题是,规范中是否有关于此的任何内容,如果没有,为什么它是一个字符串?

Cer*_*nce 6

for..in调用EnumerateObjectProperties,它执行:

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

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

返回的 List 的每个元素的 Type 是 String 或 Symbol。

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

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

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

  • 这听起来很可能 - 如果一个对象使用 2013 年编写的不理解符号的“for..in”代码进行迭代,它可能会抛出错误,因此也许会省略符号,以免破坏向后兼容性。 (2认同)