分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 软件开发

JS对象的引用,对象的拷贝

发布时间:2023-09-06 01:51责任编辑:傅花花关键词:暂无标签

[Toc]

一、场景

除了基本类型跟null,对象之间的赋值,只是将地址指向同一个,而不是真正意义上的拷贝

将一个对象赋值给另外一个对象。

var a = [1,2,3];var b = a;b.push(4); // b中添加了一个4alert(a); // a变成了[1,2,3,4] ?

自定义对象

var obj = {a:10};var obj2 = obj;obj2.a = 20; // obj2.a改变了,alert(obj.a); // 20,obj的a跟着改变 ?

这就是由于对象类型直接赋值,只是将引用指向同一个地址,导致修改了obj会导致obj2也被修改

二、浅拷贝

所以,我们需要封装一个函数,来对对象进行拷贝,通过for in 循环获取基本类型,赋值每一个基本类型,才能真正意义上的复制一个对象

var obj = {a:10};function copy(obj){ ???var newobj = {}; ???for ( var attr in obj) { ???????newobj[attr] = obj[attr]; ???} ???return newobj;}var obj2 = copy(obj);obj2.a = 20;alert(obj.a); //10 ?

这样就解决了对象赋值的问题。

三、深拷贝

但是这里存在隐患,如果obj中,a的值不是10,而是一个对象,这样就会导致在for in中,将a这个对象的引用赋值为新对象,导致存在对象引用的问题。

var obj = {a:{b:10}};function copy(obj){ ???var newobj = {}; ???for ( var attr in obj) { ???????newobj[attr] = obj[attr]; ???} ???return newobj;}var obj2 = copy(obj);obj2.a.b = 20;alert(obj.a.b); //20 ?

因此,由于这个copy对象只是对第一层进行拷贝,无法拷贝深层的对象,这个copy为浅拷贝,我们需要通过递归,来拷贝深层的对象。将copy改造成递归即可

var obj = {a:{b:10}};function deepCopy(obj){ ???if(typeof obj != ‘object‘){ ???????return obj; ???} ???var newobj = {}; ???for ( var attr in obj) { ???????newobj[attr] = deepCopy(obj[attr]); ???} ???return newobj;}var obj2 = deepCopy(obj);obj2.a.b = 20;alert(obj.a.b); //10 ?

JS对象的引用,对象的拷贝

原文地址:https://www.cnblogs.com/wfblog/p/8952523.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved