对于==的判断
1、并不是那么严谨的判断左右两端是否相等
2、它会优先对比数据的类型是否一致
3、不一致则进行隐式转换,一致则判断值的大小,得出结果
4、继续判断两个类型是否为null与undefined,如果是则返回true
5、接着判断是否为string与number,如果是把string转换为number再对比大小
6、判断其中一方是否为boolean,如果是就转为number再进一步判断
7、判断一方是否为object,另一方为string、number、symbol,如果是则把object转为原始类型再判断
比较情况
1、数组 == 值,(值类型指的是原始类型)会先转成数值再比较,与字符串比较会先转成字符串再比较
2、引用 == 值,会把引用类型转成原始类型再比较
3、值 == 值,直接比较类型再比较值的大小
4、字符串 == 数字,则把字符串转为数值再比较
5、其他类型 == boolean,则把boolean转成数值再进一步比较
6、undefined == null,也会发生隐式转换,且2者可以相互转换,即2者相等,与自身也相等
7、对象 == 非对象,如果非对象为string或number,则返回ToPrimitive(对象) == 非对象,的结果;ToPrimitive方法的参数如果是原始类型则直接返回;如果是对象,则调用valueOf方法,如果是原始值再进行原始类型转换和大小对比;如果不是原始值则调用toString,且结果为原始值则进行原始类型比较,如果不是原始值则抛出错误
大白话:优先比较类型,同类型,比大小,非原始,调ToPrimitive,为对象调valueOf,还非原始调toString,最后还非原始则报错,如果为原始则进行类型对比,如果不同类型再转换,之后对比大小。
所谓==比较就是要转换成同类型比较,如果无法转成同类型就报错
优先比类型,再比null与undefined,再比string和number,再比boolean与any,再比object与string、number、symbol;以上如果转为原始类型比较,则进行类型转换,直到类型相同再比较值的大小。这就是==的隐式转换对比,比较绕,给个图就清晰了!
如下为判断步骤
==与===
思考?如何判断此表达式(注意==!与!==) []==![]
1、基于运算符的优先级此式会先运算![]的结果
2、!优先于==,且[]为真值(转成boolean,结果为true的就为真值,包括{};转成false的就为假值),![]结果为false,所以当前表达式转化为 []==false
3、通过之前总结的转换关系,任何类型与boolean类型比较,所以[]==false 转化为 []==0 比较
4、此时变为object与0比较,调用object的转换成原始类型的方法valueOf其结果还是valueOf
5、再调用toString结果为'',再进行string转成number,则[]转成数字类型0
6、表达式进一步转换成0==0,结果为true。
虽然过程复杂,记住判断的思路即可,非对象之间,先类型转换再比大小,对象比较则调用获取原始值方法再进一步比较。
如下为toString与valueOf转换
对于===的判断
===属于严格判断,直接判断两者类型是否相同,不同则返回false,如果相同再比较大小,不会进行任何隐式转换,对于引用类型来说,比较的都是引用内存地址,所以===这种方式的比较,除非两者存储的内存地址相同才相等,反之false
const a=[]
const b=a
a===b //true
---------------
const a=[]
const b=[]
a===b //false
领取专属 10元无门槛券
私享最新 技术干货