1.浅克隆:只是原始数据的引用,在堆中与原始数据仍然公用一块内存。
2.深克隆:为新数据在堆中重新分配一块内存。
区别:浅克隆是只克隆数组或对象的第一层级,二级及以上层级是直接引用;那么深克隆则是克隆数组或对象的每个层级,不管一个对象或数组有多少层级,那么当我们进行深克隆时每一个层级都会开辟一块新的堆内存地址。对于克隆后对象/数组的任何层级做任何修改都不会影响到克隆前的数组或对象,因为它们都是独立的
几种常见的浅克隆:
1.直接赋值
var a={aa:'1',bb:'2',cc:'3'}
var b=a
b.aa="我是新的b.aa"
b={aa:'我是新的b.aa',bb:'2',cc:'3'}
2.concat合并数据
3.object.assign() (可深克隆可浅克隆) eg1:
var a={a:'1',b:'2',c:'3'}
var b=object.assign({},a)
b.a=3
console.log(a) //{a:'1',b:'2',c:'3'} 对于一层级属于深克隆
eg2:
var a={a:'1',b:'2',c:{a:"1",b:'2'}}
var b=object.assign({},a)
b.c.a="我被b修改了"
console.log(a) //{a:'1',b:'2',c:{a:"我被b修改了",b:'2'}} 对于多层级属浅克隆
4.扩展运算符(...) (可以浅克隆也可深克隆)(同理Object.assign())
5.JSON.parse(JSON.stringify())(深克隆)
var a=[{a:'1',b:'2',c:{a:"1",b:'2'}}]
var b=JSon.parse(Json.stringify(a))
b[0].c.a="被b改了"
console.log(a) //[{a:'1',b:'2',c:{a:"1",b:'2'}}]
console.log(b) //[{a:'1',b:'2',c:{a:"被b改了",b:'2'}}]
6.loash的深克隆:cloneDeep()