新创建的对象为newObj,源对象为oldObj,一行代码搞定:
0.structuredClone()
const obj = {id: ‘abcd1234’, values: [‘a’, ‘b’]};
const clone2 = structuredClone(obj);
1、利用JSON(推荐,JS语言自支持,不需要依赖其他工具)
let newObj = JSON.parse(JSON.stringify(oldObj))
2、flat
var arr = [1,2,[3,[4,[5,6]]]]
var arr2 = arr.flat(0) //默认是1,展平是Infinty
arr2 === arr // flase
let newObj = _.cloneDeep(oldObj)
3、ES6的对象拓展运算符:…(有坑,慎重使用,参考关于ES6的拓展运算符进行深拷贝)
4.es6的 Array.from(oldarr)
let newObj = {…oldObj}
5、ES6的对象拓展运算符:Object.assign()(有坑,同上)
let newObj = Object.assign({}, oldObj)
6、Lodash(推荐,在某些集成了Loadsh的开发环境代码显得更简洁)
不能深拷贝的:
展开运算符
var a = [[1], [2], [3]];
var b = […a];
a[0] === b[0] // true
b[1].push(11)
b[1] // [2, 11]
a[1] // [2, 11]
flat也一样
var c = flat(0)
c[0].push(11)
c[0] // [1, 11]
b[0] // [1, 11]
用扩展运算符对数组或者对象进行拷贝时,只能扩展和深拷贝第一层的值,对于第二层极其以后的值,扩展运算符将不能对其进行打散扩展,也不能对其进行深拷贝,即拷贝后和拷贝前第二层中的对象或者数组仍然引用的是同一个地址,其中一方改变,另一方也跟着改变。