編程中少不了將某個數(shù)據(jù)類型轉(zhuǎn)換成另一種數(shù)據(jù)類型。其中通過函數(shù)或者方法調(diào)用以及強制轉(zhuǎn)換稱為顯示轉(zhuǎn)換,相反的,在"不知情"的情況下"有意"的進行的轉(zhuǎn)換,則稱為隱士轉(zhuǎn)換。
比較常見隱士類型轉(zhuǎn)換,很多語言中都存在的。這里僅僅說說JavaScript中存在的。
1、"+"運算符
這里js(ECMASCRIPT)引擎將會把b編程字符串'2'再與a進行連接,最后變成了"22"。很多語言的"+"運算符都是這樣處理的。這一過程是隱式進行的,js引擎幫助我們完成的。而且利用"+"這個特性,可以很方便的將Number類型轉(zhuǎn)換為string類型。例如:
2、"-"運算符
“-”可以是一元運算符(取負),也可以是二元運算符(減法),"-"也會進行隱式類型轉(zhuǎn)換,例如
可以看出的是"-"的特性與"+"正好相反,會把字符串b隱士的轉(zhuǎn)換成數(shù)字再進行減法運算。利用這個特性,可以很方便的將string轉(zhuǎn)換為number
和"+"、“-”乘法和除法也會進行隱式類型的轉(zhuǎn)換(轉(zhuǎn)換為number再進行計算)。
4、遞增遞減操作符(前置、后置)
這類操作符適用于任何數(shù)據(jù)類型的值,針對不同類型的值,該操作符遵循以下的轉(zhuǎn)換規(guī)則:
1、如果是包含有效數(shù)字字符的字符串,先將其轉(zhuǎn)換為數(shù)值(同Number()),再執(zhí)行加減操作,字符串變?yōu)閿?shù)值變量
2、如果不包含有效數(shù)字字符串,將變量的值置為NaN,字符串變量變?yōu)閿?shù)值變量。
3、如果是布爾值false,轉(zhuǎn)換為0進行運算。
4、如果是布爾值true,轉(zhuǎn)換為1進行運算。
5、如果是浮點數(shù)值,直接進行加減1操作。
6、如果是對象,先調(diào)用對象對的valueOf()方法,之后按照前5點進行轉(zhuǎn)換,如果結(jié)果是NaN,調(diào)用toString()方法后應(yīng)用前面規(guī)則進行判斷。
5、邏輯操作符(!、&&、||)
邏輯非(!)操作符首先通過Boolean()函數(shù)將他的操作值轉(zhuǎn)換為布爾值,然后求反。
邏輯與(&&)
1、如果第一個操作數(shù)經(jīng)Boolean()轉(zhuǎn)換后為true,則返回第二個操作值,否則返回第一個值(不是Boolean()轉(zhuǎn)換后的值)
2、如果有一個操作值為null.返回null
3、如果有一個操作值為NaN,返回NaN
4、如果有一個操作值為undefined,返回undefined
邏輯或(||),如果一個操作值不是布爾值,遵循以下規(guī)則:
1、如果第一個操作值經(jīng)Boolean()轉(zhuǎn)換后為false,則返回第二個操作值,否則返回第一個操作值(非Boolean()轉(zhuǎn)換后的值)
2、對于undefined、null和NaN處理規(guī)則與邏輯與相同
6、關(guān)系操作符(<,>,<=,>=)
和上述操作符一樣,關(guān)系操作符的操作值也可以是任意類型的,所以使用非數(shù)值類型參與比較時也需要系統(tǒng)進行隱式類型轉(zhuǎn)換;
1、兩個操作值都是數(shù)值,直接比較
2、兩個字符都是字符串,字符串編碼進行比較
3、一個數(shù)值,另一個轉(zhuǎn)換為數(shù)值進行比較
4、一個操作數(shù)是對象,調(diào)用valueOf()|toString(),之后按照1、2進行比較
5、一個操作值是布爾值,則將其轉(zhuǎn)換為數(shù)值,再進行比較。
tips:NaN是非常特殊的值,不和任何類型的值相等,包括自己,同時它與任何類型的值比較大小時都返回false。
7、相等操作符== and ===
相等操作符也會對操作值進行隱式轉(zhuǎn)換后進行比較
1、布爾值、字符串和數(shù)值進行比較,轉(zhuǎn)換為數(shù)值之后在進行比較
2、null與undefined是相等的
3、與NaN判等,返回false
TIPS: == 和 === 區(qū)別
1、對于Array,Object等高級類型,兩者無區(qū)別:進行“地址”比較
2、對于基礎(chǔ)類型==判斷值是否相等,===不僅判斷值,而且判斷類型是否相等。
3、基礎(chǔ)類型與高級類型有區(qū)別:==將高級類型轉(zhuǎn)化為基礎(chǔ)類型,進行“值”比較,===直接返回false
在JavaScript語法中也存在者隱式類型轉(zhuǎn)換,其中有if,while,for in,for in在定義對象字面量時發(fā)生從標(biāo)識符到字符串的隱式轉(zhuǎn)換
數(shù)組的索引其實也是字符串類型。
alert時存在的隱式轉(zhuǎn)換
同理,數(shù)值類型的也一樣:
我相信js中的隱式類型轉(zhuǎn)換的怪癖不止這么一點點,由于js是一種弱類型的語言,造成了coding時的靈活性,可以將不同類型進行比較等操作(js隱式轉(zhuǎn)換),這可能讓人感覺的詫異和不舒服。這種機制是否容易出錯,其實不必過于擔(dān)心,因為大部分的情況下,我們不需要轉(zhuǎn)換,我們很少進行不同類型的比較(若有,不是更方便了嘛)。