学习笔记(深拷贝、浅拷贝)

时间:2021-02-11 19:54:10

基本类型值和引用类型值

1、js中包括2中不同类型的值:基本类型值和引用类型值。

    基本类型值指的是简单的数据段。包括Undifined、Null、Boolean、Number。

    引用类型值指的是由多个值组成的对象。包括对象、数组、函数。

 

2、基本类型值:按值访问,操作的是实际保存的值。

  引用类型值 :按指针访问,根据指针在内存中找到实际的值。(也就是说引用类型值记录的是一个指针,真正的值是通过指针到内存里寻找)。

 

3、浅拷贝:复制时,只复制引用类型值的指针。

     深拷贝:复制时,将内存中的值复制一份,并将指针指向新复制的值。

数组拷贝

//数组浅拷贝
var arr = [1,2,3],
    arrShallow = arr;
arrShallow.push(4);
console.log(arr); //[1,2,3,4]
console.log(arrShallow); //[1,2,3,4]
//数组深拷贝
let pro = [1,2,3],
    proCopy = [];
let deepCopy = function(arr1,arr2){
    for(let i = 0;i < arr1.length;i++ ){
        arr2[i] = arr1[i];
    }
}
deepCopy(pro,proCopy);
pro.push(4);
console.log(pro);//[1,2,3,4]
console.log(proCopy);//[1,2,3]
//复杂一点数组深拷贝
let pro = [[1,2,3],2,3],
    proCopy = [];
let deepCopy = function(arr1){
    let copy = [];
    for(let i = 0;i < arr1.length;i++ ){
        copy[i] = arr1[i] instanceof  Array? deepCopy(arr1[i]) : arr1[i];
    }
    return copy;
}
proCopy = deepCopy(pro);
pro.push(4);
console.log(pro);//[[1,2,3],2,3,4]
console.log(proCopy);//[[1,2,3],2,3]

对象拷贝

//对象浅拷贝
var obj = {name : "小明"},
    objSha = new Object();
objSha = obj;
objSha.age = 13;
console.log(obj);//{name: "小明", age: 13}
console.log(objSha);//{name: "小明", age: 13}
//对象深拷贝
var objs = {name : "小明"},
    objDeep = new Object();
objDeep.name = objs.name;
objDeep.age = 13;
console.log(objs);//{name: "小明"}
console.log(objDeep);//{name: "小明", age: 13}
//复杂一点对象深拷贝
let objs = {name : "小明"},
    objDeep = new Object();
let deepObj = function(source){
    let result = {};
    for(let key in source){
        result[key] = typeof source[key] === 'object'? deepObj(source[key]) : source[key];
    }
    return result;
}
objDeep = deepObj(objs);
objDeep.age = 14;
console.log(objs);//{name: "小明"}
console.log(objDeep);//{name: "小明", age: 13}