深克隆和浅克隆

183 阅读1分钟

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()