關於javascript中的toString()和valueOf()兩種方法,其實早在開始讀紅寶書(JavaScript高級程序設計)的時候已經有點困惑了,怎麼搞出來這兩個這麼類似的東西,重點是不少時候它們獲得的結果都是同樣的,雖然以後不了了之以爲對應用沒什麼大影響就無論了,直到如今開始寫博客的時候纔回頭看看這個問題。javascript
好了,開始正文了。java
toString() 和 valueOf() 是對象的兩個方法,你在瀏覽器後臺輸入Object.protototype就能夠看到了它們是其中的兩個。git
先說一下兩個東西的用途:github
toString( ):返回對象的字符串表示。數組
valueOf( ):返回對象的字符串、數值或布爾值表示。瀏覽器
好了,寫幾個例子就明白返回結果了(undefined 和 null 的值就不舉例了,由於它們都沒有這兩個方法,因此確定會報錯的):設計
//先看看toString()方法的結果 var a = 3; var b = '3'; var c = true; var d = {test:'123',example:123} var e = function(){console.log('example');} var f = ['test','example']; a.toString();// "3" b.toString();// "3" c.toString();// "true" d.toString();// "[object Object]" e.toString();// "function (){console.log('example');}" f.toString();// "test,example"
//再看看valueOf()方法的結果 var a = 3; var b = '3'; var c = true; var d = {test:'123',example:123} var e = function(){console.log('example');} var f = ['test','example']; a.valueOf();// 3 b.valueOf();// "3" c.valueOf();// true d.valueOf();// {test:'123',example:123} e.valueOf();// function(){console.log('example');} f.valueOf();// ['test','example']
很清楚了,toString( )就是將其餘東西用字符串表示,比較特殊的地方就是,表示對象的時候,變成"[object Object]",表示數組的時候,就變成數組內容以逗號鏈接的字符串,至關於Array.join(',')。 而valueOf( )就返回它自身了。code
至於迷惑的地方,就在於它們在何時被調用,舉個例子:對象
var a = '3'; console.log(+a);// 3
固然了,打印結果是數字3(不是字符串‘3’),由於一元加操做符接在字符串前面就將其轉換爲數字了(字符串轉化爲數字的一種方式,至關於Number( )方法),可是若是它應用在對象上,過程是怎樣的呢,再舉例子:ip
//例子一 var example = {test:'123'}; console.log(+example);// NaN //例子二 同時改寫 toString 和 valueOf 方法 var example = { toString:function(){ return '23'; }, valueOf:function(){ return '32'; } }; console.log(+example);// 32 //例子三 只改寫 toString 方法 var example = { toString:function(){ return '23'; } }; console.log(+example);// 23
經過例子一和例子二的比較,咱們能夠知道,一元加操做符在操做對象的時候,會先調用對象的valueOf方法來轉換,最後再用Number( )方法轉換,而經過例子二和例子三的比較,咱們能夠知道,若是隻改寫了toString方法,對象則會調用toString方法,證實valueOf的優先級比toString高。上面例子是單獨對對象上使用一元加操做符,可是,若是是字符串加對象呢?
console.log('test'+{}); //"test[object Object]"
這個很明顯,對象和字符串相加,確定轉換爲字符串啊,因此調用了對象的toString方法,變爲[object Object]了。
好了,若是是alert呢?
//例子一 var example = {test:'123'}; alert(example);// "[object Object]" //例子二 同時改寫 toString 和 valueOf 方法 var example = { toString:function(){ return '23'; }, valueOf:function(){ return '32'; } }; alert(example);// "23" //例子三 只改寫 valueOf 方法 var example = { valueOf:function(){ return '32'; } }; alert(example);// "[object Object]"
雖然上面結果我用雙引號了,可是你知道彈窗不會將字符串的雙引號表示出來的。經過上面幾個例子,咱們就知道了,alert它對待對象,就和字符串和對象相加同樣,就是調用它的toString( )方法,和valueOf方法無關。
好了,總結一下,通常用操做符單獨對對象進行轉換的時候,若是對象存在valueOf或toString改寫的話,就先調用改寫的方法,valueOf更高級,若是沒有被改寫,則直接調用對象原型的valueOf方法。若是是彈窗的話,直接調用toString方法。至於其餘狀況,待續……