structuredclone() 在处理类型转换时,核心机制是执行深度序列化与反序列化。它会将输入对象转换为符合结构化克隆算法的内部表示(类似 json),再还原为新对象。此过程会丢弃函数、symbol、undefined 及循环引用,并将 date 转为 iso 字符串,map/set 转为普通对象或数组。若需保留特定类型结构,应在调用前手动转换或使用自定义 replacer/reviver 逻辑。

structuredClone() 对基本类型和复杂类型的处理差异
该函数对不同类型采取不同的克隆策略。对于原始值(String, Number, Boolean, null, undefined)直接返回副本;对于对象则递归遍历属性。Date 对象会被序列化为字符串,ArrayBuffer 和 TypedArray 会复制底层二进制数据。Blob 和 File 对象支持克隆,但 Function、Error 实例、DOM 节点等会被忽略或抛出异常。

const original = {
date: new Date('2023-01-01'),
map: new Map([['key', 'value']]),
func: () => {},
num: 42
};
try {
const cloned = structuredClone(original);
console.log(cloned.date); // "2023-01-01T00:00:00.000Z"
console.log(cloned.map); // undefined (Map被丢弃)
console.log(cloned.func); // undefined (Function被丢弃)
console.log(cloned.num); // 42
} catch (e) {
console.error(e);
}如何处理 structuredClone() 中的循环引用和特殊对象
当输入包含循环引用时,structuredClone() 会抛出 DataCloneError。这是因为它无法在树状结构中表达环。对于 Error 对象,仅保留 message 和 name 属性,堆栈信息丢失。RegExp 对象会被转换为普通对象 { source: "...", flags: "..." }。BigInt 在部分环境中受支持,但在旧版浏览器中可能失败。处理这些情况需在克隆前预处理数据结构,例如将循环引用替换为 ID 引用,或将 Error 转为纯文本。
立即学习“Java免费学习笔记(深入)”;

const objA = { name: 'A' };
const objB = { name: 'B' };
objA.ref = objB;
objB.ref = objA; // 循环引用
try {
structuredClone(objA);
} catch (e) {
console.log(e.name); // DataCloneError
}
// 处理 RegExp
const regex = /test/gi;
const clonedRegex = structuredClone(regex);
console.log(clonedRegex); // { source: 'test', flags: 'gi' }基于 structuredClone() 返回结果的具体问题:如何恢复 Map 和 Set 结构
由于 structuredClone() 不原生支持 Map 和 Set,它们会被转换为普通对象或数组。要恢复结构,需在克隆后手动重建。例如,Map 会被转为 { key: value } 形式的对象,Set 会被转为 [item] 形式的数组。开发者可在克隆前将 Map/Set 转为可序列化的格式(如键值对数组),或在克隆后通过遍历重建。以下代码演示了如何在克隆后恢复 Map 结构。
const originalMap = new Map([['a', 1], ['b', 2]]);
const cloned = structuredClone(originalMap);
// cloned 现在是 { a: 1, b: 2 }
// 恢复 Map
const restoredMap = new Map(Object.entries(cloned));
console.log(restoredMap.get('a')); // 1


















