Hiprup

What is the difference between Object.is() and ===?

Object.is() compares two values much like ===, but handles two special cases differently.

  • NaN — Object.is(NaN, NaN) is true, whereas NaN === NaN is false.

  • Signed zero — Object.is(+0, -0) is false, whereas +0 === -0 is true.

In practice: === is fine for everyday comparisons; reach for Object.is only when those edge cases matter.

// Same behavior (99.9% of cases)
console.log(1 === 1);              // true
console.log(Object.is(1, 1));      // true
console.log('a' === 'a');          // true
console.log(Object.is('a', 'a')); // true

// Different behavior: NaN
console.log(NaN === NaN);          // false (wrong!)
console.log(Object.is(NaN, NaN));  // true (correct!)

// Different behavior: +0 vs -0
console.log(+0 === -0);            // true
console.log(Object.is(+0, -0));    // false (distinguishes)

// Correct NaN check
console.log(Number.isNaN(NaN));    // true (preferred method)

For NaN: === says NaN !== NaN (unintuitive), Object.is says NaN === NaN (correct). For ±0: === treats them as equal, Object.is distinguishes them.

In practice, use Number.isNaN for NaN checking. Object.is is used internally by React for state comparison (Object.is(prevState, nextState)).

Two differences: NaN (Object.is returns true, === returns false) and +0/-0 (Object.is returns false, === returns true). Mention that React uses Object.is for state comparison.

Number.isNaN is the practical NaN check.

What is the difference between Object.is() and ===? | Hiprup