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

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

Javascript中valueOf與toString方法分析

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

作者:佚名點(diǎn)擊:338次評(píng)論:0次標(biāo)簽: valueOf

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

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

先看一例:

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é)果,因?yàn)樗鼈兺低档卣{(diào)用valueOf或toString方法。但如何區(qū)分什么情況下是調(diào)用了哪個(gè)方法呢,我們可以通過(guò)另一個(gè)方法測(cè)試一下。由于用到console.log,請(qǐng)?jiān)谘b有firebug的FF中實(shí)驗(yàn)!

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

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)有點(diǎn)不同吧?!它沒(méi)有像上面toString那樣統(tǒng)一規(guī)整。對(duì)于那個(gè)[object Object],我估計(jì)是從Object那里繼承過(guò)來(lái)的,我們?cè)偃サ羲纯础?br />
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,對(duì)象轉(zhuǎn)換時(shí)會(huì)無(wú)視valueOf的存在來(lái)進(jìn)行轉(zhuǎn)換。但是,如果只重寫了valueOf方法,在要轉(zhuǎn)換為字符串的時(shí)候會(huì)優(yōu)先考慮valueOf方法。在不能調(diào)用toString的情況下,只能讓valueOf上陣了。對(duì)于那個(gè)奇怪的字符串拼接問(wèn)題,可能是出于操作符上,翻開(kāi)ECMA262-5 發(fā)現(xiàn)都有一個(gè)getValue操作。嗯,那么謎底應(yīng)該是揭開(kāi)了。重寫會(huì)加大它們調(diào)用的優(yōu)化高,而在有操作符的情況下,valueOf的優(yōu)先級(jí)本來(lái)就比toString的高。

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過(guò)難過(guò)
    • 5 囧
    • 3 圍觀圍觀
    • 2 無(wú)聊無(wú)聊

    熱門評(píng)論

    最新評(píng)論

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

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