shfshanyue / Daily-Question

互联网大厂内推及大厂面经整理,并且每天一道面试题推送。每天五分钟,半年大厂中
https://q.shanyue.tech
4.92k stars 510 forks source link

【Q599】Object.is 与全等运算符(===)有何区别 #615

Open shfshanyue opened 3 years ago

shfshanyue commented 3 years ago

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/is

  1. +0/-0
  2. NaN/NaN
if (!Object.is) {
  Object.is = function(x, y) {
    // SameValue algorithm
    if (x === y) { // Steps 1-5, 7-10
      // Steps 6.b-6.e: +0 != -0
      return x !== 0 || 1 / x === 1 / y;
    } else {
      // Step 6.a: NaN == NaN
      return x !== x && y !== y;
    }
  };
}
wuzqZZZ commented 2 years ago
Object.is()在===基础上特别处理了NaN,-0,+0,保证-0与+0不相等,但NaN与NaN相等

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

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