为什么[] + {} === {} + []为真?

Mar*_*oxx 36 javascript

如果你打开你的JS控制台并输入[] + {} === {} + []它就会告诉你它是真的.

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

对于[] + {}+这里是加法运算符作为操作数都是文字.LHS不会产生数字,.valueOf()所以它.toString()在两个操作数上使用""+ 给出字符串连接"[object Object]"

对于{} + []{}是一个空的代码块,并"忽略",该+运营商在这里被解析为一元加运算,它的操作数转换为数字.转换为数字的空数组变为0

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

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

编辑:

我看看你是否输入({} + [])它将它解析为一个空对象,使RHS等于"[object Object]".我查了一下,( )是分组操作员.那么也许这与此有关?

与CodeMash 2012的"Wat"谈话中提到的这些奇怪的JavaScript行为什么解释?.回答要点1 === 2不应该是真的.

VLA*_*LAZ 47

这个宏伟答案中的第二点解释了当您将数组和对象"加在一起"时会发生什么.

var result = [] + {};

console.log(result);
console.log(typeof result);
Run Code Online (Sandbox Code Playgroud)

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

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

所以,最后,你要比较"[object Object]" === "[object Object]"哪些回报true.

注意,{} + [] === [] + {}产生相同的-再次,由于连接的答案的点3 -第一{}将被解释为一个空块时,这样的左手侧变为+[]其中阵列转换成一个数,该比较的,因此其结果将是false.但是,如果您在Chrome开发工具中测试此表达式,您确实会得到true.这是因为Chrome会在括号中自动换行表达式,这会强制将初始{}值解释为对象.检查{} + [] === [] + {}Firefox或节点REPL或其他应该产生"正确" false.


Krz*_*ski 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']);
Run Code Online (Sandbox Code Playgroud)

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

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

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