我之前使用for...in循环来记录数值,然后我发现for...in循环中的变量(在这种情况下是i)是一个字符串。
for (var i in ['a', 'b', 'c']) {
console.log(i, typeof i)
}
我的问题是,规范中是否有关于这个的内容?如果没有,为什么它是一个字符串?
我之前使用for...in循环来记录数值,然后我发现for...in循环中的变量(在这种情况下是i)是一个字符串。
for (var i in ['a', 'b', 'c']) {
console.log(i, typeof i)
}
for..in 调用 EnumerateObjectProperties,它会:
返回一个迭代器对象 (26.1.1.2),其 next 方法迭代 O 的所有可枚举属性的字符串键。迭代器对象不能直接被 ECMAScript 代码访问。枚举属性的机制和顺序没有明确定义,但必须符合以下规则。
所有对象属性都是字符串或符号。即使是数组上可以像使用数字一样设置和检索的属性,在检索时也被解释为字符串(并在通过 for..in
或其他属性枚举方法如 Object.keys
或 Object.getOwnPropertyNames
检索时作为字符串检索)。您还可以查看 [[OwnPropertyKeys]]()
,其中提到:
返回列表中每个元素的类型为 String 或 Symbol。
例如,在 Array.prototype.push
中,您可以看到:
5. For each element E of items, do:
a. Perform ? Set(O, ! ToString(len), E, true).
isPropertyKey
- 如果参数的类型为字符串,则返回true。如果参数的类型为符号,则返回true。否则返回false)。Symbol
键不被for..in
枚举的原因是它早于Symbol
出现,还是有其他原因?我曾经知道... - Aluan Haddadfor..in
迭代,而2013年编写的代码不理解符号,它可能会抛出错误,因此也许省略了符号以避免破坏向后兼容性。 - CertainPerformance
i
是你放进去的东西!?如果你有一个字符串数组,那么i
将被分配一个字符串。如果你使用for (var i in [1, 2, 3])
,那么i
将成为一个整数。 - Dominique Fortini
不是数组,它将被赋值为数组的一个元素。 - Dominique Fortini
将被分配一个字符串” - 为什么? - shreyasm-devfor (var i in [1,2,3]) {}
相当于var arr = [1,2,3]; for(var z = 0; z < arr.length; ++z) {var i = arr[z]; ... }
。 - Dominique Fortin