要深拷贝一个javascript对象,最常用的方法是使用json.parse(json.stringify(obj))或现代浏览器提供的structuredclone()。1. 使用json.parse(json.stringify(obj))可快速实现深拷贝,能处理基本数据类型、数组和普通对象,但无法正确处理函数、undefined、symbol、bigint、date、regexp、map、set等特殊类型,且遇到循环引用会报错;2. structuredclone()是更强大的深拷贝方案,支持date、regexp、map、set、arraybuffer、typedarray、blob、file、imagedata等复杂类型,并能正确处理循环引用,但无法克隆函数,且在不支持该api的旧环境中不可用;3. 对于特殊需求如保留原型链或复制dom节点,需手动实现递归深拷贝函数。因此,在现代开发中推荐优先使用structuredclone(),若环境不支持则根据数据类型选择json方法或自定义函数,以确保深拷贝的准确性和兼容性。

JavaScript里要深拷贝一个对象,就是创建一个新对象,它的所有属性(包括嵌套的子对象)都和原对象一模一样,但它们之间完全独立,修改其中一个不会影响另一个。这跟浅拷贝不一样,浅拷贝只会复制第一层,深层还是共享引用。要实现深拷贝,最常用的方法是利用
JSON.parse(JSON.stringify(obj))
structuredClone()
要深拷贝一个JavaScript对象,我们有几种途径,每种都有其适用场景和一些需要注意的地方。
最直接也最常被提起的,就是利用
JSON
JSON.stringify()
JSON.parse()
const originalObject = {
name: '张三',
age: 30,
address: {
city: '北京',
street: '朝阳路'
},
hobbies: ['阅读', '编程']
};
const deepCopyJSON = JSON.parse(JSON.stringify(originalObject));
deepCopyJSON.address.city = '上海';
console.log(originalObject.address.city); // 输出 '北京',原对象未受影响这个方法简单粗暴,但它有明显的局限性。它只能处理JSON支持的数据类型,比如数字、字符串、布尔值、数组、普通对象。像函数、
undefined
Symbol
BigInt
Date
RegExp
Map
Set
JSON.stringify()
针对这些痛点,现代浏览器提供了一个更强大的API:
structuredClone()
Date
RegExp
Map
Set
ArrayBuffer
TypedArray
Blob
File
ImageData
const complexObject = {
name: '李四',
birthDate: new Date(),
data: new Map([['key1', 'value1']]),
reg: /test/i,
// 注意:函数是不能被 structuredClone 克隆的,如果包含函数会抛出错误
// myFunc: () => console.log('hello')
};
// 制造一个循环引用
complexObject.self = complexObject;
try {
const deepCopyStructured = structuredClone(complexObject);
console.log(deepCopyStructured.birthDate instanceof Date); // true
console.log(deepCopyStructured.data instanceof Map); // true
console.log(deepCopyStructured.reg instanceof RegExp); // true
console.log(deepCopyStructured.self === deepCopyStructured); // true,循环引用也被正确复制
console.log(deepCopyStructured !== complexObject); // true,是全新的对象
} catch (e) {
console.error("structuredClone 错误:", e.message); // 如果包含不可克隆类型(如函数),会在这里捕获
}当然,如果你在旧环境或者有非常特殊的定制需求(比如要复制DOM节点,或者特定类的实例,并且要保留其原型链),你可能还需要自己写一个递归的深拷贝函数。但说实话,在大多数现代
以上就是js如何深拷贝一个对象的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号