为什么`+ [[]] + [[]]`返回一个字符串?

问题描述:

有一个声明+[[]] + [[]]。控制台返回“0”(一个字符串)。 当一个语句是+[[]]控制台返回0(一个数字)。 如果+0+0为0,第一个如何返回字符串?为什么`+ [[]] + [[]]`返回一个字符串?

+2

第一个是一个_unary_加,第二个一_binary_之一。不要混淆这些。 – Xufox

+0

javascript很奇怪。这会回答你的问题吗? :) –

+0

@pro:从哪里来的字符串? –

的语法树在这里看起来像

  + 
     /\ 
     / \ 
     + [ ] 
     |  | 
     |  | 
     [ ] [ ] 
     | 
     | 
     [ ] 

也就是说,二进制+的左侧操作数是一元+操作的结果,和右侧的操作数的结果[[]]表达式。

左侧是一个数字,根据runtime semantics of the unary + operator运算符调用ToNumber

右侧是一个对象,该对象在evaluation of the + operator的第9步中通过ToPrimitive(通过调用对象的toString方法)投射到字符串基元。对于数组,toString返回通过逗号连接的数组内容的字符串化形式,在这种情况下,它是空字符串。

您可以通过覆盖某个对象toString,看到改变的结果验证这一点:

var a = []; 
a.toString = function() { return "foo"; }; 
console.log(0 + a); 

这将产生"0foo"

+[[]] - 有一元操作符。

Unary +运算符将其操作数转换为数字类型。一元 - 运算符将其操作数转换为数字类型,然后否定它。

你的表达是obviosly +[[]][[]] 其中“[[]]”被转换为一个空字符串由于二进制+运算符。

,因此是0 + '' = '0'