解释为什么+[] == 0
在Javascript中输出' true' ?
请检查示例。
+[] == 0 ? alert(true) : alert(false);

并检查。
'1+[+[]]'
输出' 10'
答案 0 :(得分:8)
将按如下方式进行评估,
1: +[] == 0
- > +"" == 0
运营商+
的{{3}}大于==
,因此将首先对其进行评估。因此,在将数组转换为数字时,将通过将其作为参数传递来调用highest priority函数。由于[]
是object
,因此会返回""
字符串
2: +"" == 0
- > 0 == 0
空字符串将转换为0
。如我们所知,非空字符串将转换为NaN
。
3: 0 == 0
- > true
最后根据ToPrimitive()
,当两个相同类型的操作数进行比较时,不会进行进一步的评估,它将直接检查其相等性并返回结果。
在你的第二个案例1+[+[]]
中,评估将会发生,如
1: 1+[+[]]
- ( +[]
将首先转换为原语,因为[]
它是一个对象)
2: 1+[+""]
( abstract equality comparison algorithm将为""
)
3: 1+[0]
(将空字符串转换为数字时会产生 0
4: 1+"0"
( toPrimitive([])
将为"0"
)
5: "10"
答案 1 :(得分:5)
JavaScript以这种方式评估+[] == 0
:
+ []
:+
运算符尝试将操作数[]
转换为原始值。 + []
:使用[]
方法将toString()
转换为字符串,该方法是[].join(',')
的别名。结果是一个空字符串''
+ ''
:空字符串转换为数字:Number('')
- > 0
+ 0
变为0
+[] == 0
- > 0 == 0
- > true
'1+[+[]]'
评估:
1 + [ +[] ]
(将[]
转换为基元:''
)1 + [ + '' ]
(将''
转换为数字:0
)1 + [ + 0 ]
(+ 0
是0
)1 + [ 0 ]
(加法运算符强制将[0]
转换为原始值:[0].toString()
- > [0].join(',')
- > '0'
)1 + '0'
(因为第二个操作数'0'
是一个字符串,所以将第一个数字1
转换为字符串:'1'
)'1' + '0'
(简单字符串连接)'10'
另请阅读有关添加运算符的this article。