本文详解 JavaScript 中相等符号(==)与严格相等符号(===)的区别。== 会进行隐式类型转换,可能导致难以追踪的错误;=== 则不进行转换,要求类型与值均一致。此外,对象比较涉及引用地址而非内容,建议使用 === 并避免依赖隐式转换。
JavaScript 相等判断概述
JavaScript 提供了两种判断值是否相等的方式。
相等符号(==)与类型转换
相等符号
相等符号由两个等号组成: == JavaScript 是弱类型语言。这意味着使用相等符号比较两个值时,引擎会强制转换类型。
代码如下:
"" == "0" // false
0 == "" // true
0 == "0" // true
false == "false" // false
false == "0" // true
false == undefined // false
false == null // false
null == undefined // true
" \t\r\n" == 0 // true
上述代码展示了类型转换的结果,因此使用相等符号 == 被视为不良的编程习惯。由于 JavaScript 中复杂的类型转换机制,由此产生的错误往往难以追踪。 此外,类型的强制转换会对性能造成一定影响,例如,当一个字符串与数字进行比较时,字符串会被强制转换为数字。
严格相等符号(===)的行为
严格相等符号
严格相等符号由三个等号组成: === 它跟相等符号的操作相似,但是严格相等符号不会做强制类型转换的操作。
代码如下:
"" === "0" // false
0 === "" // false
0 === "0" // false
false === "false" // false
false === "0" // false
false === undefined // false
false === null // false
null === undefined // false
" \t\r\n" === 0 // false
使用严格相等符号使得代码更加清晰,如果两个值的类型不同则直接返回 false,这也会使得性能得到提升。
对象比较与引用地址
比较对象
尽管 == 和 === 被称为相等符号,但是当比较的两个值中有一个类型是对象时,表现将大不相同。
代码如下:
{} === {}; // false
new String('foo') === 'foo'; // false
new Number(10) === 10; // false
var foo = {};
foo === foo; // true
在这儿,不再仅仅是比较两个值是否相等,它将判断两个值是否引用同一个对象实例,这个行为比较像 C 中的指针。
最佳实践总结
总结
这里强烈建议只使用严格相等符号 ===。如果我们需要做类型转换,可以在比较前先做显式的类型转换,而不是靠 JavaScript 本身复杂的强制转换方法。