解释为什么'+ [] == 0'在Javascript中输出'true'?
这个问题在这里已经有了答案:
它将被评估如下,
1: +[] == 0
- > +"" == 0
Operator +
优先级高于==
因此它将首先被评估。 因此,在将数组转换为数字时, ToPrimitive()
函数将通过将其作为参数传递来调用。 由于[]
是一个object
,它将返回""
字符串
2: +"" == 0
- > 0 == 0
一个空字符串将被转换为0
。 众所周知,非空字符串将被转换为NaN
。
3: 0 == 0
- > true
最后,根据抽象等式比较算法,当两个相同类型的操作数进行比较时,不会进行进一步的评估,它将直接检查其相等性并返回结果。
而在第二种情况下, 1+[+[]]
,评估会发生,
1: 1+[+[]]
- ( +[]
将首先转换为图元,因为[]
它是一个对象)
2: 1+[+""]
( toPrimitive([])
将为""
)
3: 1+[0]
(将空字符串转换为数字时会生成0
)
4: 1+"0"
( toPrimitive([0])
将为"0"
)
5: "10"
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'
请阅读关于加法运算符的这篇文章。
链接地址: http://www.djcxy.com/p/48045.html