【问题标题】:Explain why '+[] == 0' output 'true' in Javascript? [duplicate]解释为什么 '+[] == 0' 在 Javascript 中输出 'true'? [复制]
【发布时间】:2016-07-06 05:02:34
【问题描述】:

解释为什么+[] == 0 在 Javascript 中给出输出 'true'

请检查示例。

+[] == 0 ? alert(true) : alert(false);

并且还要检查。 '1+[+[]]' 输出'10'

【问题讨论】:

标签: javascript


【解决方案1】:

会像下面这样评估,

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"

【讨论】:

    【解决方案2】:

    JavaScript 以这种方式计算 +[] == 0

    1. + []: + 运算符尝试将操作数 [] 转换为原始值。
    2. + [][] 使用toString() 方法转换为字符串,这是[].join(',') 的别名。结果是一个空字符串''
    3. + '':空字符串转换为数字:Number('')->0
    4. + 0 变为 0
    5. 最后评估比较:+[] == 0 -> 0 == 0 -> true

    '1+[+[]]'评价:

    1. 1 + [ +[] ](将[] 转换为原语:''
    2. 1 + [ + '' ](将''转换为数字:0
    3. 1 + [ + 0 ]+ 00
    4. 1 + [ 0 ](加法运算符强制将[0] 转换为原始值:[0].toString() -> [0].join(',') -> '0'
    5. 1 + '0'(因为第二个操作数'0'是字符串,所以将第一个数字1也转换为字符串:'1'
    6. '1' + '0'(简单的字符串连接)
    7. '10'

    另请阅读this article 了解加法运算符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-07
      • 2015-07-17
      相关资源
      最近更新 更多