为什么“[] + {} === {} + []”评估为“true”?

时间:2016-12-13 15:02:34

标签: javascript

如果您打开JS控制台并输入[] + {} === {} + [],它会告诉您这是真的。

我不明白为什么会这样。我试图查看它是如何解析的。

对于[] + {}+这里是加法运算符,因为操作数都是文字。 LHS不会通过.valueOf()生成一个数字,因此它会在两个操作数上使用.toString()执行字符串连接,从而为"" + "[object Object]"

对于{} + []{}是一个空代码块并被“忽略”,此处+运算符被解析为一元加运算符,它将其操作数转换为数字。转换为数字的空数组变为0

所以这似乎是"[object Object]" === 0肯定应该是假的?。

身份运算符检查两个操作数是否相等而没有类型转换。我看不出这是怎么回事。我错过了这个故事的哪个部分?

编辑:

我看是否输入({} + [])它将其解析为空对象,使RHS等于“[object Object]”。我查了一下,( )是分组运算符。那么也许这与此有关呢?

这不是What is the explanation for these bizarre JavaScript behaviours mentioned in the 'Wat' talk for CodeMash 2012?的重复。回答要点1 === 2不应该是真的。

2 个答案:

答案 0 :(得分:46)

第二点in this magnificent answer解释了当你"加在一起时会发生什么?数组和对象。



var result = [] + {};

console.log(result);
console.log(typeof result);




你得到的是字符串 [object Object],因为每个参数都被转换为字符串。对于数组,会导致在其上调用.join(),从而导致空字符串。对于Objects,它会生成字符串"[object Object]" - 将它们添加在一起会留下第二个字符串。

在比较的两边也是如此 - 在右边,顺序不同但无关紧要。结果将与答案中的第3点相同,因为差异在于{} + []位于行的开头,因此{}被解释为空块。在这种情况下,它(正确地)将被解释为普通对象符号)。将执行相同的转换逻辑,它将生成与以前相同的字符串:"[object Object]"

因此,最后,您要比较返回"[object Object]" === "[object Object]"的{​​{1}}。

请注意true 会产生相同的效果 - 再次,由于链接答案的第3点 - 第一个{} + [] === [] + {}将被解释为空块,所以左侧变为{},将数组转换为数字,因此比较结果为+[]然而如果您在Chrome开发工具中测试此表达式,您确实会获得false。这是因为Chrome will auto-wrap your expression in parentheses强制将初始true解释为对象。在Firefox或节点REPL或其他人中检查{}应该产生"正确" {} + [] === [] + {}

答案 1 :(得分:7)



    var array = ['test1', 'test2', 'test3']
    var emptyObject = {}

    console.log(typeof(array+emptyObject));
    console.log(array+emptyObject);
    console.log(emptyObject+array);
    console.log(array+emptyObject === emptyObject+array);

    var array = [];
    var emptyObject = {}

    console.log(typeof(array+emptyObject));
    console.log(array+emptyObject);
    console.log(emptyObject+array);
    console.log(array+emptyObject === emptyObject+array);

    var array = ['firstArrayElement', 'secondArrayElement'];
    var object = {a:1, b:2}
    
    console.log(typeof(array+object));
    console.log(array+object);
    console.log(object+array);
    console.log(array+object === object+array);

    console.log(['a','b']+['c','d']);




将空数组转换为字符串时,您将收到空字符串。

当您将对象({})转换为字符串时,您将始终收到字符串:" [object Object]"。

没有为数组和对象定义Plus运算符所以当你使用plus运算符时,JS总是将数组和对象转换为字符串。