JavaScript中for in循环无赋值操作为何会初始化空数组?
问题代码现象解释
首先给出你运行的代码段:
var a=[],i=0,o={x:1,y:2,z:3} for(a[i++] in o); console.log(a);
核心原因解释
你认为数组为空的误解,本质是搞错了for...in循环的表达式执行逻辑:
for...in的标准语法为for (左值表达式 in 遍历对象) 循环体,其中左值表达式会在每一轮迭代前都重新计算,用来接收当前轮次遍历到的可枚举属性名,并不是只在循环初始化时执行一次。- 你写的循环末尾的分号,仅代表循环体是空语句,不会终止迭代流程本身,对象的可枚举属性还是会被正常遍历。
- 左值
a[i++]的执行逻辑:每次迭代时先返回当前i的值作为数组下标,随后i自增1,再把本次遍历到的属性名赋值给a[对应下标],所以数组会被自动填充内容。
关于仅输出两个元素的说明
正常情况下用对象字面量声明的o的x/y/z三个属性都是可枚举的,运行上述代码会输出["x", "y", "z"]。你运行得到只有两个元素的结果,大概率是测试环境的上下文里o的z属性被设置为了不可枚举,或者存在其他代码修改了o的属性列表。
内容的提问来源于stack exchange,提问作者rprabhu1982
相关产品推荐
相关产品推荐

