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
比较结果图表
==的图表
===的图表
如果仍然不懂,请继续阅读:
参考文章
参与讨论