【发布时间】:2016-07-06 05:02:34
【问题描述】:
解释为什么+[] == 0 在 Javascript 中给出输出 'true'?
请检查示例。
+[] == 0 ? alert(true) : alert(false);
并且还要检查。
'1+[+[]]' 输出'10'
【问题讨论】:
标签: javascript
解释为什么+[] == 0 在 Javascript 中给出输出 'true'?
请检查示例。
+[] == 0 ? alert(true) : alert(false);
并且还要检查。
'1+[+[]]' 输出'10'
【问题讨论】:
标签: javascript
会像下面这样评估,
1 : +[] == 0 --> +"" == 0
运营商 + 拥有 highest priority 而不是 ==,因此将首先对其进行评估。因此,在将数组转换为数字期间,ToPrimitive() 函数将通过将其作为参数传递来调用。由于[] 是一个object,它将返回"" 字符串
2 : +"" == 0 --> 0 == 0
一个空字符串将被转换为0。众所周知,非空字符串将转换为NaN。
3 : 0 == 0 --> true
最后根据abstract equality comparison algorithm,当比较相同类型的两个操作数时,不会进行进一步的评估,它将直接检查其是否相等并返回结果。
在你的第二种情况下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'另请阅读this article 了解加法运算符。
【讨论】: