壹 ❀ 前言
今日在一篇文章中看到這么一個問題: 如何判斷兩個變量相等?。我的第一反應是這個還不簡單,直接全等===不就完事了;但是還有個問題:如果是 +0 === -0(true),NaN === NaN (false)呢。這樣不就無法區分+0和-0不相等以及兩個NaN的變量相等了嗎?於是寫下這篇文章希望更多的園友知道判斷兩個變量相等不只有全等還有Object.is()。
貳 ❀ 初識Object.is()
- MDN的定義:
Object.is() 方法判斷兩個值是否為同一個值
Object.is()的用法與全等===基本一致,唯有不同的兩點:
1.+0與-0為false
2.NaN與NaN為true
- 注意:
0和+0是一樣的,但是0和-0是不一樣的
特例
Object.is(0, -0); // false
Object.is(+0, -0); // false
Object.is(0, +0); // true
Object.is(NaN, 0/0); // true
叄 ❀ Object.is() 的實現原理
Object.is = function(x, y) {
if (x === y) {
// 1/+0 = +Infinity, 1/-0 = -Infinity, +Infinity不等於-Infinity
// Infinity 屬性用於存放表示正無窮大的數值。負無窮大是表示負無窮大一個數字值。
return x !== 0 || 1 / x === 1 / y;
}
// 一個變量不等於自身變量,那么它一定是 NaN
// 兩個都是NaN的時候返回true
return x !== x && y !== y;
};