關於javascript中的toString()和valueOf()

關於javascript中的toString()和valueOf()

我GitHub上的菜鳥倉庫地址: 點擊跳轉查看其餘相關文章
文章在個人博客上的地址: 點擊跳轉

        關於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方法。至於其餘狀況,待續……

相關文章
相關標籤/搜索