如果您打开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不应该是真的。
答案 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总是将数组和对象转换为字符串。