JS 浅拷贝&深拷贝

MD!为什么会出现浅拷贝和深拷贝!
源头在这儿:
1.js的基本数据类型和引用数据类型
基本类型(简单的数据段):number、string、boolean、null、undefined、symbol
引用类型值:指那些可能由多个值构成的对象:object

LOOK!!!

在将一个值赋给变量时,解析器必须确定这个值是基本类型值还是引用类型值。
基本数据类型是按值访问的,因为可以操作保存在变量中的实际的值。基本数据类型的值不可变,比如字符串

引用类型的值是保存在内存中的对象。与其他语言不同,JavaScript 不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。 在操作对象时,实际上是在操作对象的引用而不是实际的对象。

tmd!! 怎么理解内存空间:javascript的变量的存储方式--栈(stack)和堆(heap)
栈:自动分配内存空间,系统自动释放,里面存放的是基本类型的值和引用类型的地址

堆:动态分配的内存,大小不定,也不会自动释放。里面存放引用类型的值。

基本类型与引用类型最大的区别实际就是传值与传址的区别
值传递:基本类型采用的是值传递。

var ccx = 0;
var ccx1 = ccx;  ccx&&ccx1都是基本类型
ccx1++;//不能改变ccx的值
console.log(ccx1 + 'md!' + ccx);//1md!0
复制代码

址传递:引用类型则是地址传递,将存放在栈内存中的地址赋值给接收的变量。

var oop1 = [1,2]; 数组是引用类型
var oop2 = oop1;oop1将存在栈中的地址赋值给oop2,oop1和oop2同时指向栈内存地址;
oop2.push(3);
console.log(oop1) //[1,2,3];
console.log(oop2)//[1,2,3];

oop1和oop2的值都一样;tmd!那怎么解决他两个值要不一样呢?
就出现了浅拷贝和深拷贝;

1.浅拷贝解决方法:
数组:
var oop1 = [1,2,4];
var oop2 = [];
for (i in oop1) {
    oop2[i] = oop1[i];//进行浅拷贝,解决oop1和oop2值不一样
}
oop.push(3);
console.log(oop2)//[1,2,4,3]
console.log(oop)//[1,2,4];

对象:   新var一个对象 将现有的对象的值赋值给新对象
var oop1 = {
    "name1":1,
    "name2":2
}

var oop2 = {};
for (x in oop1) {
    oop2[x] = oop1[x]//将现有的对象的值赋值给新对象
}
oop2.name1 = 11;  //验证oop2的name1改变是否导致oop1的name1改变
console.log(oop2)//{name1: 1, name2: 2}
console.log(oop1)//{name1: 11, name2: 2}
结果:oop2的改变没有导致oop1的改变



2.深拷贝解决方法
所谓深拷贝,就是能够实现真正意义上的数组和对象的拷贝,我们通过递归调用  浅拷贝的方式实现。

look!
        var obj1 = {
            fruits: ['apple', 'banner'],
            num: 100
        }
        function deepCopy(obj) {
            var objArray = Array.isArray(obj) ? [] : {};
            if (obj && typeof obj === 'object') {
                for (key in obj) {
                    if (obj.hasOwnProperty(key)) {
                        if (obj[key] && typeof obj[key] === 'object') {
                            objArray[key] = deepCopy(obj[key]);
                        } else {
                            objArray[key] = obj[key];
                        }
                    }
                }
            }
            return objArray; 
        }

        var obj2 = deepCopy(obj1);
        obj2.fruits[0] = 'orange';
        console.log(obj2.fruits[0]); //orange
        console.log(obj1.fruits[0]); //apple


        // jQuery实现方法:
        jQuery.extend([deep], target, object1, [objectN]);

         var obj1 = {
                fruits: ['apple', 'banner'],
                num: 100
            }
            // 第一个参数设置为true,则jQuery返回一个深层次的副本,递归地复制找到的任何对象。
            var obj2  = $.extend(true,{},obj1);
            obj2.fruits[0] = 'orange';
             console.log(obj2.fruits[0]); //orange
            console.log(obj1.fruits[0]); //apple

最简单的深拷贝:b = JSON.parse( JSON.stringify(a) )
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值