JavaScript中valueOf函數(shù)與toString方法深入理解
object.valueOf( )object是必選項(xiàng)參數(shù)是任意固有 JScript 對(duì)象。
每個(gè)JavaScript固有對(duì)象的 valueOf 方法定義不同。
對(duì)象 | 返回值 |
Array | 數(shù)組的元素被轉(zhuǎn)換為字符串,這些字符串由逗號(hào)分隔,連接在一起。其操作與 Array.toString 和 Array.join 方法相同。 |
Boolean | Boolean 值。 |
Date | 存儲(chǔ)的時(shí)間是從 1970 年 1 月 1 日午夜開(kāi)始計(jì)的毫秒數(shù) UTC。 |
Function | 函數(shù)本身。 |
Number | 數(shù)字值。 |
Object | 對(duì)象本身。這是默認(rèn)情況。 |
String | 字符串值。 |
Math 和 Error 對(duì)象沒(méi)有 valueOf 方法。
基本上,所有JS數(shù)據(jù)類(lèi)型都擁有valueOf和toString這兩個(gè)方法,null除外。它們倆解決javascript值運(yùn)算與顯示的問(wèn)題。
JavaScript 的 valueOf() 方法
valueOf() 方法可返回 Boolean 對(duì)象的原始值。
用法booleanObject.valueOf(),返回值為booleanObject 的原始布爾值。如果調(diào)用該方法的對(duì)象不是 Boolean,則拋出異常 TypeError。
<script type="text/javascript">
var boo = new Boolean(false);
document.write(boo.valueOf());
</script>
以上腳本會(huì)輸出false。
JavaScript 的 toString() 方法
toString() 方法可把一個(gè)邏輯值轉(zhuǎn)換為字符串,并返回結(jié)果。
用法 booleanObject.toString(),返回值根據(jù)原始布爾值或者 booleanObject 對(duì)象的值返回字符串 "true" 或 "false"。如果調(diào)用該方法的對(duì)象不是 Boolean,則拋出異常 TypeError。
在 Boolean 對(duì)象被用于字符串環(huán)境中時(shí),此方法會(huì)被自動(dòng)調(diào)用。
下面腳本將創(chuàng)建一個(gè) Boolean 對(duì)象,并把它轉(zhuǎn)換成字符串:
<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
之所以有這樣的結(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è)偃サ羲纯础?
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
如果只重寫(xiě)了toString,對(duì)象轉(zhuǎn)換時(shí)會(huì)無(wú)視valueOf的存在來(lái)進(jìn)行轉(zhuǎn)換。但是,如果只重寫(xiě)了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)了。重寫(xiě)會(huì)加大它們調(diào)用的優(yōu)化高,而在有操作符的情況下,valueOf的優(yōu)先級(jí)本來(lái)就比toString的高。
- JavaScript中的toString()和toLocaleString()方法的區(qū)別
- 判斷js中各種數(shù)據(jù)的類(lèi)型方法之typeof與0bject.prototype.toString講解
- JavaScript中Object.prototype.toString方法的原理
- Javascript中valueOf與toString區(qū)別淺析
- 淺談JS中String()與 .toString()的區(qū)別
- javascript中tostring()和valueof()的用法及兩者的區(qū)別
- js中toString()和String()區(qū)別詳解
- JavaScript中toString()方法的使用詳解
- javascript中Number對(duì)象的toString()方法分析
- JavaScript中的object轉(zhuǎn)換函數(shù)toString()與valueOf()介紹
- JavaScript中toLocaleString()和toString()的區(qū)別實(shí)例分析
相關(guān)文章
javascript之Partial Application學(xué)習(xí)
在數(shù)學(xué)中,一個(gè)函數(shù)是描述每個(gè)輸入值對(duì)應(yīng)唯一輸出值的這種對(duì)應(yīng)關(guān)系,符號(hào)為 f(x)。例如,表達(dá)式 f(x)=x2表示了一個(gè)函數(shù) f,其中每個(gè)輸入值x都與唯一輸出值x2相聯(lián)系2013-01-01JS/HTML5游戲常用算法之路徑搜索算法 隨機(jī)迷宮算法詳解【普里姆算法】
這篇文章主要介紹了JS/HTML5游戲常用算法之路徑搜索算法 隨機(jī)迷宮算法,結(jié)合實(shí)例形式詳細(xì)分析了針對(duì)迷宮游戲路徑搜索算法的普里姆算法相關(guān)原理、實(shí)現(xiàn)方法及操作注意事項(xiàng),需要的朋友可以參考下2018-12-12JavaScript事件 "事件對(duì)象"的注意要點(diǎn)
這篇文章主要介紹了JavaScript事件,告訴大家"事件對(duì)象"的注意要點(diǎn),感興趣的小伙伴們可以參考一下2016-01-01微信小程序報(bào)錯(cuò):does?not?have?a?method?"xxxx"?to?ha
這篇文章主要給大家介紹了關(guān)于微信小程序報(bào)錯(cuò):does?not?have?a?method?"xxxx"?to?handle?event?"tap"的解決方案,文中將解決的辦法介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01JS獲取瀏覽器語(yǔ)言動(dòng)態(tài)加載JS文件示例代碼
通過(guò)獲取瀏覽器語(yǔ)言版本,來(lái)相對(duì)的加載easyui語(yǔ)言包就是動(dòng)態(tài)加載JS文件,下面有個(gè)不錯(cuò)的實(shí)例,大家可以看看2014-10-10禁用backspace網(wǎng)頁(yè)回退功能的實(shí)現(xiàn)代碼
下面小編就為大家?guī)?lái)一篇禁用backspace網(wǎng)頁(yè)回退功能的實(shí)現(xiàn)代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11原生JS實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲
這篇文章主要為大家詳細(xì)介紹了原生JS實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06Bootstrap開(kāi)發(fā)實(shí)戰(zhàn)之響應(yīng)式輪播圖
這篇文章主要為大家詳細(xì)介紹了Bootstrap開(kāi)發(fā)實(shí)戰(zhàn)之響應(yīng)式輪播圖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-06-06