structuredClone() 提供了原生深拷贝能力,能正确处理 Date、RegExp、Map、Set、ArrayBuffer 及循环引用,相比 JSON.parse(JSON.stringify()) 更安全高效,且支持跨上下文数据传输;但无法克隆函数、DOM 节点和 Symbol 属性,不保留原型链和不可枚举属性,适用于状态快照、Undo/Redo 和函数式编程中的不可变数据模拟。

结构化克隆(
structuredClone()
JSON.parse(JSON.stringify())
structuredClone()
JSON.parse(JSON.stringify())
利用
structuredClone()
const originalObject = {
name: 'Alice',
age: 30,
birthDate: new Date(),
hobbies: ['reading', 'coding'],
details: {
city: 'New York',
zip: 10001
},
// 模拟一个循环引用
selfRef: null
};
originalObject.selfRef = originalObject;
const clonedObject = structuredClone(originalObject);
console.log(clonedObject);
console.log(clonedObject === originalObject); // false
console.log(clonedObject.details === originalObject.details); // false
console.log(clonedObject.birthDate === originalObject.birthDate); // false
console.log(clonedObject.selfRef === clonedObject); // true (循环引用被正确处理)这个API的出现,让深拷贝这个曾经有点让人头疼的问题,变得异常简单且高效。它就像是浏览器内部用于
postMessage
structuredClone()
JSON.parse(JSON.stringify())
说实话,过去我们谈到深拷贝,很多时候会不自觉地想到
JSON.parse(JSON.stringify(obj))
structuredClone()
一个显著的优势在于它能处理更多复杂的数据类型。想象一下,如果你要拷贝一个包含
Date
RegExp
Map
Set
ArrayBuffer
TypedArray
JSON.parse(JSON.stringify())
Date
RegExp
Map
Set
ArrayBuffer
TypedArray
structuredClone()
Date
Date
Map
Map
另一个非常关键的优势是对循环引用的原生支持。这是
JSON.parse(JSON.stringify())
JSON.stringify()
TypeError: Converting circular structure to JSON
structuredClone()
性能上,对于大多数复杂对象,
structuredClone()
最后,它还能保留一些特殊的内置对象实例,比如
Error
stack
name
message
ImageData
Blob
File
JSON.parse(JSON.stringify())
structuredClone()
尽管
structuredClone()
一个主要的限制是它无法克隆函数(Function)。如果你尝试克隆一个包含函数的对象,这些函数属性会被直接忽略掉,不会出现在克隆后的对象中。这通常是因为函数往往与特定的执行上下文或闭包绑定,克隆它们可能没有太大意义,或者会引入不可预测的行为。同样,DOM节点、Error对象的stack
window
另一个细节是它不会保留原型链。
structuredClone()
prototype
new MyClass()
MyClass
{}__proto__
Object.prototype
instanceof
此外,它只克隆可枚举(enumerable)的属性。通过
Object.defineProperty
虽然
structuredClone()
structuredClone()
structuredClone()
一个非常典型的应用场景是跨上下文的数据传输。在Web开发中,我们经常需要在不同的JavaScript执行上下文之间传递数据,比如在主线程和Web Worker之间,或者在父窗口和iframe之间。这些场景下,
postMessage
postMessage
postMessage
JSON.stringify
再比如,在构建具有撤销/重做(Undo/Redo)功能的应用程序时,
structuredClone()
structuredClone()
在函数式编程的实践中,我们常常强调不可变性,即函数不应该修改其输入数据,而是返回一个新的修改后的数据。当一个函数需要对传入的对象进行操作时,为了避免副作用,它通常会先创建一个该对象的副本。此时,
structuredClone()
此外,它还可以用于模拟不可变数据结构。虽然JavaScript本身没有像ClojureScript那样的持久化数据结构,但通过在每次修改操作前,对对象使用
structuredClone()
以上就是如何利用结构化克隆算法深拷贝对象,以及它相比JSON序列化方法的优势和限制有哪些?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号