為什么要進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換钟些?
首先我們知道JavaScript 是一種動(dòng)態(tài)類型語(yǔ)言,變量沒(méi)有類型限制坯认,可以隨時(shí)賦予任意值翻擒。
變量的數(shù)據(jù)類型是不確定的,但是各種運(yùn)算符對(duì)數(shù)據(jù)類型是有要求的牛哺。
如果運(yùn)算符發(fā)現(xiàn)陋气,運(yùn)算子的類型與預(yù)期不符,就會(huì)自動(dòng)轉(zhuǎn)換類型引润。(這個(gè)時(shí)候就需要各種數(shù)據(jù)類型轉(zhuǎn)換的函數(shù)巩趁,為了增加語(yǔ)言的便捷性,減少報(bào)錯(cuò))
比如淳附,減法運(yùn)算符預(yù)期左右兩側(cè)的運(yùn)算子應(yīng)該是數(shù)值议慰,如果不是蠢古,就會(huì)自動(dòng)將它們轉(zhuǎn)為數(shù)值。
一别凹、轉(zhuǎn)換為數(shù)字number
1草讶、Number()
使用 Number
函數(shù),可以將任意類型的值轉(zhuǎn)化成數(shù)值
- 數(shù)值:轉(zhuǎn)換后還是原來(lái)的值
例:Number(324) // 324
- 字符串:
如果可以被解析為數(shù)值番川,則轉(zhuǎn)換為相應(yīng)的數(shù)值
例:Number('324') // 324
如果不可以被解析為數(shù)值到涂,返回 NaN
例:Number('324abc') // NaN
空字符串轉(zhuǎn)為0
例:Number('') // 0
- 布爾值:true 轉(zhuǎn)成 1,false 轉(zhuǎn)成 0
例:
Number(true) // 1
Number(false) // 0
- undefined:轉(zhuǎn)成 NaN
例:Number(undefined) // NaN
- null:轉(zhuǎn)成0
例:Number(null) // 0
2颁督、parseInt()
-
parseInt(string, radix)
践啄,可多傳入一個(gè)參數(shù) radix(即進(jìn)制),表示傳入 string 的進(jìn)制沉御,默認(rèn)值為10屿讽,即十進(jìn)制。始終指定此參數(shù)可以消除閱讀該代碼時(shí)的困惑吠裆,并且保證轉(zhuǎn)換結(jié)果可預(yù)測(cè)伐谈。
例:parseInt('123', 5) // 將'123'看作5進(jìn)制數(shù),返回十進(jìn)制數(shù)38 => 1*5^2 + 2*5^1 + 3*5^0 = 38
-
區(qū)別:
Number()
遇到不能無(wú)法轉(zhuǎn)成數(shù)值的字符時(shí)试疙,會(huì)直接轉(zhuǎn)換為NaN诵棵,而parseInt()
逐個(gè)解析字符,直到遇到可轉(zhuǎn)換的字符祝旷。
例:parseInt("FXX12", 10) //返回12
- 當(dāng)然履澳,如果
parseInt
遇到了不屬于radix參數(shù)所指定的基數(shù)中的字符,那么該字符和其后的字符都將被忽略。接著返回已經(jīng)解析的整數(shù)部分怀跛。
例1:parseInt("FXX12XX", 10) // 返回12
例2:parseInt("546", 2); // 返回NaN距贷,除了“0、1”外吻谋,其它數(shù)字都不是有效二進(jìn)制數(shù)字
3忠蝗、parseFloat()
-
parseFloat()
函數(shù)解析一個(gè)字符串參數(shù)并返回一個(gè)浮點(diǎn)數(shù)。
parseFloat("3.14"); // 返回3.14
- 如果在解析過(guò)程中遇到了正負(fù)號(hào)(+或-),數(shù)字(0-9),小數(shù)點(diǎn),或者科學(xué)記數(shù)法中的指數(shù)(e或E)以外的字符,則它會(huì)忽略該字符以及之后的所有字符,返回當(dāng)前已經(jīng)解析到的浮點(diǎn)數(shù).
parseFloat("314e-2")// 返回3.14;
- 如果參數(shù)字符串的第一個(gè)字符不能被解析成為數(shù)字,則parseFloat返回NaN漓拾。
parseFloat("FF2")// 返回 NaN
4阁最、黑科技
‘x’ - 0和+‘x’,這兩種方法等價(jià)于Number()
函數(shù)(因?yàn)檫@種操作會(huì)在內(nèi)部隱性調(diào)用Number()
)骇两,x不能包含非數(shù)字的字符串闽撤。
注意:null轉(zhuǎn)為數(shù)值時(shí)為0,而undefined轉(zhuǎn)為數(shù)值時(shí)為NaN脯颜。
null + 1 // 1
undefined + 1 // NaN
二、轉(zhuǎn)換為字符串string
1贩据、string()
String
函數(shù)可以將任意類型的值轉(zhuǎn)化成字符串栋操。
- 數(shù)值:轉(zhuǎn)為相應(yīng)的字符串闸餐。
String(123) // "123"
- 字符串:轉(zhuǎn)換后還是原來(lái)的值。
String('abc') // "abc"
- 布爾值:true轉(zhuǎn)為字符串"true"矾芙,false轉(zhuǎn)為字符串"false"舍沙。
String(true) // "true"
- undefined:轉(zhuǎn)為字符串"undefined"。
String(undefined) // "undefined"
- null:轉(zhuǎn)為字符串"null"剔宪。
String(null) // "null"
- String方法的參數(shù)如果是對(duì)象拂铡,返回一個(gè)類型字符串;如果是數(shù)組葱绒,返回該數(shù)組的字符串形式感帅。
String({a: 1}) // "[object Object]"
String([1, 2, 3]) // "1,2,3"
2、toString() 方法
-
.toString()
可以將所有的的數(shù)據(jù)都轉(zhuǎn)換為字符串地淀,但是不能轉(zhuǎn)換 null 和 undefined -
.toString()
括號(hào)中的可以寫傳入一個(gè)參數(shù) radix失球,代表進(jìn)制,對(duì)應(yīng)進(jìn)制字符串(默認(rèn)是10)帮毁,string() 則不行
var t = 8;
t.toString(2); //1000
需要注意的是不要寫成:
1.toString(); //JS會(huì)報(bào)錯(cuò)(Uncaught SyntaxError: Invalid or unexpected token)
因?yàn)閖s會(huì)將1后面的點(diǎn) . 當(dāng)成是小數(shù)點(diǎn)实苞,在js眼中就是這樣的,自然會(huì)報(bào)錯(cuò)
1
.toString()
可以寫成
(1).toString();//1 加上括號(hào)就可避免這樣的問(wèn)題
或者 1..toString();
3烈疚、黑科技:+ ‘’
, JavaScript 遇到預(yù)期為字符串的地方黔牵,就會(huì)將非字符串的值自動(dòng)轉(zhuǎn)為字符串。
三爷肝、轉(zhuǎn)換為布爾值boolean
1猾浦、Boolean函數(shù)可以將任意類型的值轉(zhuǎn)為布爾值。
除了以下五個(gè)值的轉(zhuǎn)換結(jié)果為false阶剑,其他的值全部為true跃巡,這五個(gè)值稱之為 falsy 值。
- undefined
- null
- -0或+0
- NaN
- ''(空字符串)
Tips:所有對(duì)象(包括空對(duì)象)的轉(zhuǎn)換結(jié)果都是true牧愁,甚至連false對(duì)應(yīng)的布爾對(duì)象new Boolean(false)也是true
2素邪、黑科技
- !! ‘x’:兩次取反,內(nèi)部調(diào)用的也是Boolean函數(shù)