javascript - 为什么 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 语句”的部分中,以获取有关此的任何信息,但找不到任何有关此的信息。
我的问题是,规范中有什么关于这个的吗,如果没有,为什么它是一个字符串?
解决方案
for..in调用EnumerateObjectProperties,它执行以下操作:
返回一个迭代器对象(26.1.1.2),它的下一个方法迭代O的可枚举属性的所有字符串值键。ECMAScript代码永远不能直接访问迭代器对象。枚举属性的机制和顺序没有指定,但必须符合下面指定的规则。
所有对象属性都是字符串或符号。甚至可以像for..in
数字一样设置和检索的数组上的属性也被解释为字符串(并在通过或其他属性枚举方法(如Object.keys
or )检索时作为字符串检索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。
推荐阅读
- c++ - 如何调用随机函数
- c# - 关于值类型成员内存位置的困惑?
- python - 如何将日期变量传递给 MySQL 请求?
- azure-devops - 您如何公开测试和代码覆盖率
- gimp - 在 GIMP (DBP) 中,如何将照片批量调整到一定宽度并保持纵横比?
- flutter - 如何在 Flutter 中 3 秒后自动拍照?
- algorithm - 16 位乘 16 位 2 的补码整数除法器是否有任何“简单”的快速除法算法?
- java - 如何使用 Spring Boot 验证 REST API 中的金融交易?
- java - 通过java取消隐藏文本文件
- mysql - 将静态查询从列结果转换为行结果