2014-10-26 57 views
3

今天剛剛偶然發現了這一點,我無法找到規範中定義的行爲。爲什麼追加一個字符串到Date調用toString()而不是valueOf()?

追加一個JavaScript字符串對象(即new Object() + "whatever")通常觸發對象上valueOf()一個電話,但顯然,Date對象是一個例外:new Date() + "..."電話toString()上的日期來代替。

function test(constructor) 
 
{ 
 
    var name = constructor.name || /^\s*function ([\w\$]+)/.exec(constructor.toString())[1]; 
 
    var obj = new constructor(); 
 
    obj.toString = function() { return name + ' : toString()'; } 
 
    obj.valueOf = function() { return name + ' : valueOf()'; } 
 
    document.body.appendChild(document.createElement('DIV')).textContent = obj + ''; 
 
} 
 

 
test(Array); 
 
test(Boolean); 
 
test(Date); 
 
test(Function); 
 
test(Number); 
 
test(Object); 
 
test(RegExp); 
 
test(String);

問:什麼是關於此Date對象有什麼不同?

+0

你是怎麼做到這個代碼片段的東西? – 2014-10-26 17:12:17

+0

@超鏈接:查看編輯面板以在下面插入答案。有一個按鈕。 – 2014-10-26 17:16:20

+0

看起來你可以從這裏獲得一個[snippet console](http://meta.stackexchange.com/questions/239706/add-a-console-to-stack-snippets)。 – Scimonster 2014-10-26 17:19:55

回答

4

當您在對象上調用addition operator並且對象被轉換爲to a primitive時,將調用該對象的內部[[DefaultValue]] method。該方法採用類型提示,該提示確定是應該先評估toString還是應該先評估valueOf

如果提示是「字符串」,則在valueOf之前查找toString。如果「數字」通過,反之亦然。

然而(重點煤礦):

ö[[DefaultValue]]內部方法被調用,沒有暗示,則其行爲好像該提示是數量,除非Ô爲Date對象(見15.9.6),在這種情況下,它的行爲就像提示是字符串

這也是在addition operator section指出:

注1:沒有跡象是在調用提供給ToPrimitive在步驟5個6,所有本地的ECMAScript對象除了Date對象處理沒有暗示就好像提示號碼一樣;日期對象處理缺少提示,就像提供了提示字符串一樣。主機對象可能會以其他方式處理缺少提示。

相關問題