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