国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

全面解析JavaScript中的valueOf與toString方法(推薦)

2019-11-20 09:41:59
字體:
來源:轉載
供稿:網友

可以這樣說,所有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); // truealert(+aaa); // 40alert(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 toStringalert(+bbb); // 10 valueOfalert(''+bbb); // 10 valueOfalert(String(bbb)); // 10 toStringalert(Number(bbb)); // 10 valueOfalert(bbb == '10'); // true valueOfalert(bbb === '10'); // false

乍一看結果,大抵給人的感覺是,如果轉換為字符串時調用toString方法,如果是轉換為數值時則調用valueOf方法,但其中有兩個很不和諧。一個是alert(''+bbb),字符串合拼應該是調用toString方法……另一個我們暫時可以理解為===操作符不進行隱式轉換,因此不調用它們。為了追究真相,我們需要更嚴謹的實驗。

var aa = {i: 10,toString: function() {console.log('toString');return this.i;}}alert(aa);// 10 toStringalert(+aa); // 10 toStringalert(''+aa); // 10 toStringalert(String(aa)); // 10 toStringalert(Number(aa)); // 10 toStringalert(aa == '10'); // true toString

再看valueOf。

var bb = {i: 10,valueOf: function() {console.log('valueOf');return this.i;}}alert(bb);// [object Object]alert(+bb); // 10 valueOfalert(''+bb); // 10 valueOfalert(String(bb)); // [object Object]alert(Number(bb)); // 10 valueOfalert(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 valueOfalert(+cc); // 10 valueOfalert(''+cc); // 10 valueOfalert(String(cc)); // 10 valueOfalert(Number(cc)); // 10 valueOfalert(cc == '10'); // true valueOf

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

以上所述是小編給大家介紹的JavaScript中的valueOf與toString方法的全部敘述,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 金华市| 陇南市| 玉龙| 元谋县| 炉霍县| 张北县| 景泰县| 兴城市| 合作市| 丰顺县| 绥芬河市| 彰武县| 二连浩特市| 托里县| 铁力市| 谢通门县| 沂源县| 浦东新区| 东山县| 申扎县| 南阳市| 旬阳县| 察雅县| 霍林郭勒市| 长子县| 保靖县| 都兰县| 闵行区| 怀远县| 武冈市| 溆浦县| 崇文区| 安达市| 车险| 盐边县| 潮州市| 南平市| 凌云县| 龙井市| 沐川县| 新丰县|