2011-08-08 35 views
1

這使 「的翻譯:」:valueOf不工作時,我做警報(OBJ)?

<!doctype html> 
<script> 
var a={}; 
a.valueOf=function(){ 
    return "asd"; 
}; 
alert(a); 
</script> 

但是這給 「ASD」:

<!doctype html> 
<script> 
var a={}; 
a.valueOf=function(){ 
    return "asd"; 
}; 
alert(""+a); 
</script> 

我能理解爲什麼我在第二個例子中得到 「ASD」。但在第一個例子中,我不應該讓「asd」,因爲我通過警報函數(基本上最終調用該值 - 反正)對象?

回答

1

當你使用+運算符,JavaScript使用valueOf,否則當對象需要String時,JavaScript使用toString()。在內部,也許在Object.prototype.valueOf中,它被設計成與toString()相同。因此,如果僅定義toString(),而不定義valueOf(),則JavaScript將使用toString()作爲'+'(因爲內部valueOf調用toString)以及需要String的上下文中。但是,如果你定義了valueOf,那麼在有'+'(或者 - 或者任何其他算術運算符)的地方使用。但是當它期望一個字符串時(如警報的情況)它不會被使用。它會調用toString()。

0

「a」是一個對象,以便警告的情況下,一個是顯示對象,通過執行警報(「」 + a)您是強制「」被當作字符串

+0

但是這不是真的,當我強迫它是一個字符串它不是valueOf運行,但toString? – Pacerier

0

「」 +一個返回一個字符串類型。使用typeof()來檢查它。

http://jsfiddle.net/zYs73/

<div id='t'></div> 

<script> 
    var a={}; 
    a.valueOf=function(){ 
     return "asd"; 
    }; 
    alert(a); 
    document.getElementById('t').innerHTML += "<br/>" + typeof(a); 

    var b={}; 
    b.valueOf=function(){ 
     return "asd"; 
    }; 
    alert(""+b); 
    document.getElementById('t').innerHTML += "<br/>" + typeof(""+b); 
</script> 
+0

我的意思是我知道,但爲什麼不通過警報函數將對象轉換爲字符串? – Pacerier

0

做「」 +您要提醒的字符串,並與+您要投在字符串的值,然後加入到空字符串「」

+0

我的意思是我知道,但爲什麼不通過警報函數將對象轉換爲字符串? – Pacerier

+0

警報期望字符串,這是JavaScript的性質,它不會將對象轉換爲可用於警報。 – Rasel