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.