JavaScript中为何[]==0成立而[1,2]==2不成立?
为什么JavaScript中
[] == 0为true但[1,2] == 2为false? 这个问题问得特别到位!你观察到的现象其实是JavaScript**抽象相等运算符(==)**的隐式类型转换规则在起作用,比“和数组长度比较”的推测要更严谨,咱们一步步拆解清楚:
首先先把你的代码和结果再明确一下:
a=[1,2]; b=[]; if(b==0){ console.log('0') } if(a==2){ console.log('2') } if([]==0){ console.log('3') }
运行后输出是 0 3,核心疑问是:为什么空数组和0相等,但[1,2]和2不相等?
先搞懂==的核心转换规则
当==两边的操作数类型不同时,JavaScript会按照一套固定的规则对其中一方或双方进行类型转换,再比较。针对对象(包括数组)和原始值(比如数字)比较的场景,规则是:
对象会先执行
ToPrimitive抽象操作,尝试转换为原始值。对于数组来说,这个过程会先调用valueOf()(返回数组本身,还是对象类型),如果转换后依然不是原始值,就会调用toString(),把数组转为字符串形式。
接下来咱们逐个分析你的条件:
1. b == 0([] == 0)的情况
- 左边是空数组
[],是对象类型;右边是数字0,原始值。 - 数组执行
ToPrimitive:先调用valueOf()返回[](还是对象),于是继续调用toString(),空数组的toString()结果是空字符串""。 - 现在变成
"" == 0:字符串和数字比较,会把字符串转为数字,空字符串转数字的结果是0。 - 最后比较
0 == 0,结果为true,所以这个条件成立,输出0和3。
2. a == 2([1,2] == 2)的情况
- 左边是数组
[1,2],同样先执行ToPrimitive:valueOf()返回[1,2](对象),继续调用toString(),得到字符串"1,2"。 - 现在变成
"1,2" == 2:字符串转数字时,"1,2"不是有效的纯数字字符串,转换结果是NaN(非数字)。 - JavaScript里有个特殊规则:
NaN和任何值(包括它自己)比较的结果都是false,所以NaN == 2的结果是false,这个条件不成立,自然不会输出2。
纠正之前的推测:不是直接和数组长度比较
你之前猜测“数组和自身长度比较”其实是个巧合——空数组的长度是0,刚好和转换后的数字结果一致,但本质逻辑不是这样。比如:
[2] == 2会返回true:因为[2].toString()是"2",转数字是2,和右边相等;但数组长度是1,这时候就和长度没关系了。["2"] == 2也会返回true,同样和长度无关。[2,3] == 2返回false:因为[2,3].toString()是"2,3",转数字是NaN,和2不相等,而数组长度是2,这时候也和长度不一致。
所以核心还是==的类型转换流程,而不是直接取数组长度比较。
内容的提问来源于stack exchange,提问作者guru
相关产品推荐
相关产品推荐

