JavaScript中valueOf函數與toString方法

來源:互聯網
上載者:User

標籤:數字   返回結果   body   art   指令碼   ber   異常   時間   strong   

 

 

基本上,所有JS資料類型都擁有valueOf和toString這兩個方法,null除外。它們倆解決javascript值運算與顯示的問題,本文將詳細介紹,有需要的朋友可以參考下 JavaScript中valueOf函數方法是返回指定對象的原始值。使用方法: 
object.valueOf( )object是必選項參數是任意固有 JScript 對象。 
每個JavaScript固有對象的 valueOf 方法定義不同。 
對象 傳回值
Array 數組的元素被轉換為字串,這些字串由逗號分隔,串連在一起。其操作與 Array.toString 和 Array.join 方法相同。
Boolean Boolean 值。
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的高。

JavaScript中valueOf函數與toString方法

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.