JS中==与===的区别详解

首先建议使用===做比较

所有前端开发人员张口就来的解释:


==      抽象相等,比较时,会先进行类型转换,然后再比较值。

===    严格相等,会比较两个值的类型和值。


深入探讨:==号左右的值,具体是通过什么规则转换类型后比较的?

如 '0' == 0,是将 string ‘0’转成number 0, 还是number 0转成string ‘0’后,进行的比较?

再如:

true == 1
[1, 2] == '1,2'
'true' == true
undefined == null
NaN == NaN


思考一下,如果没蒙,那你底子很好可以向下看了,如果蒙了,那更要向下看!!


下面是ECMA标准解释,规则冗长,但单条都很简短易懂:


1 如果 Type(x) 和 Type(y) 相同,则

1.1 如果 Type(x) 为 Undefined,返回 true

1.2 如果 Type(x) 为 Null,返回 true

1.3 如果 Type(x) 为 Number,则

1.3.1 如果 x 是 NaN,返回 false

1.3.2 如果 y 是 NaN,返回 false

1.3.3 如果 x 的数值与 y 相同,返回 true

1.3.4 如果 x 是 +0 且 y 是 -0,返回 true

1.3.5 如果 x 是 -0 且 y 是 +0,返回 true

1.3.6 返回 false

1.4 如果 Type(x) 为 String,则当且仅当 x 与 y 的字符序列完全相同(长度相等,每个位置上的字符相同)时返回 true,否则返回 false

1.5 如果 Type(x) 为 Boolean,则若 x 与 y 同为 true 或同为 false 时返回 true,否则返回 false

1.6 如果 x 和 y 引用的是同一个对象,返回 true,否则返回 false

2 如果 x 是 null 且 y 是 undefined,返回 true

3 如果 x 是 undefined 且 y 是 null,返回 ture

4 如果 Type(x) 为 Number 且 Type(y) 为 String,以 x == ToNumber(y) 的比较结果作为返回

5 如果 Type(x) 为 String 且 Type(y) 为 Number,以 ToNumber(x) == y 的比较结果作为返回值

6 如果 Type(x) 为 Boolean,以 ToNumber(x) == y 的比较结果作为返回值

7 如果 Type(y) 为 Boolean,以 x == ToNumber(y) 的比较结果作为返回值

8 如果 Type(x) 为 String 或 Number 且 Type(y) 为 Object,以 x == ToPrimitive(y) 的比较结果作为返回值

9 如果 Type(x) 为 Object 且 Type(y) 为 String 或 Number,以 ToPrimitive(x) == y 的比较结果作为返回值

10. 其它情况:返回 false


ToNumber: 转换为number

ToPrimitive:   转换为原始值


补充:

1. 如果x是引用类型,y是引用类型,则比较引用地址是否相同

2. 特别提醒: NaN 不等于 NaN


比较结果图表

==的图表

41b28b0c6def1909e0ad1da86093e620_hd.jpg


 ===的图表

 eb4c38443744d02015ddbe9bfd775eb3_hd.jpg


如果仍然不懂,请继续阅读:

参考文章

[简书]《js中==和===的区别  hellohuan》

[知乎]《Javascript 中 == 和 === 区别是什么?》

2019-12-24 17:29:20 2153 0

参与讨论

选择你的头像