2016-09-28 244 views
0

有一個聲明+[[]] + [[]]。控制檯返回「0」(一個字符串)。 當一個語句是+[[]]控制檯返回0(一個數字)。 如果+0+0爲0,第一個如何返回字符串?爲什麼`+ [[]] + [[]]`返回一個字符串?

+2

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

+0

javascript很奇怪。這會回答你的問題嗎? :) –

+0

@pro:從哪裏來的字符串? –

回答

3

的語法樹在這裏看起來像

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

也就是說,二進制+的左側操作數是一元+操作的結果,和右側的操作數的結果[[]]表達式。

左側是一個數字,根據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"

1

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

Unary +運算符將其操作數轉換爲數字類型。一元 - 運算符將其操作數轉換爲數字類型,然後否定它。

你的表達是obviosly +[[]][[]] 其中「[[]]」被轉換爲一個空字符串由於二進制+運算符。

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

相關問題