2012-02-15 62 views
9

添加兩個空數組: [] + [] 會生成一個空字符串。爲什麼?爲什麼在JavaScript中添加兩個空數組的結果是字符串?

和這樣的奇怪功能的集合上的任何鏈接?

+0

最近的一次會議討論了一個屏幕錄像,它探討了Ruby和Javascript的奇怪行爲,但據我瞭解,Javascript特性是特定於實現的。 – 2012-02-15 20:39:15

+5

我曾經寫過這部分較大的答案[這裏](http://stackoverflow.com/questions/7202157/can-you-explain-why-10/7202287#7202287)。 – pimvdb 2012-02-15 20:40:49

+0

@BrianDriscoll這實際上是我問這個問題的原因。 – 2012-02-15 20:41:53

回答

12

+運算符僅用於整數和字符串。當你在另一個類型上使用它時,JavaScript會嘗試轉換類型(首先是字符串,然後是int)。

將數組轉換爲字符串時,它們會以逗號分隔的字符串形式輸出。所以,[] + [] =>"" + "" =>"

又如:[1,2] + [3,4] =>"1,2" + "3,4" =>"1,23,4"

相關規格:http://es5.github.com/#x11.6.1

+2

很好的答案。鏈接到規範的相關部分不會受到傷害。 「first to string」的重要性可以像這樣突出顯示:'[3] + [3] //「33」' – 2012-02-15 20:44:05

+0

@GGG:我試圖在spec中找到它:-P – 2012-02-15 20:45:12

+0

@GGG:Found它http://es5.github.com/#x11.6.1 – 2012-02-15 20:46:31

0

猜測,但我猜測JavaScript試圖在那裏連接,而不是additon。

3

由於+操作串行化兩個陣列並連接兩個結果。

function() { return this.join(','); } 

的兩個陣列是空的,因此通過toString返回的字符串也爲空和兩個空字符串做出一個空字符串,以及:序列化經由Array.prototype.toString方法,其基本上沒有這個完成。

0

+運算符會嘗試將數組轉換爲字符串。如果要連接兩個或更多數組,請使用concat命令。

1

在JavaScript中,有兩種類型的值;元,其中包括nullundefinedbooleanstringnumber,一切是object包括array

當添加的東西,JavaScript的轉換價值爲數字,字符串或原語。內部JavaScript,使用toPrimitive方法將變量轉換爲基元。

以下爲toPrimitive

toPrimitive(input, preferedType); 

簽名隨着:

[] + [] 

JS轉換[]到原始的,首先嚐試valueOf()它返回數組:

var arr = []; 
arr.valueOf() === arr // true 

作爲該結果不是原始的,toString()被調用並返回空字符串(字符串是原始的)。因此,[] + []的結果是兩個空字符串的串聯。

相關問題