構造化複製アルゴリズム

構造化複製アルゴリズム は複雑な JavaScript オブジェクトをコピーするためのアルゴリズムです。これは postMessage() を介してワーカーと送受信するとき、 IndexedDB にオブジェクトを格納するとき、他の API のためにオブジェクトをコピーするときなど、データ転送時に内部で用いられています。

無限ループを避けるため、以前にアクセスした参照のマップを保持しながら、入力オブジェクトを再帰処理することで複製していきます。

構造化複製で動作しないもの

  • Function オブジェクトは構造化複製アルゴリズムでは複製されません。複製しようとすると DataCloneError 例外が発生します。
  • DOM ノードを複製するときも同様に DataCloneError 例外発生します。
  • 一部のオブジェクトのプロパティは保持されません。
    • RegExp オブジェクトの lastIndex フィールドは保持されません。
    • プロパティ記述子、セッター、ゲッター(もしくは同様のメタデータ系機能)は複製されません。 たとえば、あるオブジェクトがプロパティ記述子によって読み取り専用になっている場合でも、複製したものでは既定の条件である読み取り/書き込みに変わります。
    • プロトタイプチェーンは探索、複製されません。

対応済みの型

オブジェクト型 備考
すべてのプリミティブ型 ただし、シンボルを除く
Boolean オブジェクト
String オブジェクト
Date
RegExp lastIndex は保持されません。
Blob
File
FileList
ArrayBuffer
TypedArray
DataView
ImageBitmap
ImageData
Array
Object プレーンなオブジェクト(オブジェクトリテラルなど)のみです。
Map
Set
DOMException ブラウザーは、プロパティ namemessage をシリアライズしなければなりません。 他の属性もシリアライズ/複製することができます。
ネイティブの Error

エラー名は、 Error, EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError (または "Error" に設定)の何れかでなければなりません。

ブラウザーは name および message プロパティをシリアライズしなければならず、 stack, cause などのエラーの他の「興味深い」プロパティをシリアライズすることが期待されています。

AggregateError の対応が whatwg/html#5749 で仕様書に追加される予定です(そして、既に一部のブラウザーが対応しています)。

関連情報