順序Point
'==' '==='
'=='案例一
-
object/function == 原始(基本)類型
把 object 等引用類型轉為原始類型再進行判斷 - 即
'1' == { name: 'yck' }
=>'1' == '[object Object]'
=>//flase
'=='案例二
[] == ![]
0 == false
true
以下運算流程
- 運算符
== !
運算符的優(yōu)先級 結合性 -
==
左結合!
右結合優(yōu)先級! > ==
- 計算機先運算
![]
-
穿稳!
運算對象
布爾 運算結果
布爾 -
![]
數(shù)據(jù)類型不同,需求轉布爾
-
console.log(Boolean([]))
=>true
-
![]
=>false
- 對于
==
的運算逢艘,左右分別為[]
和Boolean
- 引用數(shù)據(jù)類型
轉原始類型
,機制 => 優(yōu)先轉數(shù)字 =>[]
=>0
- 最終 比較
0 == false
- //output true
以下知識點
- 轉Boolean (需要轉布爾時疤孕,否則轉原始類型不等于轉布爾)
在條件判斷時,除了 undefined祭阀, null鲜戒, false, NaN遏餐, '', 0境输, -0颖系,其他所有值都轉為 true,包括所有對象
嘁扼。-
console.log(Boolean([]))
=>true
-
- js運算符優(yōu)先級 ==左結合 !右結合 優(yōu)先級高
-
!
運算對象為布爾 -
趁啸!
運算結果為布爾 -
[]
轉布爾 對象 轉布爾 為 trueconsole.log(Boolean([]))
-
console.log(![])
=>false
-
- 對象
Object
引用類型 與基本類型比較
類型轉換 -
==
左右兩側數(shù)據(jù)類型不同 需要將引用類型轉換為原始類型才能比較和進行隱式轉換 - 對象的轉換原始類型 調用內置的 [[ToPrimitive]] 函數(shù)
順序執(zhí)行
- 如果已經是原始類型了不傅,那就不需要轉換了
- 調用 x.valueOf(),如果轉換為基礎類型访娶,就返回轉換的值
- 調用 x.toString(),如果轉換為基礎類型,就返回轉換的值
- 如果都沒有返回原始類型典勇,就會報錯
-
[]
轉原始類型優(yōu)先轉數(shù)字
[]
=>0
小結
- 運算符的優(yōu)先級和結合性
- 引用類型需求轉布爾時先轉布爾叮趴,且為true
- 未指定轉原始類型,先valueOf眯亦,后toString,均失敗則報錯
- null.undefined無toString方法谈火,報錯
補充 == 比較 undefined null
知識點
js ==
比較規(guī)則
基本數(shù)據(jù)類型(標量):類型相同 直接比較NAN特例
——————————類型不同舌涨,左右轉為數(shù)字比較
引用類型:對象的轉換原始類型 調用內置的 [[ToPrimitive]] 函數(shù)
————優(yōu)先valueOF,再然后toString
null undefined 特例
- undefined 視為標量/基礎數(shù)據(jù)類型,與不同類型標量比較囊嘉,轉數(shù)字
- null 空對象,空指針舵鳞,調用引用類型轉原始類型方法,
但是null本身無valueOf,toString方法 蜓堕,因此始終返回false
標量 即基本數(shù)據(jù)類型
null == undefined // true
null !== undefined // true 全等匹配 不全等 返回false
Boolean(undefined) // false
Boolean(null)// false
console.log(Number(undefined)) //NAN
NAN == '標量'/'引用類型' // false NAN的任何運算結果NAN
undefined==false // false 標量 類型不同 均轉數(shù)字 轉換失敗 返回NAN 即false
null==false // false 對象方法轉換基本類型
// null空指針博其,無valueOf,toString方法 故而返回false
'abc'==true // false 標量比較慕淡,轉數(shù)字
' \t\r\n ' == 0 // true
關于控制臺(gg,vscode)返回值和undefined
函數(shù){}或者表達式()的返回值