应用场景
JavaScript中,Object是引用类型,把对象objA赋值给objB之后,改变objB的值,objA会跟着改变。这是因为默认执行浅拷贝,也就是在内存中只复制了一个指针给了objB,内存中的数据本身并没有被复制。
如果我们需要一个深拷贝,也就是执行 objB = objA 之后,让 objB 和 objA 再也没有直接关联,该如何操作?
方法一
ES6新特性
const clone = {...original}示例:
let a = {key1: 1}
let b = {...a}
b.key1 = 2
console.log(a) // {key1: 1}注意: 这种方式只能用于单层json对象,也就是对象中的每个value都是基本类型,没有嵌套。
方法二
ES6新特性
const clone = Object.assign({}, original)示例:
var a = { key1: 1 };
var b = Object.assign({}, a);
b.a-=key1 = 2
console.log(a) // {key1: 1}注意: 这种方式只能用于单层json对象,也就是对象中的每个value都是基本类型,没有嵌套。
方法三
const clone = JSON.parse(JSON.stringify(original));
这个是可以对多层json对象进行拷贝的
示例:
var a = {
key1: {
subKey: 1
}
};
var b = JSON.parse(JSON.stringify(a));
b.key1.subKey = 2
console.log(a)//打印结果
{
key1: {
subKey: 1
}
}注意: 使用这个方法,对象中不能有Date, functions, undefined, Infinity, RegExps, Maps, Sets, Blobs, FileLists, ImageDatas, sparse Arrays这些数据类型。
方法四
自定义深拷贝函数。
function deepClone(o1, o2) {
for (let k in o2) {
if (typeof o2[k] === 'object') {
o1[k] = {};
deepClone(o1[k], o2[k]);
} else {
o1[k] = o2[k];
}
}
}方法五
使用第三方库
例如:
lodash.clonedeep angular.copy jQuery.extend()
————————————————
原文链接:https://blog.csdn.net/gang544043963/article/details/107196754

0条评论
点击登录参与评论