溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

javascript有多少中數(shù)據(jù)類型轉(zhuǎn)換

發(fā)布時(shí)間:2022-02-24 09:34:41 來源:億速云 閱讀:129 作者:小新 欄目:web開發(fā)

這篇文章給大家分享的是有關(guān)javascript有多少中數(shù)據(jù)類型轉(zhuǎn)換的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

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)算符對數(shù)據(jù)類型是有要求的。如果運(yùn)算符發(fā)現(xiàn),運(yùn)算子的類型與預(yù)期不符,就會自動(dòng)轉(zhuǎn)換類型。比如,減法運(yùn)算符預(yù)期左右兩側(cè)的運(yùn)算子應(yīng)該是數(shù)值,如果不是,就會自動(dòng)將它們轉(zhuǎn)為數(shù)值。

'4' - '3' // 1

上面代碼中,雖然是兩個(gè)字符串相減,但是依然會得到結(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中,想要將對象轉(zhuǎn)換成原始值,必然會調(diào)用toPrimitive()內(nèi)部函數(shù),那么它是如何工作的呢?

<1> toPrimitive(input,preferedType)

input是輸入的值,preferedType是期望轉(zhuǎn)換的類型,他可以是String或者Number,也可以不傳。

1)如果轉(zhuǎn)換的類型是number,會執(zhí)行以下步驟:

 1. 如果input是原始值,直接返回這個(gè)值;

 2. 否則,如果input是對象,調(diào)用input.valueOf(),如果結(jié)果是原始值,返回結(jié)果;

 3. 否則,調(diào)用input.toString()。如果結(jié)果是原始值,返回結(jié)果;

 4. 否則,拋出錯(cuò)誤。

2) 如果轉(zhuǎn)換的類型是String,2和3會交換執(zhí)行,即先執(zhí)行toString()方法。

3)可以省略preferedType,此時(shí),日期會被認(rèn)為是字符串,而其他的值會被當(dāng)做Number。

①如果input是內(nèi)置的Date類型,preferedType視為String

②否則視為Number,先調(diào)用valueOf,在調(diào)用toString

<2>ToBoolean(argument)

類型返回結(jié)果
Underfinedfalse
Nullfalse
Booleanargument
Number僅當(dāng)argument為+0,-0或者NaN時(shí),return false;否則return true
String僅當(dāng)argument為空字符串(長度為0)時(shí),return false;否則return true
Symboltrue
Objecttrue

注意:除了underfined,null,false,NaN,’’,0,-0,其他都返回true

<3>ToNumber(argument)

類型返回結(jié)果
UnderfinedNaN
Null+0
Booleanargument為true,return 1;為false,return +0
Numberargument
String將字符串中的內(nèi)容轉(zhuǎn)化成數(shù)字,如'23'=>23;如果轉(zhuǎn)化失敗,則返回NaN,如‘23a’=>NaN
Symbol拋出TypeError異常
Object**先primValue= toPrimitive(argument,number),在對primValue使用ToNumber(primValue)**

<4>ToString(argument)

類型返回結(jié)果
Underfined"underfined"
Null"null"
Booleanargument為true,return "true";為false,return "false"
Number用字符串來表示這個(gè)數(shù)字
Stringargument
Symbol拋出TypeError異常
Object**先primValue= toPrimitive(argument,string),在對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í)我們編譯器會自動(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中并不會報(bào)錯(cuò),編譯器在運(yùn)算符時(shí)會先把右邊的"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=符號左邊的值,rval=符號右邊的值
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í),會做字符串拼接
  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.會把其他數(shù)據(jù)類型轉(zhuǎn)換成number之后再比較關(guān)系
  //注意:左右兩邊都是字符串時(shí),是要按照字符對應(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,會先轉(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)傳入各自對應(yīng)的原始類型的值,可以實(shí)現(xiàn)“裝箱”-----即將原始類型封裝成一個(gè)對象。其實(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ù)字符號或者負(fù)號,返回NaN
(3)如果第一個(gè)字符是數(shù)字,則繼續(xù)解析直至字符串解析完畢或者遇到一個(gè)非數(shù)字符號為止
(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)識,n十九進(jìn)制不存在不認(rèn)識,不管后面有沒有了,立即返回i(i對應(yīng)的十進(jìn)制中的18),所以返回18
    parseInt(1/0,16)                //NaN   //同上,16進(jìn)制滅有對應(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)識, 'a'認(rèn)識, 'l'哦,不認(rèn)識,立即返回fa (十六進(jìn)制的fa轉(zhuǎn)換成十進(jìn)制等于250)
    parseInt('0x10'))          //16     //只有一個(gè)參數(shù),好的,采用默認(rèn)的十進(jìn)制, '0x',額,這個(gè)我認(rèn)識,是十六進(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)符號是有效的,另外parseFloat會忽略所有前導(dǎo)0,如果字符串包含一個(gè)可解析為整數(shù)的數(shù),則返回整數(shù)值而不是浮點(diǎn)數(shù)值。

2.4 toString(radix)

除undefined和null之外的所有類型的值都具有toString()方法,其作用是返回對象的字符串表示

感謝各位的閱讀!關(guān)于“javascript有多少中數(shù)據(jù)類型轉(zhuǎn)換”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI