深拷贝、浅拷贝

2021-07-26  本文已影响0人  清苑折纸

深拷贝和浅拷贝只针对引用数据类型,比如Object和Array
深拷贝:从A拷贝到B,当A发生改变时B不会变;
浅拷贝:从A拷贝到B,当A发生变化时B也会变,此时是只复制了指向对象的指针而没有复制对象的值。

浅拷贝

function shallowCopy(oldObj){
    var newObj = {}
    for(var i in oldObj){
        if(oldObj.hasOwnProperty(i)){
            newObj[i] = oldObj[i]
        }
    }
    return newObj
}
Object.assign( {} , source,source);

当对象只有一级属性没有二级属性的时候,属于深拷贝,但是当对象中还有对象时,在二级属性后就属于浅拷贝。

const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };
const returnedTarget = Object.assign(target, source);
console.log(target); // { a: 1, b: 4, c: 5 }
console.log(returnedTarget); // Object { a: 1, b: 4, c: 5 }
console.log(target) // {a: 1, b: 4, c: 5}
第一级是深拷贝:
let a = {James: {age: 18}}
let b = Object.assign({}, a)
b.James = 20
console.log(b) // { James: 20 }
console.log(a) // { James: { age: 18 } }
以后各级是浅拷贝:
let a = {James: {age: 18}
let b = Object.assign({}, a)
b.James.age = 20
console.log(b) // { James: { age: 20 } }
console.log(a) // { James: { age: 20 } } //源对象a也被修改

深拷贝

var obj1 = { a: 10, b: 20, c: 30 };
var obj2 = { a: obj1.a, b: obj1.b, c: obj1.c };
obj2.b = 100;
console.log(obj1);
// { a: 10, b: 20, c: 30 } <-- 沒被改到
console.log(obj2);
// { a: 10, b: 100, c: 30 }
let arr = [1, 2, {
    username: 'aa'
    }];
let arr2=JSON.parse(JSON.stringify(arr));
arr2[2].username = 'bb';
console.log(arr,arr2);
var obj1 = {
    a: 1,
    b: { f: { g: 1 } },
    c: [1, 2, 3]
};
var obj2 = $.extend(true, {}, obj1);
console.log(obj1.b.f === obj2.b.f);
// false
function deepCopy(oldObj){
    var newObj = {}
    for(var key in oldObj){
        if(typeof oldObj[key] === 'object'){
            newObj[key] = deepCopy(oldObj[key])
        }else{
            newObj[key] = oldObj[key]
        }
    }
    return newObj
}

上一篇下一篇

猜你喜欢

热点阅读