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
上一篇:
H5響應式網站建設該如何規劃
下一篇:
HTML DOM 事件對象
DEV ComboBoxEdit 控件
PLSQL Developer V9.0.2.1621 注冊碼
數據倉庫和數據集市簡介
【雲周刊】第128期:首屆阿裏巴巴研發效能嘉年華——支撐千億營收背後秘密,6月29日獨家直播
分布式服務框架Dubbo瘋狂更新!阿裏開源要搞大事情?
阿裏雲2017財年營收達66.63億元 連續8個季度超過100%增長
Android 發送HTTP GET POST 請求以及通過 MultipartEntityBuilder 上傳文件(二)
ffmpeg-php 視頻格式轉換
C++ 多態機製淺析
《Vim實用技巧(第2版)》——第2章 普通模式 2.1停頓時請移開畫筆