EN/CH Mode
BRUCE_FE JS Interview Notes - Strict vs Loose Comparison and Object.is() Analysis
In-depth analysis of JavaScript's ==, ===, Object.is() comparison methods, practical applications, and differences between shallow and deep comparison.
EN/CH Mode

Lazy to read articles? Then watch videos!
== vs ===
==performs type coercion, suitable for loose comparison.===returns true only when both type and value match, recommended as the default approach.
0 == '0' // true
false == 0 // true
null == undefined // true
[] == false // true
0 === '0' // false
false === 0 // false
null === undefined // falseObject.is Precise Comparison
Object.is() is almost equivalent to ===, but correctly handles edge cases like NaN and +0/-0.
Object.is(NaN, NaN)// trueObject.is(+0, -0)// false- Suitable for
React.memo,useMemo, and when frameworks need precise change detection
Object.is(NaN, NaN); // true
Object.is(+0, -0); // false
Object.is(42, 42); // true
const obj1 = { a: 1 };
const obj2 = { a: 1 };
Object.is(obj1, obj2); // false(不同參考)Object.is is Shallow Comparison
Object.is() only compares first-level references or values, without deep recursion into object contents.
const a = { x: 1 };
const b = { x: 1 };
Object.is(a, b); // false
Object.is(a, a); // trueFor deep comparison, use lodash's isEqual:
import isEqual from 'lodash.isequal';
isEqual(a, b); // true🔥 Common Interview Questions
(1) What's the difference between == and ===? Please provide examples.
Answer: == performs type coercion, while === does not.
0 == '' // true
false == 'false' // false
'123' === 123 // false(2) What's the result of NaN === NaN?
Answer: NaN is defined in IEEE 754 as not equal to any value (including itself), so NaN === NaN is false. However, for precise comparison, you can use Object.is(NaN, NaN), which will return true.
(3) When should we use Object.is?
Answer: For example, React internally uses Object.is() to determine if state or props have changed and if re-rendering is needed. This prevents errors in edge cases like NaN and +0/-0, ensuring precision and performance.
useEffect(() => {
// some code...
}, [.....]) // <--- Dependencies compared using Object.is internally
// Simple overview of internal implementation
// If new value equals old value via Object.is, don't update
if (!Object.is(prevValue, nextValue)) {
updateState(nextValue);
}