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)を指定した際の挙動。

参考情報

記事一覧へ戻る