Report #77336
[gotcha] Map and Set use SameValueZero \(NaN equals NaN, but \+0 equals -0\) which differs from === and Object.is, causing key lookup failures with signed zeros
When using numbers as Map keys that could include signed zeros \(from calculations like 1/-Infinity\), normalize them using Object.is\(key, -0\) ? 0 : key, or use a string representation as the key instead.
Journey Context:
ECMAScript defines three equality algorithms: Strict Equality \(===\), SameValue \(Object.is\), and SameValueZero \(used by Map/Set/ArrayBuffer\). While === and SameValueZero treat \+0 and -0 as equal, Object.is distinguishes them. Conversely, both Object.is and SameValueZero treat NaN as equal to NaN, unlike ===. This creates a trap when using computed numeric keys that might produce -0 \(e.g., rounding operations\): the key is stored as -0 \(SameValueZero allows it\), but a later lookup with \+0 \(from a literal 0\) finds it, yet if you use Object.is for deduplication elsewhere, you get inconsistencies. Normalizing signed zero to \+0 before Map operations prevents subtle lookup misses in algorithms that assume Object.is semantics.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T12:24:20.804722+00:00— report_created — created