閱讀245 返回首頁    go 阿裏雲 go 技術社區[雲棲]


JavaScript 類型轉換

JavaScript的數據類型

在 JavaScript 中有 5 種不同的數據類型:

string、number、boolean、object、function

3 種對象類型:

Object、Date、Array

2 個不包含任何值的數據類型:

null、undefined

轉換和相等性

null==undefined //這兩值被認為相等

“0”=0 //在比較之前字符串轉換成數字

0==false //在比較之前布爾值轉換成數字

“0”==false //在比較之前字符串和布爾值都轉換成數字

“==”等於運算符在判斷兩個值是否相等時會進行類型轉換,但一個值轉換為另一個值並不意味著兩個值相等。而“===”恒等運算符在判斷相等時並未做任何類型轉換。

JS 數據類型轉換 方法主要有三種

轉換函數、強製類型轉換、利用js變量弱類型轉換

轉換函數

轉換為數值類型:Number(mix)、parseInt(string,radix)、parseFloat(string)

轉換為字符串類型:toString(radix)、String(mix)

轉換為布爾類型:Boolean(mix)

js提供了parseInt()和parseFloat()兩個轉換函數;前者把值轉換成整數,後者把值轉換成浮點數;使用Boolean()、Number()、String()或Object()函數進行顯示類型轉換;隻有對String類型調用這些方法,這兩個函數才能正確運行;對其他類型返回的都是NaN

在判斷字符串是否是數字值前,parseInt()和parseFloat()都會仔細分析該字符串;parseInt()方法首先查看位置0處的字符,判斷它是否是個有效數字;如果不是,該方法將返回NaN,不再繼續執行其他操作;但如果該字符是有效數字,該方法將查看位置1處的字符,進行同樣的測試;這一過程將持續到發現非有效數字的字符為止,此時parseInt()將把該字符之前的字符串轉換成數字

Number(mix)

1.如果是布爾值,true和false分別被轉換為1和0

2.如果是數字值,返回本身

3.如果是null,返回0

4.如果是undefined,返回NaN

5.如果是字符串,遵循以下規則:

(1)如果字符串中隻包含數字,則將其轉換為十進製(忽略前導0)

(2)如果字符串中包含有效的浮點格式,將其轉換為浮點數值(忽略前導0)

(3)如果是空字符串,將其轉換為0

(4)如果字符串中包含非以上格式,則將其轉換為NaN

6.如果是對象,則調用對象的valueOf()方法,然後依據前麵的規則轉換返回的值。如果轉換的結果是NaN,則調用對象的toString()方法,再次依照前麵的規則轉換返回的字符串值。

parseInt(string,radix)

此函數在轉換字符串時,更多的是看是否符合數值模式

1.忽略字符串前麵的空格,直至找到第一個非空字符

2.如果第一個字符不是數字符號或者負號,返回NaN

3.如果第一個字符是數字,則繼續解析直至字符串解析完畢或者遇到一個非數字符號為止

4.如果上步解析的結果以0開頭,則將其當作八進製來解析;如果以0x開頭,則將其當作十六進製來解析

5.如果指定radix參數,則以radix為基數進行解析

parseFloat(string)

字符串第一個小數點有效,和parseInt()區別是會忽略前導0

toString(radix)、String(mix)

數值、布爾值、對象和字符串值都可以使用toString()方法,但是null和undefined沒有toString()方法;在不知道轉換的是不是null和undefined的時候,使用轉型函數String()

1.若值有toString()方法,則調用此方法並返回相應的結果

2.若值是null,則返回”null”

3.若值是undefined,則返回”undefined”

Boolean(mix)

false、””、0、NaN、null、undefined會被轉換為false,其餘任何值都會被轉換為true

Number(“1”) //3
String(false) //”false”,等價於false.toString()
【另外注意:除了null、undefined之外的任何值都有toString()方法】
Boolean([]) //true
Object(3) //new Number(3)
parseInt("1234blue") //returns 1234 
parseInt("0xA") //returns 10 
parseInt("22.5") //returns 22 
parseInt("blue") //returns NaN

parseInt()方法還有基模式,可以把二進製、八進製、十六進製或其他任何進製的字符串轉換成整數。基是由parseInt()方法的第二個參數指定的,所以要解析十六進製的值,需如下調用parseInt()方法

parseInt("AF",   16);   //returns   175 
當然,對二進製、八進製,甚至十進製(默認模式),都可以這樣調用parseInt()方法: 
parseInt("10",   2);   //returns   2 
parseInt("10",   8);   //returns   8 
parseInt("10",   10);   //returns   10 

如果十進製數包含前導0,那麼最好采用基數10,這樣才不會意外地得到八進製的值

parseInt("010");   //returns   8 
parseInt("010",   8);   //returns   8 
parseInt("010",   10);   //returns   10 

parseFloat()方法與parseInt()方法的處理方式相似,從位置0開始查看每個字符,直到找到第一個非有效的字符為止,然後把該字符之前的字符串轉換成數字;不過,對於這個方法來說,第一個出現的小數點是有效字符。如果有兩個小數點,第二個小數點將被看作無效的, parseFloat()方法會把這個小數點之前的字符串轉換成數字。這意味著字符串 "22.34.5 "將被解析成22.34

