一文帶你搞清JavaScript中類型轉(zhuǎn)換的三種方法valueOf vs toString vs Symbol.toPrimitive
js獲取對(duì)象值的方法有三種valueOf() 、toString()、symbol.toPrimitive這些其實(shí)是類型轉(zhuǎn)換的問題;三種方式本質(zhì)上略微不同;
我們知道在js中,'一切皆為對(duì)象'。每個(gè)對(duì)象都有一個(gè)toString()方法和valueOf方法,其中toString()方法返回一個(gè)表示該對(duì)象的字符串,valueOf 方法返回該對(duì)象的原始值。
一、valueOf() 與 toString()
基本類型的情況下:
const str = "hello",n = 123,bool = true; console.log(typeof(str.toString()) + "_" + str.toString()) //string_hello console.log(typeof(n.toString()) + "_" + n.toString() ) //string_123 console.log(typeof(bool.toString()) + "_" + bool.toString()) //string_true console.log(typeof(str.valueOf()) + "_" + str.valueOf()) //string_hello console.log(typeof(n.valueOf()) + "_" + n.valueOf()) //number_123 console.log(typeof(bool.valueOf()) + "_" + bool.valueOf()) //boolean_true // valueOf console.log(str.valueOf() === str) // true console.log(n.valueOf() === n) // true console.log(bool.valueOf() === bool) // true // toString console.log(str.toString() === str) // true console.log(n.toString() === n) // false console.log(bool.toString() === bool) // false
toString 方法對(duì)于值類型數(shù)據(jù)使用而言,其效果相當(dāng)于類型轉(zhuǎn)換,將原類型轉(zhuǎn)為字符串。
valueOf 方法對(duì)于值類型數(shù)據(jù)使用而言,其效果將相當(dāng)于返回原數(shù)據(jù)。 引用類型的情況下:
var obj = {};
console.log(obj.toString()); //[object Object] 返回對(duì)象類型
console.log(obj.valueOf()); //{} 返回對(duì)象本身
綜合例子:
let test = {
i: 10,
toString: function() {
console.log('toString');
return this.i;
},
valueOf: function() {
console.log('valueOf');
return this.i;
}
}
console.log(test); // { I:10, toString: f, valueOf: f }
console.log(+test); // 10 valueOf
console.log('' + test); // 10 valueOf
console.log(String(test)); // 10 toString
console.log(Number(test)); // 10 valueOf
console.log(test == '10'); // true valueOf
console.log(test == '10'); // true valueOf
console.log(test === '10'); // false
個(gè)人理解:
帶有運(yùn)算符的獲取值的方式都會(huì)走valueOf()方法;強(qiáng)轉(zhuǎn)字符串的時(shí)候走toString()方法;
二、toString() 和 String()
toString()
toString()可以將所有的數(shù)據(jù)都轉(zhuǎn)換為字符串,但是要排除null和undefinednull和undefined不能轉(zhuǎn)換為字符串,null和undefined調(diào)用toString()方法會(huì)報(bào)錯(cuò)- 如果當(dāng)前數(shù)據(jù)為數(shù)字類型,則
toString()括號(hào)中的可以寫一個(gè)數(shù)字,代表進(jìn)制,可以將數(shù)字轉(zhuǎn)化為對(duì)應(yīng)進(jìn)制字符串。
var num = 123; console.log(num.toString()+'_'+ typeof(num.toString())); //123_string console.log(num.toString(2)+'_'+typeof(num.toString())); //1111011_string console.log(num.toString(8)+'_'+typeof(num.toString())); //173_string console.log(num.toString(16)+'_'+typeof(num.toString())); //7b_string
String()
String()可以將null和undefined轉(zhuǎn)換為字符串,但是沒法轉(zhuǎn)進(jìn)制字符串。
三、Symbol.toPrimitive
對(duì)象的Symbol.toPrimitive屬性。指向一個(gè)方法。該對(duì)象被轉(zhuǎn)化為原始類型的值時(shí),會(huì)調(diào)用這個(gè)辦法,返回該對(duì)象對(duì)應(yīng)的原始類型值。
Symbol.toPrimitive被調(diào)用時(shí),會(huì)接受一個(gè)字符串參數(shù),表示當(dāng)前運(yùn)算的模式,一個(gè)有三種模式。
Number: 該場(chǎng)合需要轉(zhuǎn)成數(shù)值String: 該場(chǎng)合需要轉(zhuǎn)成字符串Default: 該場(chǎng)合可以轉(zhuǎn)成數(shù)值,也可以轉(zhuǎn)成字符串。
Symbol.toPrimitive在類型轉(zhuǎn)換方面,優(yōu)先級(jí)是最高的
const test = {
i: 10,
toString: function() {
console.log('toString');
return this.i;
},
valueOf: function() {
console.log('valueOf');
return this.i;
},
[Symbol.toPrimitive](hint) {
if(hint === 'number'){
console.log('Number場(chǎng)景');
return 123;
}
if(hint === 'string'){
console.log('String場(chǎng)景');
return 'str';
}
if(hint === 'default'){
console.log('Default 場(chǎng)景');
return 'default';
}
}
}
console.log(test); // { i:10, toString: f, valueOf: f, Symbol(Symbol.toPrimitive): f }
console.log(+test); // 123 Number場(chǎng)景
console.log(''+test); // default Default 場(chǎng)景
console.log(String(test)); // str String場(chǎng)景
console.log(Number(test)); // 123 Number場(chǎng)景
console.log(test == '10'); // false default場(chǎng)景
console.log(test === '10'); // false
上面代碼中、+test中的加號(hào)命名為一元加號(hào);+test本質(zhì)就是轉(zhuǎn)成數(shù)值的意思;
Tips
console.log(3 + test); // 3default Default 場(chǎng)景 console.log(3 - test); // -120 Number場(chǎng)景 console.log(3 * test); // 369 Number場(chǎng)景 console.log(3 / test); // 0.0243902 Number場(chǎng)景
以上的代碼中,加減乘除都算運(yùn)算符,本應(yīng)都應(yīng)該走Number場(chǎng)景,但是唯獨(dú)+號(hào)走了Default場(chǎng)景;
四、一元加號(hào)
一元加號(hào)運(yùn)算符 + 在其操作數(shù)之前,并計(jì)算其操作數(shù);但如果尚未將其轉(zhuǎn)換為數(shù)字,則嘗試將其轉(zhuǎn)換為數(shù)字。
console.log(+'') // 0 console.log(+true) // 1 console.log(+false) // 0 console.log(+'hello') // NaN console.log(1 + +"2" + "2") // 32
一元加法是將某事物轉(zhuǎn)換為數(shù)字的最快和首選方法,因?yàn)樗粚?duì)數(shù)字執(zhí)行任何其他操作。
如果它無法解析特定值,它將輸出為NaN
到此這篇關(guān)于一文帶你搞清JavaScript中類型轉(zhuǎn)換的三種方法valueOf vs toString vs Symbol.toPrimitive的文章就介紹到這了,更多相關(guān)JavaScript類型轉(zhuǎn)換方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
VsCode插件自動(dòng)生成注釋插件koroFileHeader使用教程
這篇文章主要介紹了VsCode插件自動(dòng)生成注釋插件koroFileHeader使用教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-01-01
JS onmousemove鼠標(biāo)移動(dòng)坐標(biāo)接龍DIV效果實(shí)例
這篇文章主要介紹了JS onmousemove鼠標(biāo)移動(dòng)坐標(biāo)接龍DIV效果實(shí)例,有需要的朋友可以參考一下2013-12-12
javascript在IE下trim函數(shù)無法使用的解決方法
這篇文章主要介紹了javascript在IE下trim函數(shù)無法使用的解決方法,分別敘述了javascript以及jQuery下的解決方案,對(duì)于WEB前端javascript設(shè)計(jì)人員進(jìn)行瀏覽器兼容性調(diào)試有不錯(cuò)的借鑒價(jià)值,需要的朋友可以參考下2014-09-09
JS如何讓你的移動(dòng)端交互體驗(yàn)更加優(yōu)秀
現(xiàn)在在手機(jī)等移動(dòng)端設(shè)備訪問的人越來越多,我們前端開發(fā)者一直致力于將設(shè)計(jì)稿還原成頁面,供用戶訪問。但除高度還原設(shè)計(jì)稿外,交互上的良好體驗(yàn)也是我們應(yīng)該做到的。2021-05-05
JavaScript中的ubound函數(shù)使用實(shí)例
這篇文章主要介紹了JavaScript中的ubound函數(shù)使用實(shí)例,本文先是講解了ubound函數(shù)的語法,然后給出了用法代碼實(shí)例,需要的朋友可以參考下2014-11-11
淺談js對(duì)象屬性 通過點(diǎn)(.) 和方括號(hào)([]) 的不同之處
下面小編就為大家?guī)硪黄獪\談js對(duì)象屬性 通過點(diǎn)(.) 和方括號(hào)([]) 的不同之處。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-10-10
javascript中undefined與null的區(qū)別
在JavaScript中存在這樣兩種原始類型:Null與Undefined。這兩種類型常常會(huì)使JavaScript的開發(fā)人員產(chǎn)生疑惑,在什么時(shí)候是Null,什么時(shí)候又是Undefined?2015-08-08
微信小程序間使用navigator跳轉(zhuǎn)傳值問題實(shí)例分析
這篇文章主要介紹了微信小程序間使用navigator跳轉(zhuǎn)傳值問題,結(jié)合實(shí)例形式分析了微信小程序間使用navigator跳轉(zhuǎn)傳值過程中遇到的問題與解決方法,需要的朋友可以參考下2020-03-03
JavaScript實(shí)現(xiàn)獲取用戶單擊body中所有A標(biāo)簽內(nèi)容的方法
這篇文章主要介紹了JavaScript實(shí)現(xiàn)獲取用戶單擊body中所有A標(biāo)簽內(nèi)容的方法,涉及javascript針對(duì)頁面元素及事件響應(yīng)相關(guān)操作技巧,需要的朋友可以參考下2017-06-06

