深拷贝浅拷贝

深拷贝、浅拷贝的区别

新对象(数组)引用旧对象(数组),改变旧对象(数组)的值,如果新对象(数组)的值也跟着改变,即浅拷贝。如果不影响,即深拷贝

// 1. 数组
// 适用于深拷贝一层数组且值为基本类型的方法有:遍历属性、slice、concat、Object.assign
var arr = [1, 2, 3, 4, 5]
// var arr = [
//     {number: 111},
//     {number: 222},
//     {number: 333}
// ]

function copy(arr){
    var newArr = []
    for(let item in arr){
        newArr.push(arr[item])
    }
    return newArr
}

var arr1 = copy(arr)

var arr2 = arr.slice()  //arr.slice(0)

var arr3 = arr.concat()

var arr4 = []
Object.assign(arr4, arr)

arr[0] = 100
// arr[0].number = 100

console.log('arr```````', arr)     // [100, 2, 3, 4, 5]
console.log('arr1```````', arr1)   // [1, 2, 3, 4, 5]
console.log('arr2```````', arr2)   // [1, 2, 3, 4, 5]
console.log('arr3```````', arr3)   // [1, 2, 3, 4, 5]
console.log('arr4``````', arr4)    // [1, 2, 3, 4, 5]
// 2. 对象(一层)
var obj = {
    a: 1,
    1: 'aaa',
    b: 2,
    2: 'bbb'
}

function copy1(obj){
    var newObj = {}
    for(var item in obj){
        newObj[item] = obj[item]
    }
    return newObj
}

var obj1 = copy1(obj)

var obj2 = JSON.parse(JSON.stringify(obj))

obj.c = '333'

console.log('obj````````', obj)            // {1: "aaa", 2: "bbb", a: 1, b: 2, c: "333"}
console.log('obj1````````', obj1)          // {1: "aaa", 2: "bbb", a: 1, b: 2}             
console.log('obj2````````', obj2)          // {1: "aaa", 2: "bbb", a: 1, b: 2}
// 所有层级
// 1. JSON.parse + JSON.stringify(obj)

// 2. 递归复制所有层级属性
function deepCopy(obj){
    let newObj = Array.isArray(obj) ? [] : {}
    if(obj && typeof obj === 'object'){
        for(key in obj){
            if(obj.hasOwnProperty(key)){
                if(obj[key] && typeof obj[key] === 'object'){
                    newObj[key] = deepCopy(obj[key])
                }else {
                    newObj[key] = obj[key]
                }
            }
        }
    }
    return newObj   
}

let arr = [1, 2, 3, 4, 5]
let arr1 = deepCopy(arr)

arr[0] = 100

console.log(arr, arr1)  
// [100, 2, 3, 4, 5]   
// [1, 2, 3, 4, 5]

let obj = {
    a: {
        aaa: 1
    },
    1: 'aaa',
    b: 2,
    2: 'bbb'
}

let obj1 = deepCopy(obj)
obj.a.aaa = 111

console.log(obj, obj1)  
// {1: "aaa", 2: "bbb", a: {aaa: 111}, b: 2}  
// {1: "aaa", 2: "bbb", a: {aaa: 1}, b: 2} 


// 3. jquery的extend方法(不适用与IE11及以下)
var obj1 = $.extend(true, {}, obj);
obj.a.aaa = 111;

console.log(obj, obj1);
// {1: "aaa", 2: "bbb", a: {aaa: 111}, b: 2}  
// {1: "aaa", 2: "bbb", a: {aaa: 1}, b: 2}

results matching ""

    No results matching ""