2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

JSON.stringify/parseで、知らないと詰まる4つの落とし穴

2
Posted at

オブジェクトをコピーしたり、APIとやり取りしたりするときに何気なく使うJSON.stringifyJSON.parse。便利な反面、いくつか「知らないと詰まる」挙動があります。今回は4つのパターンを実際に動かして確認しました。

パターン1: Dateオブジェクトが文字列になる

const obj = { createdAt: new Date('2026-01-01') };
const json = JSON.stringify(obj);
console.log(json);
// → {"createdAt":"2026-01-01T00:00:00.000Z"}

const parsed = JSON.parse(json);
console.log(typeof parsed.createdAt, parsed.createdAt instanceof Date);
// → string false

JSON.stringifyDateオブジェクトを、ISO 8601形式の文字列に変換します。ここまでは想定通りという人も多いと思いますが、注意したいのはJSON.parseで戻したときです。自動的にDate型へ戻ることはなく、ただの文字列のままになりますparsed.createdAt.getFullYear()のようなDateのメソッドを呼ぶとエラーになるので、必要ならnew Date(parsed.createdAt)で明示的に変換し直す必要があります。

パターン2: undefinedを含むプロパティは消える

const obj = { a: 1, b: undefined, c: 3 };
console.log(JSON.stringify(obj));
// → {"a":1,"c":3}

bプロパティがまるごと消えています。JSON.stringifyは、値がundefinedのプロパティを出力から除外します。「渡したはずのキーが返ってこない」という現象に遭遇したら、値がundefinedになっていないか疑ってみてください。

パターン3: 配列の中のundefinedはnullになる

const arr = [1, undefined, 3];
console.log(JSON.stringify(arr));
// → [1,null,3]

同じundefinedでも、オブジェクトのプロパティなら消え、配列の要素ならnullに変換されます。これは、配列が「要素の順番」を持つ構造だからです。プロパティを削除すると、配列のインデックスがずれてしまうため、代わりにnullという「存在するが値がない」印に置き換える仕様になっています。

パターン4: 循環参照はエラーになる

const obj = { name: 'a' };
obj.self = obj; // 自分自身を参照させる

JSON.stringify(obj);
// → TypeError: Converting circular structure to JSON

オブジェクトが自分自身(またはループする形で)を参照していると、JSON.stringifyは無限ループを避けるためにTypeErrorを投げます。DOM要素をうっかりオブジェクトに含めてしまったときなど、意図せず循環参照が生まれてエラーになるケースがあります。

まとめ

パターン 挙動
Dateオブジェクト 文字列に変換される。parseしても自動ではDate型に戻らない
オブジェクトのundefinedプロパティ 出力から消える
配列内のundefined要素 nullに変換される
循環参照 TypeErrorが発生する

JSON.stringify/JSON.parseは「オブジェクトを丸ごとコピーする」用途で使われることもありますが(structuredClone()が使えない古い環境など)、上記のような変換ルールがあることを知らずに使うと、思わぬデータ欠損やエラーにつながります。用途によっては、Dateや循環参照も扱えるstructuredClone()の方が安全な場面もあるので、状況に応じて使い分けてみてください。


未経験者向けの講座を運営しています

未経験から Next.js + Supabase + Claude Code で Webアプリを公開するまで を、全24セッションで体系化した教材です。Claude Code を学習パートナーにする CLAUDE.md と学習モード(learner / developer)の設計までセットで含みます。

※ Qiita読者の方には易しすぎる内容なので、初心者の知り合いへの紹介や社内研修の参考としてどうぞ。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?