相等判断分类
- 非严格比较 == 和 !=
比较若类型不同,先偿试转换类型,再作值比较,最后返回值比较结果 。
- 严格比较 === 和 !==
只有在相同类型下,才会比较其值;类型不同直接返回 false。
- 严格比较 Object.is
Object.is 的行为方式与三等号相同,只在 NaN 以及 -0 和 +0 对比时有区别,详情见下面的对照表。
对照表
x | y | == | === | Object.is |
---|---|---|---|---|
undefined | undefined | true | true | true |
null | null | true | true | true |
true | true | true | true | true |
false | false | true | true | true |
“foo” | “foo” | true | true | true |
0 | 0 | true | true | true |
+0 | -0 | true | true | false |
0 | false | true | false | false |
“” | false | true | false | false |
“” | 0 | true | false | false |
“0” | 0 | true | false | false |
“17” | 17 | true | false | false |
[1,2] | “1,2” | true | false | false |
new String(“foo”) | “foo” | true | false | false |
null | undefined | true | false | false |
null | false | false | false | false |
undefined | false | false | false | false |
{ foo: “bar” } | { foo: “bar” } | false | false | false |
new String(“foo”) | new String(“foo”) | false | false | false |
0 | null | false | false | false |
0 | NaN | false | false | false |
“foo” | NaN | false | false | false |
NaN | NaN | false | false | true |
类型转换
JavaScript 是弱类型语言,所以会在任何可能的情况下应用强制类型转换。
1 | // 下面的比较结果是:true |
为了避免上面复杂的强制类型转换,强烈推荐使用严格的等于操作符。
- 内置类型的构造函数
内置类型(比如 Number 和 String)的构造函数在被调用时,使用或者不使用 new 的结果完全不同。
1 | new Number(10) === 10; // False, 对象与数字的比较 |
使用内置类型 Number 作为构造函数将会创建一个新的 Number 对象, 而在不使用 new 关键字的 Number 函数更像是一个数字转换器。