JavaScriptでオブジェクトのコピーを作成する際、よく遭遇するエラーの1つが「structuredClone」に関連するものです。この記事では、structuredClone()関数の基本的な使い方から実践的な活用方法まで、わかりやすく解説します。
structuredClone()とは
structuredClone()は、JavaScriptオブジェクトのディープコピーを作成するための組み込み関数です。2022年に導入されたこの機能により、複雑なデータ構造も簡単にコピーできるようになりました。
基本的な使い方
const originalObj = {
name: "John",
age: 30,
hobbies: ["reading", "gaming"]
};
const clonedObj = structuredClone(originalObj);従来のコピー方法との違い
従来のスプレッド演算子やObject.assign()との主な違いを見てみましょう:
// シャローコピー(浅いコピー)
const shallowCopy = { ...originalObj };
// ディープコピー(深いコピー)
const deepCopy = structuredClone(originalObj);structuredClone()のメリット
1. 循環参照にも対応
2. 複雑なネストされたオブジェクトも正確にコピー
3. Date、Map、Set、ArrayBufferなども適切にコピー
サポートされるデータ型
- プリミティブ値(数値、文字列、真偽値など)
- オブジェクト
- 配列
- Date
- Map、Set
- ArrayBuffer
- TypedArray
- DataView
注意点と制限事項
structuredClone()には以下の制限があります:
- 関数はコピーできない
- DOM要素はコピーできない
- Errorオブジェクトはコピーできない
// エラーの例
const objWithFunction = {
method: () => console.log("Hello")
};
// これはエラーになります
const cloned = structuredClone(objWithFunction);
// TypeError: Function object could not be cloned.実践的な使用例
1. 複雑なデータ構造のコピー
const complexObj = {
user: {
name: "John",
details: {
address: {
city: "Tokyo",
country: "Japan"
}
}
},
dates: [new Date(), new Date(2024, 0, 1)]
};
const clonedComplex = structuredClone(complexObj);2. 循環参照を含むオブジェクトのコピー
const obj = {
name: "Circular Reference"
};
obj.self = obj;
const clonedCircular = structuredClone(obj);
// 正常にコピーされますブラウザ互換性
structuredClone()は比較的新しい機能のため、古いブラウザでは使用できない場合があります。そのような場合は、以下のような代替手段を検討してください:
// 代替手段の例
const deepClone = obj => JSON.parse(JSON.stringify(obj));まとめ
structuredClone()は、JavaScriptでのオブジェクトのディープコピーを簡単かつ安全に行うための強力なツールです。特に複雑なデータ構造や循環参照を含むオブジェクトを扱う際に重宝します。ただし、関数やDOM要素などのコピーには制限があるため、使用する際はこれらの制限事項を考慮する必要があります。
関連キーワード:JavaScript、オブジェクトコピー、ディープコピー、構造化クローン、データ構造