js---浅拷贝与深拷贝

本文详细介绍了JavaScript中的浅拷贝和深拷贝的概念,通过实例展示了两者的区别。浅拷贝仅复制对象的一层属性,对于深层的对象引用,两个对象依然共享同一内存空间。而深拷贝则递归复制对象的所有层级,确保新对象与原对象完全独立。文中还提供了使用for...in循环和Object.assign实现浅拷贝,以及自定义函数实现深拷贝的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

浅拷贝:只是拷贝一层, 更深层次对象级别的只拷贝引用(地址).
深拷贝:拷贝多层, 每一级别的数据都会拷贝.

1.浅拷贝

<script>
	//将对象oldobj复制给对象newobj
	var oldobj = {
	   name: '小新',
	   bestSkills: {
	       music: '枕边童话',
	       sport: '羽毛球'
	   }
	};
	var newobj = {};
	//1.利用for in
	for (var k in oldobj) {
	   // k 是属性名 
	   newobj[k] = oldobj[k];
	}
	console.log(newobj);
	//
	
 </script>

在这里插入图片描述

//修改新对象中对象属性的属性值
newobj.bestSkills.music = '大鱼';
console.log(newobj);
console.log(oldobj);

在这里插入图片描述
原因
浅拷贝 对 属性值为 特殊数据类型的 对象 来说 复制的是地址,所以指向的是同一块内存空间。
在这里插入图片描述
ps:利用es6新增方法Object.assign(target, source)也可实现浅拷贝

Object.assign(newobj, oldobj);

2.深拷贝

<script>
	//将对象oldobj复制给对象newobj
	var oldobj = {
            name: '小新',
            bestSkills: {
                music: '枕边童话',
                sport: '羽毛球'
            },
            friends: ['danny', 'liming']
        };
        var newobj = {};

        // 封装函数 
        function deepCopy(newobj, oldobj) {
            for (var k in oldobj) {
                // 判断属性值属于哪一种数据类型
                // 1. 获取属性值  oldobj[k]
                var 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(newobj, oldobj);
        console.log(newobj);
 </script>

在这里插入图片描述

newobj.bestSkills.music = '大鱼';
console.log(newobj);
console.log(oldobj);

在这里插入图片描述
原因:
深拷贝拷贝多层。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值