在 JavaScript 当中,==、=== 与 Object.is()的区别

2023年1月24日

💎 加入 E+ 成長計畫 與超過 300+ 位軟體工程師一同在社群中成長,並且獲得更多的軟體工程學習資源

在 JavaScript 当中有许多可以比较相等与否的方法。其中最常见的三个分别是**=== (严格比较)== (松散比较),以及Object.is (同值比较)** 。这三者有什么不同呢? 一起来看看这题面试常会被问的基础题吧。

== 松散比较 (loose equality)

== 在比较两个值之前,会先强制转换型别与值,举例来说,下面的这三个例子,之所以会印出true ,正是因为在比较前,型别被转换了;否则数字1 在 JavaScript 中跟字串'1' 是代表不同的值,严格来说不应该相等。同理 undefinednull 在 JavaScript 是不同型别与不同的值,但如果使用 == 会回传 true

console.log(1 == "1"); // true
console.log(0 == false); // true
console.log(undefined == null); // true

因为会强制转换型别,== 会带给开发者一些困扰。因此多数的情况,不建议使用 ==

=== 严格比较 (strict equality)

=== 不会强制转换型别与值,所以如果是不同型别,比较两者会回传 false。不同值的话一样会回传 false。不过有两个情况例外,当我们比较 +0-0时,严格比较会回传 true;以及比较 NaNNaN 会是 false。而这两个状况则是同值比较 Object.is 派上用场的时候。

+0 === -0; // true
NaN === NaN; // false

Object.is 同值比较 (same-value equality)

同值比较顾名思义是在比较两个值是不是相等。虽然它是 Object 开头,但比较的可以是任意的两个值。例如:

console.log(Object.is(1, 1)); // true
console.log(Object.is(1, "1")); // false

上面提到的两种在 === 时遇到的问题,可以透过 Object.is 有效分辨

console.log(Object.is(+0, -0)); // false
console.log(Object.is(NaN, NaN)); // true

不过如果要有效分辨 NaN,在 JavaScript 有一个方法叫 isNaN 是可以使用的。端看开发团队的习惯,假如对于 Object.is 感到陌生,可以选择用 Number.isNaN

🧵 如果你想收到最即時的內容更新,可以在 FacebookInstagram 上追蹤我們