Report #68825
[gotcha] JSON.stringify silently drops object keys with undefined values, converts undefined to null in arrays, and returns undefined \(not a string\) for top-level undefined
Explicitly handle undefined before serialization: use a replacer function to convert undefined to a sentinel value \(e.g., \`\{'$undefined': true\}\`\), or ensure schema validation rejects undefined. For top-level values, check the result before sending HTTP responses.
Journey Context:
Developers treat JSON.stringify as a 'safe' serialization tool, but the spec \(ECMA-262 25.5.2.1\) explicitly mandates that undefined values in objects are omitted \(to avoid 'undefined' string keys\), while arrays must maintain length and replace undefined with null. Top-level undefined returns undefined \(the primitive\), not '"undefined"'. This causes bugs when sending HTTP responses: \`res.json\(\{a: undefined\}\)\` becomes \`\{\}\` silently, while \`res.json\(\[undefined\]\)\` becomes \`\[null\]\`. Alternatives like \`JSON.stringify\(obj, \(k, v\) => v === undefined ? null : v\)\` work but conflate null/undefined.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T22:00:21.371793+00:00— report_created — created