javaScript類型轉(zhuǎn)換
標(biāo)簽(空格分隔): 未分類
隱式轉(zhuǎn)換
當(dāng)遇到以下幾種情況,JavaScript會(huì)自動(dòng)轉(zhuǎn)換數(shù)據(jù)類型:
不同類型的數(shù)據(jù)進(jìn)行互相運(yùn)算
對(duì)非布爾值類型的數(shù)據(jù)求布爾值
對(duì)非數(shù)值類型的數(shù)據(jù)使用一元運(yùn)算符(即 "+" 和 "-")
注意事項(xiàng):
1.一個(gè)是number一個(gè)是string時(shí)金刁,會(huì)嘗試將string轉(zhuǎn)換為number,但+除外
2.undefined與null相等,但不恒等(===)
3.“==”會(huì)對(duì)不同類型值進(jìn)行類型轉(zhuǎn)換再判斷,“===”則不會(huì)。它會(huì)先判斷兩邊的值類型晰赞,類型不匹配時(shí)直接為false陈醒。
4.對(duì)于0、空字符串的判斷或杠,建議使用 “===” 。
5.隱式轉(zhuǎn)換將boolean轉(zhuǎn)換為number宣蔚,0或1
6.隱式轉(zhuǎn)換將Object轉(zhuǎn)換成number或string廷痘,取決于另外一個(gè)對(duì)比量的類型
隱式轉(zhuǎn)換為 Boolean
大多數(shù)在做 if 判斷時(shí)會(huì)用到,這里只需記住六個(gè)轉(zhuǎn)換為 false件已,其它全部為 true
null
undefined
NaN
''
-0
+0
隱式轉(zhuǎn)換為 String
字符串的自動(dòng)轉(zhuǎn)換笋额,主要發(fā)生在加法運(yùn)算時(shí)。當(dāng)一個(gè)值為字符串篷扩,另一個(gè)值為非字符串兄猩,則后者轉(zhuǎn)為字符串。
'1' + 2 // '12'
'1' + true // "1true"
'1' + false // "1false"
'1' + {} // "1[object Object]"
'1' + [] // "1"
'1' + function (){} // "1function (){}"
'1' + undefined // "1undefined"
'1' + null // "1null"
隱式轉(zhuǎn)換為 Number
除了加法運(yùn)算符有可能把運(yùn)算子轉(zhuǎn)為字符串,其他運(yùn)算符都會(huì)把兩側(cè)的運(yùn)算子自動(dòng)轉(zhuǎn)成數(shù)值
'5' - '2' // 3
'5' * '2' // 10
true - 1 // 0
false - 1 // -1
'1' - 1 // 0
'5' * [] // 0
false / '5' // 0
'abc' - 1 // NaN
+'abc' // NaN
-'abc' // NaN
+true // 1
-false // 0
關(guān)系運(yùn)算符
什么是關(guān)系運(yùn)算符
用于進(jìn)行比較的運(yùn)算符稱為關(guān)系運(yùn)算符枢冤;大于(>),小于(<),等于(==),大于等于(>=)小于等于(<=);不等于(鸠姨!=)全等(===)不全等(!==)淹真;
比較的運(yùn)算法則
如果兩個(gè)都是Number類型讶迁,則互相比較;
如果兩個(gè)都是數(shù)值字符串則比較第一位字符核蘸;
如果兩個(gè)都是字符串類型巍糯,則比較ASCII編碼;
如果有一個(gè)是字符串?dāng)?shù)值類型客扎,則轉(zhuǎn)為數(shù)值然后比較祟峦;
如果有一個(gè)是對(duì)象,則調(diào)用toString或Valueof徙鱼;
在相等和不等的比較上宅楞,如果操作數(shù)是非數(shù)值,則遵循以下規(guī)則
一個(gè)操作數(shù)是布爾值袱吆,則比較之前將其準(zhǔn)換為數(shù)值厌衙,false轉(zhuǎn)0,true轉(zhuǎn)為1绞绒;
一個(gè)操作數(shù)是字符串婶希,則比較之前將其準(zhǔn)換為數(shù)值再比較;
一個(gè)操作數(shù)是對(duì)象处铛,則先調(diào)用valueOf()或者toStirng()方法后在和返回值做比較
不需要任何轉(zhuǎn)換的情況下饲趋,null和undefined是相等的拐揭;
一個(gè)操作數(shù)是NaN,則==返回false !=返回true;并且NaN和自身不等撤蟆;
兩個(gè)操作數(shù)都是對(duì)象,則比較他們是否是同一個(gè)對(duì)象堂污,如果都指向同一個(gè)對(duì)象則返回true家肯;
在全等和不等的判斷上,只有值和類型都想等盟猖,才返回true;
**注意undefined在比較時(shí)不會(huì)自動(dòng)準(zhǔn)換讨衣,而字符串可以;
'''
面試題:
true == 3 //false 如果有一個(gè)是布爾值式镐,則把他轉(zhuǎn)換成數(shù)值然后再比較反镇;
'''
隱式轉(zhuǎn)換的基礎(chǔ)表現(xiàn)都在這了,強(qiáng)調(diào)的是這些轉(zhuǎn)換的背后都伴隨著強(qiáng)制轉(zhuǎn)換娘汞,使用 Boolean歹茶、Number 和 String。
實(shí)例及思維導(dǎo)圖
![加法運(yùn)算符] (http://d47ef1ca.wiz03.com/share/resources/a610f6dd-3fa8-4a79-8069-f2af6c315a7b/index_files/0bca5f1422a35b60a559f07a5c6344bb.png)
強(qiáng)制轉(zhuǎn)換
看到上面例子也許你已經(jīng)有些許疑問(wèn)了,比如上面的這個(gè) '1' + {} 怎么就輸出 1[object Object] 了呢
如上面強(qiáng)調(diào)的惊豺,你會(huì)猜測(cè)首先執(zhí)行 String({}) 得到 "[object Object]" 燎孟,然后再字符串拼接,是的我們總能得到轉(zhuǎn)換背后的實(shí)現(xiàn)原理尸昧,其實(shí)真實(shí)原理要比這個(gè)復(fù)雜揩页,見(jiàn)下文
強(qiáng)制轉(zhuǎn)換為 Boolean
這里略過(guò)因?yàn)榕c隱式轉(zhuǎn)換相同,切記 []烹俗、{} 都轉(zhuǎn)換成 true
強(qiáng)制轉(zhuǎn)換為 String
基本類型的轉(zhuǎn)換結(jié)果與隱式轉(zhuǎn)換相同爆侣,這里說(shuō)一下對(duì)象的轉(zhuǎn)換,加深上面引用例子的解析
對(duì)象轉(zhuǎn)換字符串分成三步
1.先調(diào)用toString方法衷蜓,如果toString方法返回的是原始類型的值累提,則對(duì)該值使用String方法,不再進(jìn)行以下步驟
2.如果toString方法返回的是復(fù)合類型的值磁浇,再調(diào)用valueOf方法斋陪,如果valueOf方法返回的是原始類型的值,則對(duì)該值使用String方法置吓,不再進(jìn)行以下步驟
3.如果valueOf方法返回的是復(fù)合類型的值无虚,則報(bào)錯(cuò)
再分解這個(gè)例子
String({})
// "[object Object]"
上面代碼相當(dāng)于下面這樣
String({}.toString())
// "[object Object]"
如果 toString 方法和 valueOf 方法,返回的都不是原始類型的值衍锚,則 String 方法報(bào)錯(cuò)
var obj = {
valueOf: function () {
console.log("valueOf");
return {};
},
toString: function () {
console.log("toString");
return {};
}
};
String(obj)
// TypeError: Cannot convert object to primitive value
我們不難看出可以對(duì) toString 方法和 valueOf 方法進(jìn)行改寫(xiě)友题,測(cè)試其先后運(yùn)行的順序也簡(jiǎn)單的多
String({toString:function(){return 3;}})
// "3"
String({valueOf:function (){return 2;}})
// "[object Object]"
String({valueOf:function (){return 2;},toString:function(){return 3;}})
// "3"
結(jié)果表示toString方法先于valueOf方法執(zhí)行
強(qiáng)制轉(zhuǎn)換為 Number
基本類型轉(zhuǎn)換如下
Number("123") // 123
Number("123abc") // NaN
Number("") // 0
Number(false) // 0
Number(undefined) // NaN
Number(null) // 0
對(duì)象轉(zhuǎn)換一樣要復(fù)雜些,與 String 唯一不同的就是 valueOf 方法在前戴质, toString 方法在后度宦,其它見(jiàn)上文例子。