前面我們已經(jīng)講解了變量的類型银受,在上一章奋岁,我們了解了基礎(chǔ)的類型以及類型的含義以及用法澳厢。在這一章中环础,我們將了解變量的轉(zhuǎn)換的一些知識。
首先我們要了解什么是類型轉(zhuǎn)換剩拢,顧名思義就是將數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換线得,例如原有的類型是一個number類型將其轉(zhuǎn)換成string類型,這就是所謂的類型轉(zhuǎn)換徐伐。
在JS中我們常見的類型轉(zhuǎn)換有兩種贯钩,顯式類型轉(zhuǎn)換和隱式類型轉(zhuǎn)換下面我們一一來說明
一:顯式類型轉(zhuǎn)換
顧名思義,是一種顯而易見的類型轉(zhuǎn)換呵晨,也就是說我們或者編譯器通過代碼就能清楚的知道是要進(jìn)行類型轉(zhuǎn)換魏保。下面我們看下常見的幾種顯式類型轉(zhuǎn)換
字符串與數(shù)字間的類型轉(zhuǎn)換
在js中字符串通過String()或者toString(),數(shù)字通過Number()來進(jìn)行顯示的類型轉(zhuǎn)換,看下面的代碼
var total = 12;
var totalStr= '12';
console.log(typeof String(total)) // string
console.log(typeof total.toString()) // string
console.log(typeof Number(totalStr)) // number
對于強制轉(zhuǎn)換成字符串從我的角度覺得沒有什么好說明的摸屠,但是對于Number就需要跟我們解析數(shù)字字符串方法進(jìn)行對比了谓罗。我們來看下以下代碼
var total = '12';
var totalName = '12個';
console.log(Number(total)); // 12
console.log(parseInt(total)); // 12
console.log(Number(totalName)); // nan
console.log(parseInt(totalName)); // 12
為什么會出現(xiàn)這種不一致的情況呢?其實很簡單季二,因為解析方法(parseInt,parseFloat)在解析的時候允許字符串中出現(xiàn)非數(shù)字檩咱,其解析會解析到非數(shù)字的字符,然后將數(shù)字返回胯舷,而Number強制類型轉(zhuǎn)換刻蚯,是需要將字符串顯示的的轉(zhuǎn)成數(shù)字,如果出現(xiàn)非數(shù)字的情況自然而然的會需要提示此字符串不是一個數(shù)字桑嘶,所以無法轉(zhuǎn)換炊汹。那么parseInt是如何解析的呢?
我們可以看到此方法接受兩個參數(shù)逃顶,參數(shù)1為一字符串讨便,參數(shù)二為一基數(shù)充甚。默認(rèn)基數(shù)為10.因此執(zhí)行的過程為
1:將參數(shù)轉(zhuǎn)換成字符串
2:然后從開頭進(jìn)行解析,解析到第一個非數(shù)字的字符為止霸褒。
因此伴找,我們可以來看看以下的代碼
console.log(parseInt(0.01)) // 0
console.log(parseInt(0.0000008)); // 8
console.log(parseInt({
num:12
})); // NAN
console.log(parseInt({
num:12,
toString:function(){return 24}
})); // 24
parseInt(parseInt,16); // 15
為什么和我們想象的不一樣呢,具體原因就是我前面提到的废菱,參數(shù)會先轉(zhuǎn)換成字符串技矮,然后進(jìn)行解析。所以我們可以一一來看上面的問題
1: 0.01,轉(zhuǎn)換成字符串是'0.01',解析到.的時候結(jié)束殊轴,所以為0
2:0.0000008,轉(zhuǎn)成成字符串衰倦,由于位數(shù)很大,故為'8e-7'旁理,解析到e為止耿币,故為8
3:{num:12} ,是一 對象韧拒,再執(zhí)行其toString方法后會變成'[object Object]',故NAN
4: { num:12,toString:function(){return 24}},因為重新的toString方法,在執(zhí)行轉(zhuǎn)換成字符串的時候十性,執(zhí)行toString方法叛溢,故24
5:parseInt方法在執(zhí)行toString()方法后是一個function,執(zhí)行16進(jìn)制劲适,為15
顯示轉(zhuǎn)換為布爾類型
在JS中提供一Boolean方法楷掉,其方法可以將傳入的參數(shù)轉(zhuǎn)換為true和false,那么具體哪些值會轉(zhuǎn)換成true哪些會轉(zhuǎn)換成false呢?看下表
數(shù)據(jù)類型 | true | false |
---|---|---|
字符串 | 非空字符串 | '' |
數(shù)字 | 非0數(shù)字 | 0 |
布爾類型 | true | false |
對象 | 所有數(shù)組霞势,對象烹植,方法 | 無 |
null | 無 | null |
undefined | 無 | undefined |
二:隱式類型轉(zhuǎn)換
顧名思義,與顯示的類型轉(zhuǎn)換相反愕贡,不是顯示的去告訴人們以及編譯器需要轉(zhuǎn)換的格式草雕,而有編譯器根據(jù)一些規(guī)則,自動的去轉(zhuǎn)換固以。下面我們來看看常見的隱式轉(zhuǎn)換
數(shù)字和字符串間的隱式轉(zhuǎn)換
我們首先來看下以下代碼
var a = '12';
var b = '0';
var c = 12;
var d = 0;
var e = [1,2];
var f = 3;
console.log(a + b); // '120'
console.log(c+ d); // 12
console.log(e + f); // 1,23
為什么會這樣呢墩虹?首先我們來看+的作用,在js中其既能當(dāng)做一個數(shù)字的加也可作為字符串拼接憨琳。所以有了以下規(guī)則
1:如果數(shù)據(jù)類型皆為數(shù)字诫钓,則執(zhí)行加法
2:如果數(shù)據(jù)類型不同,在執(zhí)行字符串拼接篙螟。字符串拼接又有如下規(guī)則:
1:將數(shù)據(jù)轉(zhuǎn)換成字符串菌湃,對象以及數(shù)組調(diào)用其toString方法。
2:將字符串進(jìn)行拼接遍略。
按照以上規(guī)則惧所,所以以上代碼的執(zhí)行結(jié)果也就能理解了
隱式轉(zhuǎn)換為布爾類型數(shù)據(jù)
相比字符串以及數(shù)字骤坐,轉(zhuǎn)換成布爾類型的情況就很明顯,一般會在以下幾種情況下會出現(xiàn)
1:if語句中
2:for循環(huán)的第二個判斷中
3:while循環(huán)中
4:邏輯與(&&)或非(||)中
5:三元運算符中
對此就不一一說明了纯路,因為都是常見的方法或油。
判斷相等(==)
其實在日常開發(fā)中,我們?nèi)绻枰袛嘞嗤那闆r不推薦使用==而是推薦===驰唬,具體原因就是==會將數(shù)據(jù)進(jìn)行隱式的類型轉(zhuǎn)換顶岸,從而導(dǎo)致判斷不準(zhǔn)確。我們先來看看以下代碼
console.log(12=='12'); // true
console.log(true == 12); // false
console.log(true == '12'); // false
console.log(null == 12); // false
console.log(null == false); // false
console.log(null == undefined); // true
console.log(undefined == false); // false
console.log(null == 0); // false
console.log(undefined == 0);// false
console.log({a:12} == true);// false
console.log({a:12,toString:function(){return 0}} ==false);//true
為什么會有很多跟我們設(shè)想的不一樣呢叫编?我們先來看看js的規(guī)則辖佣。
1:如果雙方類型相同,則執(zhí)行該類型下的對比方法
2:如果為字符串和數(shù)子對比搓逾,則將字符串強制轉(zhuǎn)換成數(shù)子(Number)然后執(zhí)行數(shù)子間的比對
3:如果存在布爾類型卷谈,將布爾類型轉(zhuǎn)換成數(shù)子,然后進(jìn)行數(shù)子間的比對
4:如果存在對象霞篡,則執(zhí)行對象toString()方法后再按照以上規(guī)則執(zhí)行
按照以上邏輯我想上面的結(jié)果也就很明確了.
ps:上面提到過將數(shù)組以及對象轉(zhuǎn)換成基本類型后再進(jìn)行數(shù)據(jù)對比世蔗,那么具體的規(guī)則是什么呢?
1:查看需要轉(zhuǎn)換的值是否有valueof方法朗兵,
2:如果存在valueOf方法污淋,如果有且返回的是基本類型,則用此返回
3:如果不存在valueOf方法余掖,或者valueOf方法返回的不是基本類型寸爆,那么則調(diào)用toString方法
以上為本次的類型轉(zhuǎn)換,下面我們將講解特殊的變量數(shù)組盐欺,以及其常見的方法