js中数组和对象的复制

一、数组

1、浅复制和深度复制的区别

(1)浅复制:浅复制只会将对象的各个属性进行依次复制,并不会进行递归复制。而 JavaScript 存储对象都是存地址,所以浅复制会导致 两个数组指向同一块内存地址,使得改变第二个数组的同时,导致第一个数组也会改变。
(2)深复制:而深复制则不同,它会将原对象的各个属性复制出去,而且将原对象各个属性所包含的对象也依次采用深复制的方法递归复制到新对象上,这样就不会出现两个对象指向同一个地址。

2、浅复制(例子):

var name1 = {
    name:"zhangsan"
}
//复制一份src对象的应用
var name2 = name1;
name2.name = "lisi";
console.log(name1.name);

输出结果:lisi

3、深复制(例子)

js中有两个常见的方法, Array的slice和concat方法都可以实现数组的复制,但是这两个方法对于数组中的对象元素却没有执行深复制,而只是复制了引用了,因此这两个方法并不是真正的深度复制。
let arr1 = [1,2,3,4,5,6];
let arr2 = arr1;
let arr3 = arr1.concat();
let arr4 = arr1.slice(0);
console.log(arr1 === arr2);   //true
console.log(arr1 === arr3);     //false
console.log(arr1 === arr4);    //false
输出:
true
false
false
上面的两个方法只能简单实现数组的复制,如果数组中有其他对象,这两个方法就不能实现深度的复制

二、数组对象的深度复制

1、JSON对象的parse和stringify方法可以实现对象的复制(JSON对象parse方法可以将JSON字符串反序列化成JS对象,stringify方法可以将JS对象序列化成JSON字符串,从而实现深度复制)

let name1 = {
    name:"zhangsan",
    child:{
        name:"zhangsan's child"
    }
}
let name2 = JSON.parse(JSON.stringify(name1));
name1.name = 'lisi'
console.log(name1.name)
console.log(name2.name)
name1.child.name = "lisi's child"
console.log(name1.child.name)
console.log(name2.child.name)
输出:
lisi
zhangsan
lisi's child
zhangsan's child

2、使用jQuery中的$extends方法

var arr1 = [1, 2,{a: 3, b: 4}, 5],
arr2 = $.extend(true, [], arr1);














你可能感兴趣的:(js)