JavaScript数组对象自增行为解析:为何变NaN且循环仅执行一次
问题拆解:数组自增后变成NaN的原因
咱们先把你的代码贴出来,方便对照分析:
var myArray = [0,1,2,3,4,5,6,7,8,9]; for(i=0; i < myArray.length; myArray++){ console.log("Loop iteration step : "+i); } console.log("After array increment : " + myArray);
一步步看发生了什么
初始状态:
myArray是包含10个元素的数组,myArray.length等于10- 循环变量
i初始化为0
第一次循环执行:
- 条件判断
i < myArray.length→0 < 10,结果为true,进入循环体,打印出Loop iteration step : 0 - 关键步骤:执行
myArray++- 自增操作符
++只能作用于原始值,所以JS会先把数组对象转换为原始值(这个过程叫ToPrimitive转换) - 数组的ToPrimitive转换规则:先尝试调用
valueOf()(返回数组本身,还是对象),失败后调用toString(),得到字符串"0,1,2,3,4,5,6,7,8,9" - 接下来要对这个字符串做自增操作,JS会尝试把字符串转为数字:
Number("0,1,2,3,4,5,6,7,8,9")→ 因为字符串里有逗号,无法解析为有效数字,结果是NaN - 最后执行
++NaN,根据JS规则,对NaN做任何算术操作结果还是NaN,所以myArray现在被赋值为NaN
- 自增操作符
- 条件判断
循环条件再次检查:
- 现在
myArray是NaN(原始值,不再是数组),访问myArray.length时,JS会把NaN包装成Number对象,但Number对象没有length属性,所以myArray.length等于undefined - 条件判断
i < myArray.length→0 < undefined,JS会把undefined转为数字NaN,而任何值和NaN比较的结果都是false,所以循环直接终止
- 现在
最终输出:
- 此时
myArray已经是NaN,所以最后一行打印After array increment : NaN
- 此时
总结
核心原因是对数组执行++操作时,数组被转换为无法解析为数字的字符串,最终得到NaN;而NaN没有length属性,导致循环条件不满足,只执行了一次循环。
内容的提问来源于stack exchange,提问作者Ishan Thilina Somasiri
相关产品推荐
相关产品推荐

