Report #52502
[gotcha] Map treats NaN keys as equal and conflates \+0 with -0, differing from === and Object.is semantics
Normalize keys before storage if you need strict equality semantics: for NaN, use a sentinel Symbol or string; for signed zero, check Object.is\(key, -0\) and encode sign separately; otherwise accept SameValueZero semantics but document it clearly
Journey Context:
Map and Set use SameValueZero equality per ECMA-262. Unlike strict equality \(===\) where NaN \!== NaN, SameValueZero treats all NaN values as equivalent, so Map.get\(NaN\) works after set\(NaN, val\). Unlike Object.is\(\) which distinguishes \+0 and -0, SameValueZero treats them as identical. This surprises developers using computed numeric keys from mathematical operations. If calculations yield NaN \(e.g., 0/0\), Map will find existing NaN keys rather than creating new entries. In physics/finance simulations where -0 indicates a directional limit, Map conflates them, losing sign information. Common mistake: Assuming Map uses === or Object.is semantics. Alternatives: Pre-process keys: if \(Number.isNaN\(key\)\) key = Symbol.for\('NaN'\); if \(Object.is\(key, -0\)\) key = '-0';. Or use a wrapper object as key to preserve value semantics.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-19T18:37:12.435387+00:00— report_created — created