为什么在JavaScript中[-[]]和[+[]]的运行结果都为[0]?
JavaScript 中
[-[]] 与 [+[]] 均返回[0]的技术原理 这个现象本质是JavaScript隐式类型转换规则和一元运算符的执行逻辑共同作用的结果,我们可以逐层拆解表达式的计算过程:
第一步:拆解表达式结构
两个表达式都可以拆成两部分:先计算括号内的一元运算结果,再将结果作为唯一元素存入数组:
[+[]]= 先算+[]得到值A,再返回[A][-[]]= 先算-[]得到值B,再返回[B]
第二步:空数组[]的原始值转换规则
当一元运算符作用于引用类型(数组属于引用类型)时,会先触发ToPrimitive隐式转换把引用类型转成原始值:
- 优先调用数组的
valueOf()方法,返回的是数组本身,仍然是引用类型,不符合原始值要求 - 继续调用数组的
toString()方法,空数组调用toString()会返回空字符串''
第三步:一元加+的运算逻辑
一元加运算符的作用是把操作数强制转换为数字类型:
- 空字符串
''转换为数字的结果是0 - 因此
+[]的最终结果是0,存入数组后就是[0]
第四步:一元减-的运算逻辑
一元减运算符会先把操作数强制转换为数字类型,再对结果取负:
- 空数组转数字后同样得到
0 - 对
0取负得到-0,而JavaScript中-0和+0在常规数值运算、打印输出场景下完全等价,数组中存入-0后打印也会显示为0
- 因此
[-[]]的最终结果也是[0]
测试验证代码
console.log([+[]]) // 输出 [0] console.log([-[]]) // 输出 [0]
内容的提问来源于stack exchange,提问作者Donald Shahini
相关产品推荐
相关产品推荐

