==
相等运算符
==
相等运算符比较两个值是否相等,在比较前将两个被比较的值转换为相同类型。在转换后(等式的一边或两边都可能被转换),然后再做比较 ——(来自MDN)
1 | console.log(1 == true); // true |
===
严格比较运算
===
全等(严格比较运算)操作符,用于比较两个值是否相等,两个被比较的值在比较前都不进行隐式转换。如果两个被比较的值具有不同的类型,这两个值是不全等的。换句话说,在比较两个值是否相等时,同时也进行了两个值的类型比较。
如果两个被比较的值类型相同,值也相同,并且都不是number
类型时,两个值全等。如果两个值都是number
类型,当两个都不是 NaN,并且数值相同,或是两个值分别为 +0 和 -0 时,两个值被认为是全等的。——(来自MDN)
1 | console.log(+0 === -0); // true |
缺点:
使用===
全等(严格比较)运算符来比较两个值不能有效地处理NaN
(非数字的number
类型)和NaN
(非数字的number
类型)以及处理负零-0
,这个时候就需要用到Object.is()
方法来进行比较
Object.is()
Object.is()
方法判断两个值是否为同一个值 ——(来自MDN)
如果满足以下条件则两个值相等:
- 都是
undefined
- 都是
null
- 都是
true
或false
- 都是相同长度的字符串且相同字符相同顺序排列
- 都是相同对象(意味着每个对象有同一个引用)
- 都是数字且
- 都是
+0
- 都是
-0
- 都是
NaN
- 或都是非零而且非
NaN
且为同一个值
- 都是
1 | console.log(Object.is(NaN, NaN)); // true |
Object.is(+0, 0)
是 false
, Object.is(NaN, NaN)
是 true
==
相等运算符、===
全等(严格比较)运算符、Object.is()
的区别
1、==
相等运算符,两边值类型不同的时候,会先进行值的类型隐式转换,再比较;
2、===
全等,严格比较运算符,不做类型转换,类型不同就是false
,对于NaN
、正零+0
与负零-0
的比较时不能有效地判断
3、Object.is()
是ES6新增的用来比较两个值是否为同一个值,与===
严格比较运算符基本相似,不同的地方在于对于NaN
、正零+0
与负零-0
的比较时也能有效地处理