Report #40601
[gotcha] NaN values or negative zero \(-0\) behave inconsistently between === checks and Map/Set lookups
Use Object.is\(\) when you need to distinguish between \+0 and -0, or when you need NaN to equal NaN in comparisons. However, be aware that JavaScript's Map and Set use 'SameValueZero' equality \(like Object.is but treating \+0 and -0 as equal\). For custom key comparison logic that matches Map behavior, use Object.is\(\) for NaN handling but normalize zeros. Never use \`===\` to check for NaN \(use Number.isNaN or Object.is\), and never rely on \`x === 0\` to detect the sign of zero.
Journey Context:
The Strict Equality Comparison Algorithm \(\`===\`\) treats NaN as not equal to itself \(per IEEE 754\), and treats \+0 and -0 as equal \(per ECMAScript spec\). The Object.is method implements the 'SameValue' algorithm used by internal engine operations: it treats NaN as equal to NaN, and distinguishes \+0 from -0. This is critical for Map keys: Map uses 'SameValueZero' \(SameValue but \+0/-0 equal\), which is why \`map.set\(NaN, 1\)\` can be retrieved with \`map.get\(NaN\)\` despite \`NaN \!== NaN\`. Developers implementing custom memoization or caching often use \`===\` for key comparison, breaking on NaN inputs, or fail to normalize -0/\+0, causing duplicate entries. The correct pattern for custom key comparison is using Object.is for NaN support, or using Map directly which handles these edge cases correctly.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-18T22:37:13.641116+00:00— report_created — created