javascript中資料型別轉換分為哪兩種

2022-02-23 19:00:23

javascript的兩種資料型別轉換:1、顯式型別轉換(又稱強制型別轉換),主要通過使用JavaScript內建的函數來轉換資料;2、隱式型別轉換,是指JavaScript根據運算環境自動轉換值的型別。

本教學操作環境:windows7系統、javascript1.8.5版、Dell G3電腦。

JavaScript 是一種弱型別動態型別語言,變數沒有型別限制,可以隨時賦予任意值。

var x = y ? 1 : 'a';

上面程式碼中,變數x到底是數值還是字串,取決於另一個變數y的值。y為true時,x是一個數值;y為false時,x是一個字串。這意味著,x的型別沒法在編譯階段就知道,必須等到執行時才能知道。

雖然變數的資料型別是不確定的,但是各種運運算元對資料型別是有要求的。如果運運算元發現,運運算元的型別與預期不符,就會自動轉換型別。比如,減法運運算元預期左右兩側的運運算元應該是數值,如果不是,就會自動將它們轉為數值。

'4' - '3' // 1

上面程式碼中,雖然是兩個字串相減,但是依然會得到結果數值1,原因就在於 JavaScript 將運運算元自動轉為了數值。

javascript中的資料型別轉換

在js中資料型別轉換一般分為兩種,即強制型別轉換和隱式型別轉換(利用js弱變數型別轉換)。

  • 顯式型別轉換主要通過使用JavaScript內建的函數來轉換;

  • 隱式型別轉換是指JavaScript根據運算環境自動轉換值的型別。

在js中,想要將物件轉換成原始值,必然會呼叫toPrimitive()內部函數,那麼它是如何工作的呢?

<1> toPrimitive(input,preferedType)

input是輸入的值,preferedType是期望轉換的型別,他可以是String或者Number,也可以不傳。

1)如果轉換的型別是number,會執行以下步驟:

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

 2. 否則,如果input是物件,呼叫input.valueOf(),如果結果是原始值,返回結果;

 3. 否則,呼叫input.toString()。如果結果是原始值,返回結果;

 4. 否則,丟擲錯誤。

2) 如果轉換的型別是String,2和3會交換執行,即先執行toString()方法。

3)可以省略preferedType,此時,日期會被認為是字串,而其他的值會被當做Number。

①如果input是內建的Date型別,preferedType視為String

②否則視為Number,先呼叫valueOf,在呼叫toString

<2>ToBoolean(argument)

型別返回結果
Underfinedfalse
Nullfalse
Booleanargument
Number僅當argument為+0,-0或者NaN時,return false;否則return true
String僅當argument為空字串(長度為0)時,return false;否則return true
Symboltrue
Objecttrue

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

<3>ToNumber(argument)

型別返回結果
UnderfinedNaN
Null+0
Booleanargument為true,return 1;為false,return +0
Numberargument
String將字串中的內容轉化成數位,如'23'=>23;如果轉化失敗,則返回NaN,如‘23a’=>NaN
Symbol丟擲TypeError異常
Object**先primValue= toPrimitive(argument,number),在對primValue使用ToNumber(primValue)**

<4>ToString(argument)

型別返回結果
Underfined"underfined"
Null"null"
Booleanargument為true,return "true";為false,return "false"
Number用字串來表示這個數位
Stringargument
Symbol丟擲TypeError異常
Object**先primValue= toPrimitive(argument,string),在對primValue使用ToString(primValue)**

1.隱式型別轉換:

1.1-隱式轉換介紹

· 在js中,當運運算元在運算時,如果兩邊資料不統一,CPU就無法計算,這時我們編譯器會自動將運運算元兩邊的資料做一個資料型別轉換,轉成一樣的資料型別再計算

這種無需程式設計師手動轉換,而由編譯器自動轉換的方式就稱為隱式轉換

