1.数组的concat()、slice()方法
var arr = [1,2,3,4,5]
var arr1 = arr.concat([])
var arr2 = arr.slice(0)
arr[1] = 10
console.log(arr) // => [1, 10, 3, 4, 5]
console.log(arr1) // => [1, 2, 3, 4, 5]
console.log(arr2) // => [1, 2, 3, 4, 5]
2.使用递归循环
function deep(dest, obj) {
var o = dest
for (const key in obj) {
if (typeof obj[key] === 'object') {
o[key] = (obj[key].constructor === Array) ? [] : {}
deep(o[key],obj[key])
} else {
o[key] = obj[key]
}
}
return o
}
var obj1 = {
a: 1,
b: [1,2,3,4],
c: function(){},
d: {
e: [0,6,4],
f: 'sdf'
}
}
var o1 = deep({},obj1)
3.使用lodash库中cloneDeep()
import _ from 'lodash'
let obj = {a: {b: {c: 1}}}
let o = _.cloneDeep(obj)
o.a.b.c = 10
console.log(o.a.b.c) // => 10
console.log(obj.a.b.c) // => 1
4.使用JQ的extend方法。
// $.extend( [deep ], target, object1 [, objectN ] )
// deep表示是否深拷贝,为true为深拷贝,为false,则为浅拷贝
// target**** Object类型 目标对象,其他对象的成员属性将被附加到该对象上。
// object1 objectN可选。 Object类型 第一个以及第N个被合并的对象
let a=[0,1,[2,3],4],
b=$.extend(true,[],a);
a[0]=1;
a[2][0]=1;
console.log(a , b);
5.我们还可以借用JSON对象的parse和stringify
function deepClone(obj){
let _obj = JSON.stringify(obj),
objClone = JSON.parse(_obj);
return objClone
}
let a=[0,1,[2,3],4],
b=deepClone(a);
a[0]=1;
a[2][0]=1;
console.log(a); // => [1,1,[1,3],4]
console.log(b); // => [0,1,[2,3],4]
网友评论