這篇文章給大家分享的是有關(guān)javascript有多少中數(shù)據(jù)類型轉(zhuǎn)換的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。
目前成都創(chuàng)新互聯(lián)公司已為上1000家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、網(wǎng)站托管、服務(wù)器租用、企業(yè)網(wǎng)站設(shè)計(jì)、如皋網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
javascript的兩種數(shù)據(jù)類型轉(zhuǎn)換:1、顯式類型轉(zhuǎn)換(又稱強(qiáng)制類型轉(zhuǎn)換),主要通過使用JavaScript內(nèi)置的函數(shù)來轉(zhuǎn)換數(shù)據(jù);2、隱式類型轉(zhuǎn)換,是指JavaScript根據(jù)運(yùn)算環(huán)境自動(dòng)轉(zhuǎn)換值的類型。
本教程操作環(huán)境:windows7系統(tǒng)、javascript1.8.5版、Dell G3電腦。
JavaScript 是一種弱類型動(dòng)態(tài)類型語言,變量沒有類型限制,可以隨時(shí)賦予任意值。
var x = y ? 1 : 'a';
上面代碼中,變量x到底是數(shù)值還是字符串,取決于另一個(gè)變量y的值。y為true時(shí),x是一個(gè)數(shù)值;y為false時(shí),x是一個(gè)字符串。這意味著,x的類型沒法在編譯階段就知道,必須等到運(yùn)行時(shí)才能知道。
雖然變量的數(shù)據(jù)類型是不確定的,但是各種運(yùn)算符對(duì)數(shù)據(jù)類型是有要求的。如果運(yùn)算符發(fā)現(xiàn),運(yùn)算子的類型與預(yù)期不符,就會(huì)自動(dòng)轉(zhuǎn)換類型。比如,減法運(yùn)算符預(yù)期左右兩側(cè)的運(yùn)算子應(yīng)該是數(shù)值,如果不是,就會(huì)自動(dòng)將它們轉(zhuǎn)為數(shù)值。
'4' - '3' // 1
上面代碼中,雖然是兩個(gè)字符串相減,但是依然會(huì)得到結(jié)果數(shù)值1,原因就在于 JavaScript 將運(yùn)算子自動(dòng)轉(zhuǎn)為了數(shù)值。
javascript中的數(shù)據(jù)類型轉(zhuǎn)換
在js中數(shù)據(jù)類型轉(zhuǎn)換一般分為兩種,即強(qiáng)制類型轉(zhuǎn)換和隱式類型轉(zhuǎn)換(利用js弱變量類型轉(zhuǎn)換)。
顯式類型轉(zhuǎn)換主要通過使用JavaScript內(nèi)置的函數(shù)來轉(zhuǎn)換;
隱式類型轉(zhuǎn)換是指JavaScript根據(jù)運(yùn)算環(huán)境自動(dòng)轉(zhuǎn)換值的類型。
在js中,想要將對(duì)象轉(zhuǎn)換成原始值,必然會(huì)調(diào)用toPrimitive()內(nèi)部函數(shù),那么它是如何工作的呢?
<1> toPrimitive(input,preferedType)
input是輸入的值,preferedType是期望轉(zhuǎn)換的類型,他可以是String或者Number,也可以不傳。
1)如果轉(zhuǎn)換的類型是number,會(huì)執(zhí)行以下步驟:
1. 如果input是原始值,直接返回這個(gè)值; 2. 否則,如果input是對(duì)象,調(diào)用input.valueOf(),如果結(jié)果是原始值,返回結(jié)果; 3. 否則,調(diào)用input.toString()。如果結(jié)果是原始值,返回結(jié)果; 4. 否則,拋出錯(cuò)誤。
2) 如果轉(zhuǎn)換的類型是String,2和3會(huì)交換執(zhí)行,即先執(zhí)行toString()方法。
3)可以省略preferedType,此時(shí),日期會(huì)被認(rèn)為是字符串,而其他的值會(huì)被當(dāng)做Number。
①如果input是內(nèi)置的Date類型,preferedType視為String
②否則視為Number,先調(diào)用valueOf,在調(diào)用toString
<2>ToBoolean(argument)
類型 | 返回結(jié)果 |
Underfined | false |
Null | false |
Boolean | argument |
Number | 僅當(dāng)argument為+0,-0或者NaN時(shí),return false;否則return true |
String | 僅當(dāng)argument為空字符串(長度為0)時(shí),return false;否則return true |
Symbol | true |
Object | true |
注意:除了underfined,null,false,NaN,’’,0,-0,其他都返回true
<3>ToNumber(argument)
類型 | 返回結(jié)果 |
Underfined | NaN |
Null | +0 |
Boolean | argument為true,return 1;為false,return +0 |
Number | argument |
String | 將字符串中的內(nèi)容轉(zhuǎn)化成數(shù)字,如'23'=>23;如果轉(zhuǎn)化失敗,則返回NaN,如‘23a’=>NaN |
Symbol | 拋出TypeError異常 |
Object | **先primValue= toPrimitive(argument,number),在對(duì)primValue使用ToNumber(primValue)** |
<4>ToString(argument)
類型 | 返回結(jié)果 |
Underfined | "underfined" |
Null | "null" |
Boolean | argument為true,return "true";為false,return "false" |
Number | 用字符串來表示這個(gè)數(shù)字 |
String | argument |
Symbol | 拋出TypeError異常 |
Object | **先primValue= toPrimitive(argument,string),在對(duì)primValue使用ToString(primValue)** |
1.隱式類型轉(zhuǎn)換:
1.1-隱式轉(zhuǎn)換介紹
· 在js中,當(dāng)運(yùn)算符在運(yùn)算時(shí),如果兩邊數(shù)據(jù)不統(tǒng)一,CPU就無法計(jì)算,這時(shí)我們編譯器會(huì)自動(dòng)將運(yùn)算符兩邊的數(shù)據(jù)做一個(gè)數(shù)據(jù)類型轉(zhuǎn)換,轉(zhuǎn)成一樣的數(shù)據(jù)類型再計(jì)算
這種無需程序員手動(dòng)轉(zhuǎn)換,而由編譯器自動(dòng)轉(zhuǎn)換的方式就稱為隱式轉(zhuǎn)換
· 例如1 > "0"這行代碼在js中并不會(huì)報(bào)錯(cuò),編譯器在運(yùn)算符時(shí)會(huì)先把右邊的"0"轉(zhuǎn)成數(shù)字0`然后在比較大小
————————————————
1.2-隱式轉(zhuǎn)換規(guī)則
(1). 轉(zhuǎn)成string類型: +(字符串連接符)
(2).轉(zhuǎn)成number類型:++/–(自增自減運(yùn)算符) + - * / %(算術(shù)運(yùn)算符) > < >= <= == != === !=== (關(guān)系運(yùn)算符)
加法規(guī)則
1.令lval=符號(hào)左邊的值,rval=符號(hào)右邊的值
2.令lprim=toPrimitive(lval),rprim=toPrimitive(rval)
如果lprim和rprim中有任意一個(gè)為string類型,將ToString(lprim)和ToString(rprim)的結(jié)果做字符串拼接
否則,將ToNumber(lprim)和ToNumber(rprim)的結(jié)果做算數(shù)加法
雙等規(guī)則
1.xy都為Null或者underfined,return true;一方為Null或者underfined、NaN,return false
2.如果x和y為String,Number,Boolean并且類型不一致,都轉(zhuǎn)為Number在進(jìn)行比較
3.如果存在Object,轉(zhuǎn)換為原始值在進(jìn)行比較
//特殊情況,xy都為Null或者underfined,return true console.log(undefined==undefined) //true console.log(undefined==null) //true console.log(null==null) //true //一方為Null或者underfined、NaN,return false console.log("0"==null) //false console.log("0"==undefined) //false console.log("0"==NaN) //false console.log(false==null) //false console.log(false==undefined) //false console.log(false==NaN) //false console.log("0"=="") //false console.log("0"==0) //true console.log(""==[]) //true console.log(false==0) //true console.log(false==[]) //true
(3). 轉(zhuǎn)成boolean類型:!(邏輯非運(yùn)算符)
//1.字符串連接符與算術(shù)運(yùn)算符隱式轉(zhuǎn)換規(guī)則易混淆 console.log(1+true) // 1+Number(true) ==> 1+1=2 //xy有一邊為string時(shí),會(huì)做字符串拼接 console.log(1+'true') //String(1)+2 ==> '1true' console.log('a'+ +'b') //aNaN console.log(1+undefined) //1+Number(undefined)==>1+NaN=NaN console.log(null+1) //Number(null)+1==>0+1=1 //2.會(huì)把其他數(shù)據(jù)類型轉(zhuǎn)換成number之后再比較關(guān)系 //注意:左右兩邊都是字符串時(shí),是要按照字符對(duì)應(yīng)的unicode編碼轉(zhuǎn)成數(shù)字。查看字符串unicode的方法:字符串.charCodeAt(字符串下標(biāo),默認(rèn)為0) console.log('2'>'10') //'2'.charCodeAt()>'10'.charCodeAt()=50>49==>true //特殊情況,NaN與任何數(shù)據(jù)比較都是NaN console.log(NaN==NaN) //false //3.復(fù)雜數(shù)據(jù)類型在隱式轉(zhuǎn)換時(shí),原始值(valueOf())不是number,會(huì)先轉(zhuǎn)成String,然后再轉(zhuǎn)成Number運(yùn)算 console.log(false=={}) //false //({}).valueOf().toString()="[object Object]" console.log([]+[]) //"" //[].valueOf().toString()+[].valueOf().toString()=""+""="" console.log({}+[]) //0 console.log(({})+[]) //"[object Object]" console.log(5/[1]) //5 console.log(5/null) //5 console.log(5+{toString:function(){return 'def'}}) //5def console.log(5+{toString:function(){return 'def'},valueOf:function(){return 3}}) //5+3=8 //4.邏輯非隱式轉(zhuǎn)換與關(guān)系運(yùn)算符隱式轉(zhuǎn)換搞混淆(邏輯非,將其他類型轉(zhuǎn)成boolean類型) console.log([]==0) //true console.log({}==0) //false console.log(![]==0) //true console.log([]==![]) //true console.log([]==[]) //false //坑 console.log({}=={}) //false //坑 console.log({}==!{}) //false //坑
2.強(qiáng)制類型(顯式類型)轉(zhuǎn)換:
通過手動(dòng)進(jìn)行類型轉(zhuǎn)換,Javascript提供了以下轉(zhuǎn)型函數(shù):
轉(zhuǎn)換為數(shù)值類型:Number(mix)、parseInt(string,radix)、parseFloat(string)
轉(zhuǎn)換為字符串類型:toString(radix)、String(mix)
轉(zhuǎn)換為布爾類型:Boolean(mix)
2.1 Boolean(value)、Number(value) 、String(value)
new Number(value) 、new String(value)、 new Boolean(value)傳入各自對(duì)應(yīng)的原始類型的值,可以實(shí)現(xiàn)“裝箱”-----即將原始類型封裝成一個(gè)對(duì)象。其實(shí)這三個(gè)函數(shù)不僅可以當(dāng)作構(gòu)造函數(shù),還可以當(dāng)作普通函數(shù)來使用,將任何類型的參數(shù)轉(zhuǎn)化成原始類型的值。
其實(shí)這三個(gè)函數(shù)在類型轉(zhuǎn)換的時(shí)候,調(diào)用的就是js內(nèi)部的ToBoolean(argument)、ToNumber(argument)、ToString(argument)
2.2 parseInt(string,radix)
將字符串轉(zhuǎn)換為整數(shù)類型的數(shù)值。它也有一定的規(guī)則:
(1)忽略字符串前面的空格,直至找到第一個(gè)非空字符
(2)如果第一個(gè)字符不是數(shù)字符號(hào)或者負(fù)號(hào),返回NaN
(3)如果第一個(gè)字符是數(shù)字,則繼續(xù)解析直至字符串解析完畢或者遇到一個(gè)非數(shù)字符號(hào)為止
(4)如果上步解析的結(jié)果以0開頭,則將其當(dāng)作八進(jìn)制來解析;如果以0x開頭,則將其當(dāng)作十六進(jìn)制來解析
(5)如果指定radix參數(shù),則以radix為基數(shù)進(jìn)行解析
let objj={ valueOf:function(){return '2px'}, toString:function(){return []} } parseInt(objj) //2 parseInt('001') //1 parseInt('22.5') //22 parseInt('123sws') //123 parseInt('sws123') //NaN //特殊的 parseInt(function(){},16) //15 parseInt(1/0,19) //18 //瀏覽器代碼解析器:parseInt里面有兩個(gè)參數(shù),第二個(gè)參數(shù)是十九進(jìn)制(0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i),額,1/0,好吧先運(yùn)算 結(jié)果等于Infinity, //I好的十九進(jìn)制有認(rèn)識(shí),n十九進(jìn)制不存在不認(rèn)識(shí),不管后面有沒有了,立即返回i(i對(duì)應(yīng)的十進(jìn)制中的18),所以返回18 parseInt(1/0,16) //NaN //同上,16進(jìn)制滅有對(duì)應(yīng)i,返回NaN parseInt(0.0000008) //8 //String(0.0000008),結(jié)果為8e-7 parseInt(0.000008) //0 parseInt(false,16) //250 //16進(jìn)制,'f'認(rèn)識(shí), 'a'認(rèn)識(shí), 'l'哦,不認(rèn)識(shí),立即返回fa (十六進(jìn)制的fa轉(zhuǎn)換成十進(jìn)制等于250) parseInt('0x10')) //16 //只有一個(gè)參數(shù),好的,采用默認(rèn)的十進(jìn)制, '0x',額,這個(gè)我認(rèn)識(shí),是十六進(jìn)制的寫法, 十六進(jìn)制的10轉(zhuǎn)換成十進(jìn)制等于16 parseInt('10',2) //2 //返回二進(jìn)制的10 轉(zhuǎn)換成十進(jìn)制等于2
2.3 parseFloat(string)
將字符串轉(zhuǎn)換為浮點(diǎn)數(shù)類型的數(shù)值.規(guī)則:
它的規(guī)則與parseInt基本相同,但也有點(diǎn)區(qū)別:字符串中第一個(gè)小數(shù)點(diǎn)符號(hào)是有效的,另外parseFloat會(huì)忽略所有前導(dǎo)0,如果字符串包含一個(gè)可解析為整數(shù)的數(shù),則返回整數(shù)值而不是浮點(diǎn)數(shù)值。
2.4 toString(radix)
除undefined和null之外的所有類型的值都具有toString()方法,其作用是返回對(duì)象的字符串表示
感謝各位的閱讀!關(guān)于“javascript有多少中數(shù)據(jù)類型轉(zhuǎn)換”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!