引用类型和深浅拷贝


引用类型

let a = 3;
let b = a;
a = 13;
console.log(b);//3

let arr = [1,2,3,4];
let arr2 = arr;
arr[0] = 100;
console.log(arr2);//[1,2,3,4]

let a = 1
let b = 1
console.log(a === b)//false

let obj1 = {a: 1, b: 2}
let obj2 = {a: 1, b: 2}
console.log(obj1 === obj2)

function sum(a, b) { return a+b }
let sum2 = sum
sum2(3, 4)


这就是为什么说,函数名就是一个指针,函数名就是一个地址。

参数传递

    function incObj(obj){
        //let obj = o; //0x0001
        obj.n++;
    }

    var o = {n: 10};
    incObj(o);
    console.log(o);//11

深浅拷贝

浅拷贝

   let arr = [1,4,6];
   let arr2 = shadowCopy(arr);//[1,4,6]
   let arr3 = shadowCopy(arr);//[1,4,6]

   let obj = {a:1,b:2,c:3};
   let obj1 = shadowCopy(obj);//{ a: 1, b: 2, c: 3 }

   function shadowCopy(src){
    //判断是对象还是数据
    let result = Array.isArray(src)?[]:{};
    for(let key in src){
        result[key] = src[key];
    }
    return result;
   }

深拷贝

   let arr = [3,4,[6,8,9]];
   let obj = {a:1,b:5,d:{c:44}};
   let arr1 = deepCody(arr);
   let obj1 = deepCody(obj);

   function deepCody(src){
       let result = Array.isArray(src)?[]:{};
        for(let key in src){
            if(typeof src[key] === 'object' && src[key] !== null){
                result[key] = deepCody(src[key]);
            }else{
                result[key] = src[key];
            }
        }
        return resule;
   }