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)
型別 | 返回結果 |
Underfined | false |
Null | false |
Boolean | argument |
Number | 僅當argument為+0,-0或者NaN時,return false;否則return true |
String | 僅當argument為空字串(長度為0)時,return false;否則return true |
Symbol | true |
Object | true |
注意:除了underfined,null,false,NaN,’’,0,-0,其他都返回true
<3>ToNumber(argument)
型別 | 返回結果 |
Underfined | NaN |
Null | +0 |
Boolean | argument為true,return 1;為false,return +0 |
Number | argument |
String | 將字串中的內容轉化成數位,如'23'=>23;如果轉化失敗,則返回NaN,如‘23a’=>NaN |
Symbol | 丟擲TypeError異常 |
Object | **先primValue= toPrimitive(argument,number),在對primValue使用ToNumber(primValue)** |
<4>ToString(argument)
型別 | 返回結果 |
Underfined | "underfined" |
Null | "null" |
Boolean | argument為true,return "true";為false,return "false" |
Number | 用字串來表示這個數位 |
String | argument |
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其它相關文章!