2013-05-15 31 views
1

我不想問爲什麼[] + []會給你空字符串,等等,因爲我們不能改變它。原因僅僅是語言的設計。添加數組和對象時JS控制檯的不一致性

我的問題是關於下面的不一致,注意到在Chrome和FF Firebug的JS控制檯:

{} + []; // outputs 0 
console.log({} + []); // outputs [object Object] 
var c = {} + []; 
console.log(c); // outputs [object Object] 

據我所知,表達式返回一個值,這就是你在控制檯輸出中看到。但爲什麼當這個返回值改變時,當分配給一個變量或輸出使用console.log()

這是否意味着提到的控制檯是越野車?

是否有更好的解釋,然後說明這是它的方式

+1

爲什麼不去掉其中的每一個地方給*同*輸出的情況下?這只是混亂。 –

+1

[CodeMash 2012'Wat講座中提到的這些奇怪JavaScript行爲的解釋是什麼?](http://stackoverflow.com/questions/9032856/what-is-the-explanation-for-these -bizarre-javascript-behaviours-mentioned-the-the) – Bergi

+0

@Bergi你是對的 - 他們觸及這個同樣的問題。感謝您發佈此鏈接! – Karol

回答

4

在第一個例子中,它僅僅是一個塊,所以它等同於運行該代碼(在陣列字面前面的加將其轉換爲一個數字):

{}; 
+[]; // 0 

然而,在console.log代碼,它被認爲是一個表達式,所以它實際上是一個對象文字。你只能將表達式傳遞給函數,所以這是一樣的。

function a(b) {return b;} 
a({}+[]); // "[object Object]" 

加法運算將它們轉換爲字符串,所以這就是爲什麼你會得到"[object Object]"

+0

而不是那個'identity'函數一個簡單的分組操作符就足夠了:'({} + [])';-) – Bergi

+0

@Bergi:它是要證明當傳遞參數給一個函數時,它們是作爲表達式傳遞 - 就像'console.log()'示例一樣。 –

3

它與console.log()無關。

{} + []{}被解析爲一個塊,而在後面兩種情況下,它被解析爲一個對象作爲表達式的一部分。

這是由事實證明,console.log()或不,var a = {} + []設置a到一個對象。

你可以通過簡單地增加括號(這使得它的表達)進一步簡化第二代兩種情況:

({} + []) //=> "[object Object]" 
+0

這段代碼最令我信服:'({} + [])'。這確實是一個塊。謝謝! – Karol