AI智能
改变未来

js中==和===的区别以及总结


js中==和===的区别以及总结

学习js时我们会遇到 == 和 === 两种符号,现做总结如下

两种符号的定义

  \”==\” 叫做相等运算符

  \”===\” 叫做严格相等运算符(全等运算符)

它们之间的区别

  \”==\” 只判断等号两边的值是否相等,而不判断类型是否相同。值相同则返回 true

  \”===\” 既要判断值是否相等,也要判断类型是否相同,即全等才能返回 true

总结:

(分析 ==)

先把等号两侧的值转化为基本数据类型,如果两侧的值基本数据类型不同,转化为数字再进行比较,如果相同,直接比较

1、undefined 和 null 互相比较返回 true,和自身比较也返回 true,其他情况返回 false

2、Infinity 只和自身比较返回 true

3、NaN,{} 和任意值比较都是返回 false

4、如果其中一个值是 true,则将其转换为 1 再进行比较。如果其中一个值是 false,则将其转换为 0 再进行比较

5、要比较相等性之前,不能将 null 和 undefined 转换成其他任何值

6、 如果一个值是数字,另一个是字符串,先将字符串转换为数值,然后使用转换后的值进行比较

7、如果等号两侧都是对象,则比较它们是否为同一个对象。如果指向同一个对象,则返回 true,否则返回 false

较为复杂的情况:

8、如果等号一侧是Number,String,Boolean这三种类型中的一种,而另一侧是对象类型时, 则对对象执行ToPrimitive操作(这步是JS解释器执行的,ToPrimitive方法的实现,正是依次去调用对象的valueOf,toString方法,直到其中一个方法返回一个基本值,然后比较返回的基本值和另一侧那三中类型的值。如果这两个方法没有返回基本值 ,那就认定不相等 )

(分析 ===)

1、先分析是否为相同类型,如果类型不同直接返回 false,

  如果类型相同,

    基本类型,直接比较值是否相同,

    对象类型,由于对象类型保存的是对象(包括数组,函数)的地址值,所以地址值不同的,返回的都是 false。地址值相同,返回 true

上面说的有些抽象,下面我们来结合具体的实例来分析一下

== 详解(有隐式转换)    

一、等号两侧是基本数据类型,且类型不同时

1. 字符串与数字比较 (等号两侧转化为数字,再比较)

  100 == \”100\”  ==>  100 == 100  // true

  100 == \”99\”  ==>  100 == 99  // false

  100 == \”abc\”  ==>  100 == NaN  // false

  1 == \”abc\”  ==>  1 == NaN  // false

  1 == \”\”  ==>  1 == 0  // false

2.字符串与布尔值比较(等号两侧转换为数字,再比较)

  \”abc\” == true  ==>  NaN == 1  // false

  \”abc\” ==56cfalse  ==>  NaN == 0  // false

  \”\” == true  ==>  0 == 1  // false

  \”\” == false  ==>  0 == 0  // true

3.数字与布尔值比较(等号两侧转换为数字,再比较)

  1 == true  ==>  1 == 1  // true

  0 == true  ==>  0 == 1  // false

  100 == true  ==>  100 == 1  // false

  1 == false  ==>  1 == 0  // false

  0 == false  ==>  0 == 0  // true

  100 == false  ==>  100 == 0  // false

4. undefinedad8和 null

  undefined 与 null 比较特殊 要比较相等性之前,不能将 null 和 undefined 转换成其他任何值

  undefined 和 null 互相比较返回 true,和自身比较也返回 true,其他情况返回 false

  undefiend == undefined  // true

  undefined == null  // true

  null == null  // true

  undefined == 其他值  // false

  null == 其他值  // false

5. NaN

  NaN(非数值)也很特殊,NaN 和任何值(包括自己)比较都是返回 false

  NaN == NaN  // false

  NaN == 其他值  // false

二、等号两侧有复杂数据类型(引用类型)时,且类型不同时

  (特殊:{} 和任何值比较返回都是false )

1.等号两侧都为引用类型时

  (由于引用类型保存的是对象(包括数组,函数)的地址值,所以地址值不同的,返回的都是 false)

等号两侧为相同的引用数据类型时 

  实例

  [1,2] == [1,2]  // false

  [1,2] == [2,3]  // false

  {x:1} == {x:1}  // false

  {x:1} == {y:1}  // false

等号两侧为不同的引用数据类型时

  实例

  [1,2] == {y:1}  // false

  

2.有且只有一侧为引用数据类型时

  实例

  [1,2] == 1  ==>  NaN == 1  // false

  [1,2] == true  ==>  NaN == 1  // false

  [ 1 ] == 1  ==>  1 == 1  // true

  [1] == \’1\’  ==>  \’1\’ == \’1\’  // true

  

  [] == 0  ==>  0 == 0  // true

  [] == \’0\’  ==>  \’\’ == \’0\’  // false

  [] == \’\’  ==>  \’\’ == \’\’  // true

  {x:1} == 1  ==>  NaN == 1  // false  {x:1}== \’1\’  ==>  NaN == 1  // false

  true == {x:1}  ==>  1 == NaN  // false

=== 详解(无隐式转换)

  实例

  100 == \”100\”  // false

  100 == 100  // true

  \”100\” == \”100\”  // true

  {x:1} == {y:1}  // false

  

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » js中==和===的区别以及总结