我們知道在JS中會有一些判斷是與非的問題堕战,這里專門有一些這種問題,在解決問題的同時讓我深入理解一些JS的轉(zhuǎn)換拍霜。 Yes 0r no ,that's a problem.
1嘱丢、[ ]==![ ]? 數(shù)組等于非數(shù)組?祠饺!
==會自動轉(zhuǎn)換類型越驻,所以在判斷[ ]==![ ]會轉(zhuǎn)換兩者的類型。
[ ]是object類型,伐谈![ ] 是Boolean類型烂完,比較時會把Boolean轉(zhuǎn)換為Number類
型,而Object轉(zhuǎn)換成Number或String诵棵,則取決于另外一個比較對象的類型抠蚣。
這里比較對象是Boolean,所以object也會轉(zhuǎn)化為Number。
Boolean與Number的轉(zhuǎn)換履澳,true為1嘶窄,false為0,所以![ ]在比較的時候轉(zhuǎn)換
為Number值為0距贷;
[ ]是很明顯的空對象柄冲,對于對象,當(dāng)將其轉(zhuǎn)換成Number時忠蝗,會先調(diào)用對象
的valueOf()方法及toString( )现横,返回對象的原始值,再進(jìn)行轉(zhuǎn)換阁最。最終[ ]會
返回""空字符串戒祠,""會轉(zhuǎn)化Number值為0。
所以0==0速种,即[ ] == ! [ ] 為true
2姜盈、!!'false' == !!'true'? true是false? ? ?配阵!
'false'不是一個空字符串馏颂,因此他的值為真值
所以,!!'false'返回true
!!'true'同樣返回true
所以true==true棋傍,!!'false' == !!'true'返回true
3救拉、‘foo’ + ’bar‘? 返回值
字符串的拼接,所以返回值為? foobar? 舍沙;
4近上、‘foo’ ++ ’bar‘? ? 返回值為? ? ?拂铡?
該表達(dá)式可以轉(zhuǎn)換為 'foo'+(+'bar'),+‘bar’將 “bar” 轉(zhuǎn)換為NaN葱绒。
所以’foo‘++'bar'返回 fooNaN
5感帅、1<2<3? 和? 3>2>1 的返回值是什么呢 ?
我們知道1<2,在這里比較的時候從左到右可以看到1<2的時候返回的是true,true與3相比較會把true轉(zhuǎn)化成num類型的1當(dāng)然1<3 所以第一個返回值是true,同理第二個為false.
所以:
在轉(zhuǎn)換不同的數(shù)據(jù)類型時地淀,相等或者不相等應(yīng)遵循一下幾條規(guī)則:
1. 如果有一個操作數(shù)是布爾值失球,則在比較相等之前將其轉(zhuǎn)換為數(shù)值————false轉(zhuǎn)換為0,true轉(zhuǎn)換為1;
2. 如果一個操作數(shù)是字符串实苞,另一個操作符是數(shù)值豺撑,則在比較相等之前先將字符串轉(zhuǎn)換為數(shù)值;
3. 如果一個操作數(shù)是對象黔牵,另一個操作數(shù)不是聪轿,則調(diào)用對象的valueOf()方法,用得到的基本類型值按照前面的規(guī)則進(jìn)行比較猾浦。