· 例如1 > "0"這行程式碼在js中並不會報錯,編譯器在運運算元時會先把右邊的"0"轉成數位0`然後在比較大小
————————————————
1.2-隱式轉換規則

(1). 轉成string型別: +(字串連線符)
(2).轉成number型別:++/–(自增自減運運算元) + - * / %(算術運運算元) > < >= <= == != === !=== (關係運算子)

加法規則
1.令lval=符號左邊的值,rval=符號右邊的值
2.令lprim=toPrimitive(lval),rprim=toPrimitive(rval)
如果lprim和rprim中有任意一個為string型別,將ToString(lprim)和ToString(rprim)的結果做字串拼接
否則,將ToNumber(lprim)和ToNumber(rprim)的結果做算數加法

雙等規則
1.xy都為Null或者underfined,return true;一方為Null或者underfined、NaN,return false
2.如果x和y為String,Number,Boolean並且型別不一致,都轉為Number在進行比較
3.如果存在Object,轉換為原始值在進行比較

   //特殊情況,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). 轉成boolean型別:!(邏輯非運運算元)

  //1.字串連線符與算術運運算元隱式轉換規則易混淆
  console.log(1+true)        // 1+Number(true) ==> 1+1=2
  //xy有一邊為string時,會做字串拼接
  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.會把其他資料型別轉換成number之後再比較關係
  //注意:左右兩邊都是字串時,是要按照字元對應的unicode編碼轉成數位。檢視字串unicode的方法:字串.charCodeAt(字串下標,預設為0)
 console.log('2'>'10')        //'2'.charCodeAt()>'10'.charCodeAt()=50>49==>true  

  //特殊情況,NaN與任何資料比較都是NaN
 console.log(NaN==NaN)        //false
 //3.複雜資料型別在隱式轉換時,原始值(valueOf())不是number,會先轉成String,然後再轉成Number運算
  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.邏輯非隱式轉換與關係運算子隱式轉換搞混淆(邏輯非,將其他型別轉成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.強制型別(顯式型別)轉換:

通過手動進行型別轉換,Javascript提供了以下轉型函數:

轉換為數值型別:Number(mix)、parseInt(string,radix)、parseFloat(string)
轉換為字串型別:toString(radix)、String(mix)
轉換為布林型別:Boolean(mix)

2.1 Boolean(value)、Number(value) 、String(value)

new Number(value) 、new String(value)、 new Boolean(value)傳入各自對應的原始型別的值,可以實現「裝箱」-----即將原始型別封裝成一個物件。其實這三個函數不僅可以當作建構函式,還可以當作普通函數來使用,將任何型別的引數轉化成原始型別的值。

其實這三個函數在型別轉換的時候,呼叫的就是js內部的ToBoolean(argument)、ToNumber(argument)、ToString(argument)
2.2 parseInt(string,radix)
將字串轉換為整數型別的數值。它也有一定的規則:

(1)忽略字串前面的空格,直至找到第一個非空字元
(2)如果第一個字元不是數位符號或者負號,返回NaN
(3)如果第一個字元是數位,則繼續解析直至字串解析完畢或者遇到一個非數位符號為止
(4)如果上步解析的結果以0開頭,則將其當作八進位制來解析;如果以0x開頭,則將其當作十六進位制來解析
(5)如果指定radix引數,則以radix為基數進行解析

   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裡面有兩個引數,第二個引數是十九進位制(0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i),額,1/0,好吧先運算 結果等於Infinity,
   //I好的十九進位制有認識,n十九進位制不存在不認識,不管後面有沒有了,立即返回i(i對應的十進位制中的18),所以返回18
    parseInt(1/0,16)                //NaN   //同上,16進位制滅有對應i,返回NaN
    parseInt(0.0000008)         //8    //String(0.0000008),結果為8e-7
    parseInt(0.000008)        //0
    parseInt(false,16)         //250   //16進位制,'f'認識, 'a'認識, 'l'哦,不認識,立即返回fa (十六進位制的fa轉換成十進位制等於250)
    parseInt('0x10'))          //16     //只有一個引數,好的,採用預設的十進位制, '0x',額,這個我認識,是十六進位制的寫法, 十六進位制的10轉換成十進位制等於16
    parseInt('10',2)              //2     //返回二進位制的10 轉換成十進位制等於2

2.3 parseFloat(string)

將字串轉換為浮點數型別的數值.規則:

它的規則與parseInt基本相同,但也有點區別:字串中第一個小數點符號是有效的,另外parseFloat會忽略所有前導0,如果字串包含一個可解析為整數的數,則返回整數值而不是浮點數值。

2.4 toString(radix)

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

【相關推薦:

以上就是javascript中資料型別轉換分為哪兩種的詳細內容,更多請關注TW511.COM其它相關文章!