JavaScript中valueOf函式與toString方法深入理解

NO IMAGE

JavaScript中valueOf函式方法是返回指定物件的原始值。使用方法:
object.valueOf( )object是必選項引數是任意固有 JScript 物件。
每個JavaScript固有物件的 valueOf 方法定義不同。

物件返回值
Array陣列的元素被轉換為字串,這些字串由逗號分隔,連線在一起。其操作與 Array.toString 和 Array.join 方法相同。
BooleanBoolean 值。
Date儲存的時間是從 1970 年 1 月 1 日午夜開始計的毫秒數 UTC。
Function函式本身。
Number數字值。
Object物件本身。這是預設情況。
String字串值。

Math 和 Error 物件沒有 valueOf 方法。

基本上,所有JS資料型別都擁有valueOf和toString這兩個方法,null除外。它們倆解決javascript值運算與顯示的問題。
JavaScript 的 valueOf() 方法
valueOf() 方法可返回 Boolean 物件的原始值。
用法booleanObject.valueOf(),返回值為booleanObject 的原始布林值。如果呼叫該方法的物件不是 Boolean,則丟擲異常 TypeError。
複製程式碼 程式碼如下:
<script type=”text/javascript”>
var boo = new Boolean(false);
document.write(boo.valueOf());
</script>

以上指令碼會輸出false。
JavaScript 的 toString() 方法
toString() 方法可把一個邏輯值轉換為字串,並返回結果。
用法 booleanObject.toString(),返回值根據原始布林值或者 booleanObject 物件的值返回字串 “true” 或 “false”。如果呼叫該方法的物件不是 Boolean,則丟擲異常 TypeError。
在 Boolean 物件被用於字串環境中時,此方法會被自動呼叫。
下面指令碼將建立一個 Boolean 物件,並把它轉換成字串:
複製程式碼 程式碼如下:
<script type=”text/javascript”>
var boo = new Boolean(true);
document.write(boo.toString());
</script>

指令碼輸出:true。
先看一例
複製程式碼 程式碼如下:
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

之所以有這樣的結果,因為它們偷偷地呼叫valueOf或toString方法。但如何區分什麼情況下是呼叫了哪個方法呢,我們可以通過另一個方法測試一下。由於用到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

乍一看結果,大抵給人的感覺是,如果轉換為字串時呼叫toString方法,如果是轉換為數值時則呼叫valueOf方法,但其中有兩個很不和諧。一個是alert(” bbb),字串合拼應該是呼叫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
發現有點不同吧?!它沒有像上面toString那樣統一規整。對於那個[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

如果只重寫了toString,物件轉換時會無視valueOf的存在來進行轉換。但是,如果只重寫了valueOf方法,在要轉換為字串的時候會優先考慮valueOf方法。在不能呼叫toString的情況下,只能讓valueOf上陣了。對於那個奇怪的字串拼接問題,可能是出於操作符上,翻開ECMA262-5 發現都有一個getValue操作。嗯,那麼謎底應該是揭開了。重寫會加大它們呼叫的優化高,而在有操作符的情況下,valueOf的優先順序本來就比toString的高。

您可能感興趣的文章:

js字串的各種格式的轉換 ToString,Formatjs資料toString 方法node.js中的buffer.toString方法使用說明判斷js中各種資料的型別方法之typeof與0bject.prototype.toString講解非常好用的JsonToString 方法 簡單例項Javascript中valueOf與toString區別淺析過載toString實現JS HashMap分析JavaScript中Object.prototype.toString方法的原理javascript中Number物件的toString()方法分析js中toString()和String()區別詳解