使用parseFloat()方法的另一不同之處在於,字符串必須以十進製形式表示浮點數,而不能用八進製形式或十六進製形式;該
方法會忽略前導0,所以八進製數0908將被解析為908。對於十六進製數0xA,該方法將返回NaN,因為在浮點數中,x不是有效字符。此外,parseFloat()也沒有基模式

parseFloat("1234blue");   //returns   1234.0 
parseFloat("0xA");   //returns   NaN 
parseFloat("22.5");   //returns   22.5 
parseFloat("22.34.5");   //returns   22.34 
parseFloat("0908");   //returns   908 
parseFloat("blue");   //returns   NaN

強製類型轉換

還可使用強製類型轉換(type casting)處理轉換值的類型;使用強製類型轉換可以訪問特定的值,即使它是另一種類型的

ECMAScript中可用的3種強製類型轉換如下:

Boolean(value)——把給定的值轉換成Boolean型

Number(value)——把給定的值轉換成數字(可以是整數或浮點數)

String(value)——把給定的值轉換成字符串

用這三個函數之一轉換值,將創建一個新值存放由原始值直接轉換成的值;這會造成意想不到的後果

當要轉換的值是至少有一個字符的字符串、非0數字或對象時,Boolean()函數將返回true。如果該值是空字符串、數字0、undefined或null,它將返回false。

可以用下麵的代碼段測試Boolean型的強製類型轉換

Boolean("");   //false   –   empty   string 
Boolean("hi");   //true   –   non-empty   string 
Boolean(100);   //true   –   non-zero   number 
Boolean(null);   //false   -   null 
Boolean(0);   //false   -   zero 
Boolean(new   Object());   //true   –   object

Number()的強製類型轉換與parseInt()和parseFloat()方法的處理方式相似,隻是它轉換的是整個值,而不是部分值;parseInt()和parseFloat()方法隻轉換第一個無效字符之前的字符串,因此 "4.5.6 "將被轉換為 "4.5 ";用Number()進行強製類型轉換, "4.5.6 "將返回NaN,因為整個字符串值不能轉換成數字。如果字符串值能被完整地轉換,Number()將判斷是調用parseInt()方法還是調用 parseFloat()方法;

下表說明了對不同的值調用Number()方法會發生的情況:

用  法 結  果
Number(false) 0
Number(true) 1
Number(undefined) NaN
Number(null) 0
Number( "5.5 ") 5.5
Number( "56") 56
Number( "5.6.7 ") NaN
Number(new Object()) NaN
Number(100) 100

最後一種強製類型轉換方法String()是最簡單的,因為它可把任何值轉換成字符串;要執行這種強製類型轉換,隻需要調用作為參數傳遞進來的值的toString()方法,即把1轉換成"1 ",把true轉換成"true ",把false轉換成"false",依此類推;強製轉換成字符串和調用toString()方法的唯一不同之處在於:對null或undefined值強製類型轉換可以生成字符串而不引發錯誤:

var   s1   =   String(null);   //"null" 
var   oNull   =   null; 
var   s2   =   oNull.toString();   //won’t   work,   causes   an   error

利用js變量弱類型轉換

隱式轉換主要分為三個方麵:

js中的某些運算符會做隱式的類型轉換。如果”+”運算符的一個操作數是字符串,它將會把另外一個操作數轉換為字符串;一元“+”運算符將其操作數轉換為數字。一元“!”運算符將其操作數轉換為布爾值並取反

<script> 
    var str= '012.345 '; 
    var x = str-0; 
    x = x*1;
</script>


`x+"" //等價於String(x)
+x //等價於Number(x),也可以寫成x-0
!!x //等價於Boolean(x)

對象轉換為原始值

對象到布爾值的轉換非常簡單:所有對象(包括數組和函數)都轉換為true。

所有的對象繼承了兩個轉換方法:

1、toString():它的作用是返回一個反映這個對象的字符串。默認的toString()方法並不會返回一個有趣的值

2、valueOf():如果存在任意原始值,它就默認將對象轉換為表示它的原始值。對象是複合值,而且大多數對象無法真正表示為一個原始值,因此默認的valueOf()方法簡單地返回對象本身,而不是返回一個原始值。

js中對象到字符串的轉換經過如下步驟

①如果對象有toString()方法,則調用這個方法。如果返回一個原始值,js將這個值轉換為字符串(如果本身不是字符串),並返回這個字符串結果

②如果對象沒有toString()方法,或者這個方法返回的並不是一個原始值,那麼js會調用valueOf()方法(如果存在此方法)。如果返回值是原始值,js將這個值轉換為字符串(如果本身不是字符串的話),並返回這個字符串結果

③否則,js無法從toString()或valueOf()獲得一個原始值,因此這時它將拋出一個類型錯誤異常

js中對象到數字的轉換過程中,js做了同樣的事情,隻是它會首先嚐試使用valueOf()方法

①如果對象具有valueOf()方法,或者返回一個原始值,則js將這個原始值轉換為數字(如果需要的話)並返回、這個數字

②否則,如果對象具有toString()方法,後者返回一個原始值,則js將其轉換並返回

③否則,js拋出一個類型錯誤異常

最後更新:2017-04-29 03:30:39

  上一篇:go H5響應式網站建設該如何規劃
  下一篇:go HTML DOM 事件對象