2010-07-22 71 views
13

就在我以爲我瞭解一些有關的JavaScript類型轉換,我偶然發現這一點:爲什麼一個空數組類型轉換爲零? + []

+[]; // 0 
Number([]); // 0 

我首先想到的是,我應該得到NaN的,就像如果我嘗試將一個空對象對數:

+{}; // NaN 
Number({}); // NaN 

我一直在尋找有關這一段時間沒有任何成功...

有人能解釋我爲什麼它被轉換爲0,而不是喃?

這是行爲標準嗎?

謝謝。

回答

19

在簡短的,有兩個關鍵點:

例如,我們可以使用限定toString方法,並返回一個空字符串的對象有一個等效的結果:

var obj = { toString: function() { return "";} }; 
+obj; // 0 
Number(obj); // 0 

這個行爲是完全標準。

現在長回答:

兩者的unary plus operatorNumber constructor called as a function內部使用ToNumber抽象操作。

ToNumber將使用兩個更多的內部操作,ToPrimitive[[DefaultValue]]

ToNumber操作被應用於對象,在你的例子這樣的空數組,它調用ToPrimitive操作,以獲得一個代表原始值,並再次使用該值調用ToNumber [1]

ToPrimitive操作接收兩個參數,一個Value(它是您的數組對象)和一個提示類型,在本例中爲「Number」,因爲我們要進行數值轉換。

ToPrimitive調用[[DefaultValue]]內部方法,也帶有「Number」提示類型。

現在,由於我們使用的「數字」的提示類型,內部方法現在將嘗試首先調用對象的valueOf方法。

陣列對象沒有特定valueOf方法,該方法是一個從Object.prototype.valueOf繼承的,此方法僅返回到對象本身的引用。

由於valueOf方法沒有在原始值導致,現在toString方法被調用,並且它產生一個空字符串(其是原始值),則操作ToNumber將嘗試做與字符串數字轉換,它最終以0[1]結束。

但是現在你可能會想,爲什麼空串強制爲零?

+""; // 0 

有一個完整的語法,用於當ToNumber internal operation is applied to a String type,則StringNumericLiteral生產。

它有一個NumericLiteral之間的一些差異,並且這些差異之一是:

甲StringNumericLiteral是空的或僅包含空白被轉換爲0。

+2

+1數組實際上是JavaScript中的對象類型,所以它有一個toString()方法。 – BoltClock 2010-07-22 07:03:16

相關問題