西西軟件園多重安全檢測下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁編程開發(fā)javascript|JQuery → Javascript中valueOf與toString方法分析

Javascript中valueOf與toString方法分析

相關(guān)軟件相關(guān)文章發(fā)表評論 來源:本站整理時間:2010/10/2 23:11:19字體大。A-A+

作者:佚名點擊:338次評論:0次標(biāo)簽: valueOf

  • 類型:音頻處理大。1M語言:中文 評分:5.1
  • 標(biāo)簽:
立即下載
最后群里討論一些怪題,有高手就想歪腦想hack這兩個東西了,雖然最后失敗了,但這精神是非常值得鼓勵的。于是決定寫一篇文章專門來介紹它們。

基本上,所有JS數(shù)據(jù)類型都擁有這兩個方法,null除外。它們倆解決javascript值運算與顯示的問題。

先看一例:

var aaa = {

i: 10,

valueOf: function() { return this.i+30; },

toString: function() { return this.valueOf()+10; }

}

alert(aaa > 20); // true

alert(+aaa); // 40

alert(aaa); // 50

var aaa = {
i: 10,
valueOf: function() { return this.i+30; },
toString: function() { return this.valueOf()+10; }
}
alert(aaa > 20); // true
alert(+aaa); // 40
alert(aaa); // 50


之所以有這樣的結(jié)果,因為它們偷偷地調(diào)用valueOf或toString方法。但如何區(qū)分什么情況下是調(diào)用了哪個方法呢,我們可以通過另一個方法測試一下。由于用到console.log,請在裝有firebug的FF中實驗!

var bbb = {

i: 10,

toString: function() {

console.log('toString');

return this.i;

},

valueOf: function() {

console.log('valueOf');

return this.i;

}

}



alert(bbb);// 10 toString

alert(+bbb); // 10 valueOf

alert(''+bbb); // 10 valueOf

alert(String(bbb)); // 10 toString

alert(Number(bbb)); // 10 valueOf

alert(bbb == '10'); // true valueOf

alert(bbb === '10'); // false

var bbb = {
i: 10,
toString: function() {
console.log('toString');
return this.i;
},
valueOf: function() {
console.log('valueOf');
return this.i;
}
}

alert(bbb);// 10 toString
alert(+bbb); // 10 valueOf
alert(''+bbb); // 10 valueOf
alert(String(bbb)); // 10 toString
alert(Number(bbb)); // 10 valueOf
alert(bbb == '10'); // true valueOf
alert(bbb === '10'); // false

乍一看結(jié)果,大抵給人的感覺是,如果轉(zhuǎn)換為字符串時調(diào)用toString方法,如果是轉(zhuǎn)換為數(shù)值時則調(diào)用valueOf方法,但其中有兩個很不和諧。一個是alert(''+bbb),字符串合拼應(yīng)該是調(diào)用toString方法……另一個我們暫時可以理解為===操作符不進(jìn)行隱式轉(zhuǎn)換,因此不調(diào)用它們。為了追究真相,我們需要更嚴(yán)謹(jǐn)?shù)膶嶒灐?br />
var aa = {

i: 10,

toString: function() {

console.log('toString');

return this.i;

}

}



alert(aa);// 10 toString

alert(+aa); // 10 toString

alert(''+aa); // 10 toString

alert(String(aa)); // 10 toString

alert(Number(aa)); // 10 toString

alert(aa == '10'); // true toString

var aa = {
i: 10,
toString: function() {
console.log('toString');
return this.i;
}
}

alert(aa);// 10 toString
alert(+aa); // 10 toString
alert(''+aa); // 10 toString
alert(String(aa)); // 10 toString
alert(Number(aa)); // 10 toString
alert(aa == '10'); // true toString



再看valueOf。

var bb = {

i: 10,

valueOf: function() {

console.log('valueOf');

return this.i;

}

}



alert(bb);// [object Object]

alert(+bb); // 10 valueOf

alert(''+bb); // 10 valueOf

alert(String(bb)); // [object Object]

alert(Number(bb)); // 10 valueOf

alert(bb == '10'); // true valueOf

var bb = {
i: 10,
valueOf: function() {
console.log('valueOf');
return this.i;
}
}

alert(bb);// [object Object]
alert(+bb); // 10 valueOf
alert(''+bb); // 10 valueOf
alert(String(bb)); // [object Object]
alert(Number(bb)); // 10 valueOf
alert(bb == '10'); // true valueOf


發(fā)現(xiàn)有點不同吧?!它沒有像上面toString那樣統(tǒng)一規(guī)整。對于那個[object Object],我估計是從Object那里繼承過來的,我們再去掉它看看。

Object.prototype.toString = null;



var cc = {

i: 10,

valueOf: function() {

console.log('valueOf');

return this.i;

}

}



alert(cc);// 10 valueOf

alert(+cc); // 10 valueOf

alert(''+cc); // 10 valueOf

alert(String(cc)); // 10 valueOf

alert(Number(cc)); // 10 valueOf

alert(cc == '10'); // true valueOf

Object.prototype.toString = null;

var cc = {
i: 10,
valueOf: function() {
console.log('valueOf');
return this.i;
}
}

alert(cc);// 10 valueOf
alert(+cc); // 10 valueOf
alert(''+cc); // 10 valueOf
alert(String(cc)); // 10 valueOf
alert(Number(cc)); // 10 valueOf
alert(cc == '10'); // true valueOf


如果只重寫了toString,對象轉(zhuǎn)換時會無視valueOf的存在來進(jìn)行轉(zhuǎn)換。但是,如果只重寫了valueOf方法,在要轉(zhuǎn)換為字符串的時候會優(yōu)先考慮valueOf方法。在不能調(diào)用toString的情況下,只能讓valueOf上陣了。對于那個奇怪的字符串拼接問題,可能是出于操作符上,翻開ECMA262-5 發(fā)現(xiàn)都有一個getValue操作。嗯,那么謎底應(yīng)該是揭開了。重寫會加大它們調(diào)用的優(yōu)化高,而在有操作符的情況下,valueOf的優(yōu)先級本來就比toString的高。

    相關(guān)評論

    閱讀本文后您有什么感想? 已有人給出評價!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評論

    最新評論

    發(fā)表評論 查看所有評論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)