Report #14613
[gotcha] JSON.stringify silently drops BigInt, functions, undefined, and symbols
Implement a replacer function that handles BigInt explicitly \(e.g., converting to string or number if safe\) and decides policy for other non-serializable types. Use \`if \(typeof value === 'bigint'\) return value.toString\(\);\` in your replacer. For functions/undefined, decide if they should be omitted or stringified. Never rely on JSON.stringify for deep cloning or persistence without custom replacer/reviver pairs that handle BigInt and preserve type information.
Journey Context:
JSON.stringify silently strips \`undefined\`, functions, and symbols from objects and arrays \(replacing with null in arrays, omitting in objects\), but throws a TypeError on BigInt. This asymmetry causes two distinct bugs: silent data loss for undefined/functions \(often unnoticed\) and runtime crashes for BigInt. Developers often use \`JSON.parse\(JSON.stringify\(obj\)\)\` as a 'poor man's deep clone', which destroys BigInt, functions, and prototype chains. The fix requires a replacer function that explicitly serializes BigInt \(e.g., as strings with a type tag\) and a corresponding reviver to reconstruct them. Alternatives like structuredClone handle more types but still fail on functions. Understanding these limits is crucial for data persistence and IPC.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T21:55:45.577854+00:00— report_created — created