Stop using Loose Equality in JavaScript

不要再使用 == 了,改使用 === 吧!

发现问题

在 JavaScript 中常见可以使用两种方法来比较值:

两者的差别在于,一般相等会进行类型转换,而严格相等则不会,举例来说 1 == '1' 会转换字符串为数字再进行比较,因此会返回 true,而 1 === '1' 则会严格的比较两者的类型所以会返回 false

那么这一小差别会造成什么潜在的问题呢?

使用松散的比较会让程序比对条件上模棱两可,像是以下的程序中很明显 0'' 是不相等的,由于使用的是松散的比较,这样的程序撰写会让代码变得不够严谨,因此建议使用严格比对。

0 == ''; // true
0 == '0'; // true
0 == false; // true

总结

凡事能用 === 就不使用 == ,一开始就撰写更严谨的判断会更好。由于 == 并不检查类型,因此常常会被 Javasciprt 自动转换类型闹出 Bug ,举例来说:

const a = 1;
const b = '1';
typeof a; // Number
typeof b; // String
a == b; // true
a === b; // false
// 类型上 a、b 是不同内容,但 Javascript 比较时会转换,因此使用 === 更严谨的去要求比较「类型要一样」。

在绝大多数的情况下,你不会想要使用松散比对,但是在某些情况下,可能会使用它会更为便利,例如当想要比较 nullundefined 时,因为它们的值是相等的但类型是不同的,在这个场合下使用 == 会比较方便,使用松散比对可以一次对 nullundefined 的结果做比对:

// 撰写判断:当 a 为 null 或 undefined 时,都将进入 if 判断式。
// 使用松散比对
if (a == null) {
}
// 使用严格比对
if (a === null || a === undefined) {
}

详细两者比较上的差异比较图表可以参考 MDN 的文件:理解相等比较模型🔗 非常齐全。

参考资料