Javascript比较符==与===

JavaScript中=====

前言

由于JavaScript弱类型语言特点,导致了JavaScript中特有的严格相等符号===。而我们也都明白,=====多了个类型判断,即前者在判断两种字符是否相等时,首先判断两者类型是否相等,即是否属于同一种数据类型。而后者就没有这种判断了,所以我们也习惯了下面这种简单的判断语句false == ''。而且不少资料上也列举了常见的五种相当于false的情形,他们分别是false,空字符串''nullundefined0

不过,前段时间,看到室友发个说说,题目如下,求得让函数结果返回true的三个实参(答案见本文末)。

1
2
3
function a(x, y, z) {
return x && x == y && y == z && x != z;
}

严格相等===

严格相等,即全等操作符,ESlint规则中强烈推荐的使用方式。两个被比较的值,在比较前都不会进行隐式类型转换。如果两个被比较的值具有不同的类型,这两个值是全等的。否则就是两个值得类型相同,值也相同,两个值才全等(NaN除外)。

非严格相等==

相等操作符,在被比较前将两个被计较的值转换为相同的类型(等式的一边或两边都可能被转换),然后比较方式等同于全等操作符===的比较方式。
相等操作符A == B,对于不同类型的值,j进行的比较如下图:

Undefined Null Number String Boolean Object
Undefined true true false false false isFalsy(B)
Null true true false false false isFalsy(B)
Number false false A === B A === toNumber(B) A === toNumber(B) A === toPrimitive(B)
String false false toNumber(A) === B A === B toNumber(A) === toNumber(B) toPrimitive(B) == A
Boolean false false toNumber(A) === B toNumber === toNumber(B) A === B false
Object false false toPrimitive(A) == B toPrimitive(A) === B toPrimitive(A) === toNumber(B) A === B

在上面的表格中,toNumber(A)尝试在比较前将参数A转为数字,这与+A(单目运算符+)的效果相同。通过尝试依次调用AtoStringvalueOf方法,将参数A转换为原始值。
一般而言,根据ECMAScript规范,所有的对象都与undefinednull不相等。
下图是==的结果示例:
双目运算符示例

通过上图结果,我们可以得知前文中的问题的答案有且不限于以下两种(JavaScript特有的短路运算此处不作赘述):

1
2
let [x, y, z] = ['0x1', true, '1'];
let [x, y, z] = [[], false, '0']

Object.is(value1, value2)

该方法是ES6中新增的一种判断方法,主要是为了解决+0-0NaNNaN这两种情况,即

1
2
Object.is(+0, -0); // false
Object.is(NaN, NaN); // true

其他情况都与严格相等符号===情况相同。

最后

本文主要说明了非严格相等与严格相等的区别,内容比较基础。