面向对象——传址与传值

雨燕双飞 提交于 2020-02-05 19:04:19

传址

复杂的数据类型–传址: 传递了数值和地址,共享了一块内存空间

传址的两种方式:

  1. 浅拷贝
  2. 深拷贝

浅拷贝: 只拷贝数值,没有拷贝地址。 节省内存,但是因为共享内存,所以相互影响数据

let DadPro = {
    name:"张三",
	age:"20",
	sex:"男"
}
let SonPro = DadPro;

SonPro.name = "李四";
console.log(SonPro);
console.log(DadPro);

深拷贝: 数值和内存都拷贝,相互独立,不彼此影响

 let DadPro = {
    name:"张三",
    age:"20",
    sex:"男",
    obj2:{
        score:"99",
        hobby:"跳舞"
    },
    arr:[],
    fn:function(){
        console.log("dada");
    },
    txt:undefined
}

//JSON.parse(): 这个方法会返回一个新的对象, 以此来达成创建一个
//新地址的目的
//但是通过这个方法完成的深拷贝, 会丢失function(){} 和 undefined

let SonPro = JSON.parse(JSON.stringify(DadPro));
SonPro.name = "王五";
console.log(SonPro);
console.log(DadPro);

let arr = [];
console.log(typeof arr);

使用封装的深拷贝方法: deepCopy()

//引入
<script src="3-deepCopy.js"></script>
//后续的使用
let SonPro = deepCopy(DadPro);
SonPro.name = "李四";
console.log(SonPro);
console.log(DadPro);

deepCopy()

function deepCopy(obj){
    let newObj = Array.isArray(obj)?[]:{};

//for-in: 会遍历对象和原型以及原型链上的属性和方法
//但是我们做深拷贝的时候,不需要去拷贝原型链的内容
    for(let key in obj){
    //hasOwnProperty(): 用来检测指定的内容是否是自身,返回布尔值
        if(obj.hasOwnProperty(key)){
            //判断是否是对象(复杂数据类型)
            if(typeof obj[key] === "object"){
                //如果内部的数据,依然是个对象
                //再调用自身,重复检测赋值一遍
                newObj[key] = deepCopy(obj[key]);
            }else{ //简单的数据类型
                 newObj[key] = obj[key];
            }
        }
    }

    //最后,将我们检测并赋值的新对象返回! 达成新内存的目的
    return newObj;

}

传值

简单的数据类型–传值: 传递数值,新开辟内存

let a = 10;
let b = a;
b = 20;
console.log(a);  //10
console.log(b);  //20
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!