Stop using Loose Equality in JavaScript
不要再使用 == 了,改使用 === 吧!
发现问题
在 JavaScript 中常见可以使用两种方法来比较值:
两者的差别在于,一般相等会进行类型转换,而严格相等则不会,举例来说 1 == '1'
会转换字符串为数字再进行比较,因此会返回 true
,而 1 === '1'
则会严格的比较两者的类型所以会返回 false
。
那么这一小差别会造成什么潜在的问题呢?
使用松散的比较会让程序比对条件上模棱两可,像是以下的程序中很明显 0
与 ''
是不相等的,由于使用的是松散的比较,这样的程序撰写会让代码变得不够严谨,因此建议使用严格比对。
0 == ''; // true0 == '0'; // true0 == false; // true
总结
凡事能用 ===
就不使用 ==
,一开始就撰写更严谨的判断会更好。由于 ==
并不检查类型,因此常常会被 Javasciprt 自动转换类型闹出 Bug ,举例来说:
const a = 1;const b = '1';
typeof a; // Numbertypeof b; // String
a == b; // truea === b; // false
// 类型上 a、b 是不同内容,但 Javascript 比较时会转换,因此使用 === 更严谨的去要求比较「类型要一样」。
在绝大多数的情况下,你不会想要使用松散比对,但是在某些情况下,可能会使用它会更为便利,例如当想要比较 null
与 undefined
时,因为它们的值是相等的但类型是不同的,在这个场合下使用 ==
会比较方便,使用松散比对可以一次对 null
与 undefined
的结果做比对:
// 撰写判断:当 a 为 null 或 undefined 时,都将进入 if 判断式。
// 使用松散比对if (a == null) {}// 使用严格比对if (a === null || a === undefined) {}
详细两者比较上的差异比较图表可以参考 MDN 的文件:理解相等比较模型 非常齐全。