天天看點

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()将把該字元之前的字元串轉換成數字

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()方法,再次依照前面的規則轉換傳回的字元串值。

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

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

2.如果第一個字元不是數字元号或者負号,傳回nan

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

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

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

字元串第一個小數點有效,和parseint()差別是會忽略前導0

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

1.若值有tostring()方法,則調用此方法并傳回相應的結果

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

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

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

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

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

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

使用parsefloat()方法的另一不同之處在于,字元串必須以十進制形式表示浮點數,而不能用八進制形式或十六進制形式;該

方法會忽略前導0,是以八進制數0908将被解析為908。對于十六進制數0xa,該方法将傳回nan,因為在浮點數中,x不是有效字元。此外,parsefloat()也沒有基模式

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

ecmascript中可用的3種強制類型轉換如下:

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

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

string(value)——把給定的值轉換成字元串

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

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

可以用下面的代碼段測試boolean型的強制類型轉換

number()的強制類型轉換與parseint()和parsefloat()方法的處理方式相似,隻是它轉換的是整個值,而不是部分值;parseint()和parsefloat()方法隻轉換第一個無效字元之前的字元串,是以 "4.5.6 "将被轉換為 "4.5 ";用number()進行強制類型轉換, "4.5.6 "将傳回nan,因為整個字元串值不能轉換成數字。如果字元串值能被完整地轉換,number()将判斷是調用parseint()方法還是調用 parsefloat()方法;

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

用  法

結  果

number(false)

number(true)

1

number(undefined)

nan

number(null)

number( "5.5 ")

5.5

number( "56")

56

number( "5.6.7 ")

number(new object())

number(100)

100

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

隐式轉換主要分為三個方面:

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

對象到布爾值的轉換非常簡單:所有對象(包括數組和函數)都轉換為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抛出一個類型錯誤異常

繼續閱讀