基本上攘轩,所有JS數(shù)據(jù)類(lèi)型都擁有這兩個(gè)方法淋叶,null除外仑荐。它們倆解決javascript值運(yùn)算與顯示的問(wèn)題雕拼,重寫(xiě)會(huì)加大它們調(diào)用的優(yōu)化。
測(cè)試分析
先看一例:
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
結(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
再看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è)偃サ羲纯础?/p>
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
總結(jié):valueOf偏向于運(yùn)算,toString偏向于顯示逛球。
1千元、 在進(jìn)行對(duì)象轉(zhuǎn)換時(shí)(例如:alert(a)),將優(yōu)先調(diào)用toString方法,如若沒(méi)有重寫(xiě)toString將調(diào)用valueOf方法颤绕,如果兩方法都不沒(méi)有重寫(xiě)幸海,但按Object的toString輸出。
2奥务、 在進(jìn)行強(qiáng)轉(zhuǎn)字符串類(lèi)型時(shí)將優(yōu)先調(diào)用toString方法物独,強(qiáng)轉(zhuǎn)為數(shù)字時(shí)優(yōu)先調(diào)用valueOf。
3汗洒、 在有運(yùn)算操作符的情況下议纯,valueOf的優(yōu)先級(jí)高于toString父款。