为什么`+ [[]] + [[]]`返回一个字符串?
问题描述:
有一个声明+[[]] + [[]]
。控制台返回“0”(一个字符串)。 当一个语句是+[[]]
控制台返回0(一个数字)。 如果+0+0
为0,第一个如何返回字符串?为什么`+ [[]] + [[]]`返回一个字符串?
答
的语法树在这里看起来像
+
/\
/ \
+ [ ]
| |
| |
[ ] [ ]
|
|
[ ]
也就是说,二进制+
的左侧操作数是一元+
操作的结果,和右侧的操作数的结果[[]]
表达式。
左侧是一个数字,根据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'
第一个是一个_unary_加,第二个一_binary_之一。不要混淆这些。 – Xufox
javascript很奇怪。这会回答你的问题吗? :) –
@pro:从哪里来的字符串? –