JavaScript 赋值、浅拷贝、深拷贝的区别与实现

赋值、浅拷贝、深拷贝的区别

在这里插入图片描述
一 、赋值
赋值是将某一数值或对象赋给某个变量的过程,分为:

1、基本数据类型:赋值,赋值之后两个变量互不影响

let a = 5;
let b = a;

console.log(a + b); // 10

a = 10;
console.log(a + b); // 15

2、引用数据类型:赋,两个变量具有相同的引用,指向同一个对象,相互之间有影响



let a = {
    name: 'zhangsan',
    age:18,
    book: {
        title: '高性能JavaScript',
        price: '50'
    }
}

let b = a
console.log(b);

a.name ='lisi'
a.book.price = '60'
console.log(a);
console.log(b);

输出结果

{
  name: 'zhangsan',
  age: 18,
  book: { title: '高性能JavaScript', price: '50' }
}
{
  name: 'lisi',
  age: 18,
  book: { title: '高性能JavaScript', price: '60' }
}
{
  name: 'lisi',
  age: 18,
  book: { title: '高性能JavaScript', price: '60' }
}

对基本类型进行赋值操作,两个变量互不影响。

二、浅拷贝

 let obj={
            name:"hello",
            sex:'男',
            msg:{
                phone:123456,
                age:18
            },
            color:['red','yellow']
        }
        let o={};
        let s={}
        console.log('-------------------ES5-------------');
        for(let k in obj){
            s[k]=obj[k]
        }

        console.log(s);
        console.log('-------------------ES6语法糖-------------');
        Object.assign(o,obj);

        console.log(o);
        o.msg.age=30;
        console.log(obj);

输出结果
在这里插入图片描述

浅拷贝结论
浅拷贝将原对象或原数组的引用直接赋给新对象,新数组,新对象/数组只是原对象的一个引用(拷贝后的引用都是指向同一个对象的实例,彼此之间的操作会互相影响)

三、深拷贝


let obj = {
    name: "hello",
    sex: '男',
    msg: {
        phone: 123456,
        age: 18
    },
    color: ['red', 'yellow']
}
// 深拷贝
let deep = {}
function deepCopy(newobj, oldobj) {
    for (let k in oldobj) {
        // 判断属性值属于那种数据类型
        // 1、获取属性值 欧拉都比较[k]
        let item = oldobj[k];
        // 2、判断这个是不是数组

        if (item instanceof Array) {
            newobj[k] = [];
            deepCopy(newobj[k], item)
        } else if (item instanceof Object) {

            // 3、判断这个值是不是对象
            newobj[k] = {};
            deepCopy(newobj[k], item)
        } else {
            // 4、属于简单数据类型
            newobj[k] = item;
        }
    }
}

deepCopy(deep, obj)
console.log(deep);
let arr = [];
console.log(arr instanceof Object);

输出结果
在这里插入图片描述

deep.msg.age = 20;
console.log(obj);

输出结果
在这里插入图片描述
深拷贝结论
深拷贝是将原对象的各个属性的“值”逐个复制出去,而且将原对象各个属性所包含的对象也依次采用深拷贝的方法递归复制到新对象上(注意拷贝的“值”而不是“引用”

try it  或者 do it

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值