構造化複製アルゴリズム
構造化複製アルゴリズムは、複雑な JavaScript オブジェクトをコピーします。
これは、structuredClone() を呼び出したとき、postMessage() を介してワーカーと送受信するとき、 IndexedDB にオブジェクトを格納するとき、他の API のためにオブジェクトをコピーするときなどに、内部で用いられています。
無限ループを避けるため、以前にアクセスした参照のマップを保持しながら、入力オブジェクトを再帰処理することで複製していきます。
構造化複製で動作しないもの
Functionオブジェクトは構造化複製アルゴリズムでは複製されません。複製しようとするとDataCloneError例外が発生します。- DOM ノードを複製するときも同様に
DataCloneError例外発生します。 - 一部のオブジェクトのプロパティは保持されません。
RegExpオブジェクトのlastIndexフィールドは保持されません。- プロパティ記述子、セッター、ゲッター(もしくは同様のメタデータ系機能)は複製されません。 たとえば、あるオブジェクトがプロパティ記述子によって読み取り専用になっている場合でも、複製したものでは既定の条件である読み取り/書き込みに変わります。
- プロトタイプチェーンは探索、複製されません。
- クラスのプライベート要素は複製されません(ただし、組み込み型の内部フィールドは複製されることがあります)。
対応している型
>JavaScript 型
ArrayArrayBufferBooleanDataViewDateError型(ただし下記のエラー型を参照)。MapNumberObjectオブジェクト。ただしプレーンオブジェクトのみ(オブジェクトリテラルから作成した場合など)。- プリミティブ型(
symbolを除く) RegExp: ただしlastIndexは保存されないことに注意SetStringTypedArray
エラー型
Error 型では、エラー名は Error, EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError のいずれかでなければなりません(そうでなければ "Error" に設定されます)。
ブラウザーは、name および message プロパティをシリアライズしなければならないし、stack や cause など、エラーのそれ以外の「興味深い」プロパティについてもシリアライズすることが期待されます。
AggregateError については、whatwg/html#5749 で仕様に対応が追加される見込みです(一部のブラウザーではすでに対応しています)。
Web/API 型
AudioDataBlobCropTargetCryptoKeyDOMException: ブラウザーはnameおよびmessageプロパティをシリアライズする必要があります。その他の属性もシリアライズ・クローンされることがあります。DOMMatrixDOMMatrixReadOnlyDOMPointDOMPointReadOnlyDOMQuadDOMRectDOMRectReadOnlyEncodedAudioChunkEncodedVideoChunkFencedFrameConfigFileFileListFileSystemDirectoryHandleFileSystemFileHandleFileSystemHandleGPUCompilationInfoGPUCompilationMessageGPUPipelineErrorImageBitmapImageDataRTCCertificateRTCEncodedAudioFrameRTCEncodedVideoFrameVideoFrameWebTransportError
メモ:
シリアライズ可能なオブジェクトは、ウェブ IDL ファイル において、[Serializable] 属性をつけてマークアップされます。