顺序Point
'==' '==='
'=='案例一
-
object/function == 原始(基本)类型
把 object 等引用类型转为原始类型再进行判断 - 即
'1' == { name: 'yck' }=>'1' == '[object Object]'=>//flase
'=='案例二
[] == ![]
0 == falsetrue
以下运算流程
- 运算符
== !运算符的优先级 结合性 -
==左结合!右结合优先级! > == - 计算机先运算
![] -
!运算对象布尔 运算结果布尔 -
![]数据类型不同,需求转布尔 -
console.log(Boolean([]))=>true -
![]=>false - 对于
==的运算,左右分别为[]和Boolean - 引用数据类型
转原始类型,机制 => 优先转数字 =>[]=>0 - 最终 比较
0 == false - //output true
以下知识点
- 转Boolean (需要转布尔时,否则转原始类型不等于转布尔)
在条件判断时,除了 undefined, null, false, NaN, '', 0, -0,其他所有值都转为 true,包括所有对象。-
console.log(Boolean([]))=>true
-
- js运算符优先级 ==左结合 !右结合 优先级高
-
!运算对象为布尔 -
!运算结果为布尔 -
[]转布尔 对象 转布尔 为 trueconsole.log(Boolean([])) -
console.log(![])=>false
-
- 对象
Object引用类型 与基本类型比较类型转换 -
==左右两侧数据类型不同 需要将引用类型转换为原始类型才能比较和进行隐式转换 - 对象的转换原始类型 调用内置的 [[ToPrimitive]] 函数
顺序执行- 如果已经是原始类型了,那就不需要转换了
- 调用 x.valueOf(),如果转换为基础类型,就返回转换的值
- 调用 x.toString(),如果转换为基础类型,就返回转换的值
- 如果都没有返回原始类型,就会报错
-
[]转原始类型优先转数字[]=>0
小结
- 运算符的优先级和结合性
- 引用类型需求转布尔时先转布尔,且为true
- 未指定转原始类型,先valueOf,后toString,均失败则报错
- null.undefined无toString方法,报错
补充 == 比较 undefined null
知识点
js ==比较规则
基本数据类型(标量):类型相同 直接比较NAN特例
——————————类型不同,左右转为数字比较
引用类型:对象的转换原始类型 调用内置的 [[ToPrimitive]] 函数
————优先valueOF,再然后toString
null undefined 特例
- undefined 视为标量/基础数据类型,与不同类型标量比较,转数字
- null 空对象,空指针,调用引用类型转原始类型方法,
但是null本身无valueOf,toString方法 ,因此始终返回false
标量 即基本数据类型
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 标量 类型不同 均转数字 转换失败 返回NAN 即false
null==false // false 对象方法转换基本类型
// null空指针,无valueOf,toString方法 故而返回false
'abc'==true // false 标量比较,转数字
' \t\r\n ' == 0 // true
关于控制台(gg,vscode)返回值和undefined
函数{}或者表达式()的返回值