就在我以爲我瞭解一些有關的JavaScript類型轉換,我偶然發現這一點:爲什麼一個空數組類型轉換爲零? + []
+[]; // 0
Number([]); // 0
我首先想到的是,我應該得到NaN的,就像如果我嘗試將一個空對象對數:
+{}; // NaN
Number({}); // NaN
我一直在尋找有關這一段時間沒有任何成功...
有人能解釋我爲什麼它被轉換爲0,而不是喃?
這是行爲標準嗎?
謝謝。
就在我以爲我瞭解一些有關的JavaScript類型轉換,我偶然發現這一點:爲什麼一個空數組類型轉換爲零? + []
+[]; // 0
Number([]); // 0
我首先想到的是,我應該得到NaN的,就像如果我嘗試將一個空對象對數:
+{}; // NaN
Number({}); // NaN
我一直在尋找有關這一段時間沒有任何成功...
有人能解釋我爲什麼它被轉換爲0,而不是喃?
這是行爲標準嗎?
謝謝。
在簡短的,有兩個關鍵點:
toString
方法返回空字符串。Number
constructor called as a function(例如+"" === 0;
)將空字符串強制爲歸零。例如,我們可以使用限定toString
方法,並返回一個空字符串的對象有一個等效的結果:
var obj = { toString: function() { return "";} };
+obj; // 0
Number(obj); // 0
這個行爲是完全標準。
現在長回答:
兩者的unary plus operator和Number
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。
+1數組實際上是JavaScript中的對象類型,所以它有一個toString()方法。 – BoltClock 2010-07-22 07:03:16