架构师

您现在的位置是:首页 > 技术博客 > 编程基础

编程基础

Javascript中==与===有什么区别

架构师小跟班 2020-04-29 编程基础
对于==的判断1、并不是那么严谨的判断左右两端是否相等2、它会优先对比数据的类型是否一致3、不一致则进行隐式转换,一致则判断值的大小,得出结果4、继续判断两个类型是否为nu

对于==的判断

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,且结果为原始值则进行原始类型比较,如果不是原始值则抛出错误

// 以下结果都为true 
console.log([5]==5,['5']==5) 
console.log({name:'5'}=='[object Object]') 
console.log('5'==5,true==1,false==0) 
console.log(undefined==null) 
console.log([5,6]=='5,6',['5','6']=='5,6')

大白话:优先比较类型,同类型,比大小,非原始,调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 

文章评论