js是弱型別語言,運算時若兩邊資料型別不一樣會自動轉換型別,寫**時不小心就就掉坑里了。
看下面面試題:
console.
log(
==);//false
console.
log(![
]==);
//true
console.
log(![
]==![
]);//true
console.
log(![
]==false);
//true
console.
log(
==true);
//false
console.
log(
=="");
//true
console.
log(0==
!);//true
我表示有很多問號???
首先看一下js資料型別:
資料基本型別:number,string,boolean,null,undefined,symbol(es6)。
再有乙個物件值object。
1.console.log(==);
陣列是物件型別,它是有引用位址的,而每個引用位址都是不同的,所以這裡是false。
2.console.log(!==);
在網上科普了很久,我們可以這麼理解,當boolean型別與其他型別比較時,兩邊都轉換為數字進行比較,在這裡,!運算子優先順序是比==優先順序高的,所以先運算!,有非運算子就意味著需要將轉換為boolean,而是物件型別,因此就會轉換為true,再取反,!結果就是false,即0,空陣列轉為數值為0,所以結果為true。
3.console.log(!==!);
上乙個是true,這乙個也是true?是不是感覺特別有趣,,!轉為布林為false,false轉為數值為0,兩邊一樣,所以結果為true。
4.console.log(!==false);
同理,!為false,另一邊也是false,為true。
5.console.log(==true);
物件和布林值進行比較時,最終都轉為數字,物件先轉換為字串,然後再轉換為數字,布林值直接轉換為數字,空陣列轉為字元是空字串,而""==false ==0 三者是相等的,true轉為數值為1,所以結果為false。
6.console.log(=="");
同上,轉為string為"",兩邊相同,結果為true。
7.console.log(0==!);
資料進行boolean轉換時,只有""、0、false、undefined、null、nan六種結果為false,其餘全為true,所以陣列轉布林為true,取反為false、與0相等,結果為true。
並不是所有的隱式轉換都轉換為數字,只要同一型別即可,是按照這麼個順序來的:物件 --> 先轉string --> 再轉number;boolean --> 直接轉為number。
javascript運算子及隱式型別轉換
定義 運算子也叫操作符,通過運算子可以對乙個或多個值進行運算,並獲得運算結果。typeof是運算子之一,可以獲得乙個值的資料型別。加 減 乘 除 取模,即 任何值與字串相加,都會轉換成字串並拼接。除此之外,任何資料型別與number資料型別運算都會先轉換成number型別再運算。例如,100 1 9...
JavaScript運算子中的隱式轉換規律
如果包含的是有效數字字串或者是有效浮點數字串,則會將字串轉換 number 為數值,再進行加減操作,返回值的型別是 number型別。如果不包含有效數字字串,則會將字串的值轉換為nan,返回值的型別是 number型別。如果是boolean型別,則先會把true或者false轉換為1或者0,再進行加...
運算子過載中的隱式轉換問題
譚浩強c 書中運算子過載隱式轉換關於以下兩句話的問題 friend complex operator complex complex friend complex operator const complex const complex 1.隱式轉換不會被用於非const的引用引數 2.二義性問題 ...