Node.jsのJSON.stringifyはundefinedをどう扱うか:オブジェクトと配列の違い
Node.jsのJSON.stringifyにおけるundefinedの扱い:オブジェクトと配列の挙動差
JavaScriptの標準メソッドであるJSON.stringify()を使ってデータをJSON形式の文字列に変換するとき、値としてundefinedが含まれていると、オブジェクト内と配列内で変換結果が大きく異なります。
JSONにはundefinedに対応する型が存在しないため、データ構造に応じた調整が行われます。本記事ではNode.js環境での実測をもとに、その挙動の違いを整理します。
オブジェクトと配列における挙動の違い
1. オブジェクト内のプロパティの場合
オブジェクトのプロパティ値にundefinedが指定されている場合、そのプロパティはキーごと出力から省略されます。
// Case 1: Object with undefined property
const objResult = JSON.stringify({a: undefined, b: null});
console.log('Object result:', objResult);出力の抜粋:
Object result: {"b":null}キーaは省略され、nullを持つキーbのみが出力されます。
2. 配列の要素の場合
配列の要素としてundefinedが含まれる場合、要素は削除されずnullに置き換えられます。
// Case 2: Array with undefined element
const arrResult = JSON.stringify([undefined, null]);
console.log('Array result:', arrResult);出力の抜粋:
Array result: [null,null]この結果では要素数は2のままで、undefinedの位置がnullになります。
3. トップレベルおよび関数の挙動
単体のundefinedを直接渡すと、文字列ではなくJavaScriptのundefinedがそのまま返されます。
// Case 3: Top-level undefined
const topResult = JSON.stringify(undefined);
console.log('Top-level undefined result:', topResult, '(type:', typeof topResult, ')');出力の抜粋:
Top-level undefined result: undefined (type: undefined )また、関数(Function型)を渡した場合も同様に、オブジェクト内ではプロパティが省略され、配列内ではnullに変換されます。
検証環境
- 実行ランタイム: Node.js(コンテナイメージ:
node-22) - ネットワーク: なし(オフライン環境)
確認できなかったこと
今回の検証および参照ドキュメントの範囲内において、以下の事項は実証・確認が完了していません。
- ECMAScript仕様の内部アルゴリズム: 仕様書内の
SerializeJSONObject、SerializeJSONArray、SerializeJSONPropertyなどの内部抽象操作や判定処理の本文(提供情報が目次のみのため未確認)。 - RFC 8259仕様との直接の関連: 配列の整合性維持と
null置換の由来に関するRFC 8259本文との照合。 - Symbol型の網羅的動作: Symbol型プロパティや要素に対する挙動の実機検証。
- 追加引数の動作: 第2引数(replacer)および第3引数(space)を指定した際の挙動。