1. 程式人生 > 其它 >第71天 [js] 寫一個方法,實現深淺拷貝

第71天 [js] 寫一個方法,實現深淺拷貝

//[js] 寫一個方法,實現淺拷貝

//淺拷貝 assign
var a = {
    name: 'zhangsan',
};
var b = Object.assign({}, a);
b.name = 'lisi';
console.log(a.name);//zhangsan
//但是如果拷貝的源物件當中包含物件時,OBject.assign()方法只會拷貝物件的引用地址,而不會拷貝物件的屬性值
var c = {
    name: 'zhangsan',
    age: 18,
    address: {
        city: 'beijing',
        street: 'xizhimen'
    }
};
var d = Object.assign({}, c);
d.name = 'lisi';
d.address.city = 'shanghai';
console.log(c.name);//zhangsan
console.log(c.address.city);//shanghai



//[js] 寫一個方法,實現深拷貝
//如果要拷貝的物件中包含物件,就需要深拷貝了,一般使用原生的方法JSON.parse(JSON.stringify(obj))

var j1={
    value: 'a',
    obj3:{
        value2: 'c'
    },
    arr:[1,2,3]
}
var obj2 = JSON.parse(JSON.stringify(obj1));
obj2.obj3.value2='b';
obj2.arr[0]= "a";
console.log(obj2);//{ value: 'a', obj3:{ value2: 'b' }, arr:['a',2,3] }
console.log(obj1);//{ value: 'a', obj3:{ value2: 'c' }, arr:[1,2,3] } 沒有發生改變

//實現一個對陣列和物件的深拷貝的方法
var obj={
    name: 'znl',
    age: 18,
    friend:{
        name: 'borys',
        age: 20
    },
    arr:[1,2,[3,4]]
}

function copy(obj){
    var type=Object.prototype.toString.call(obj);
    if(!(type == '[object Array]' || type == '[object Object]')){
        return 'Type Error!';
    }
    return JSON.parse(JSON.stringify(obj));
}

var obj2= copy(obj);
console.log(obj.friend === obj2.friend)//false
console.log(obj.arr === obj2.arr)//false