顺序Point
'==' '==='
'=='案例一
-
object/function == 原始(基本)类型
把 object 等引用类型转为原始类型再进行判断 - 即
'1' == { name: 'yck' }
=>'1' == '[object Object]'
=>//flase
'=='案例二
[] == ![]
0 == false
true
以下运算流程
- 运算符
== !
运算符的优先级 结合性 -
==
左结合!
右结合优先级! > ==
- 计算机先运算
![]
-
!
运算对象
布尔 运算结果
布尔 -
![]
数据类型不同,需求转布尔
-
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
函数{}或者表达式()的返回值