js之-实现深浅拷贝的各种方法(js深拷贝和浅拷贝的使用场景)
off999 2024-10-29 15:00 25 浏览 0 评论
在js中,数据类型分两种: ‘基本数据类型’ 和 ‘引用数据类型’
‘基本类型数据’ 存在于 栈内存 中,'引用数据类型’ 的属性存在于 栈内存中,值存在与 堆内存中,通过指针来指向对应值
所以,深浅拷贝主要出现在引用数据类型中
如下图,就是浅拷贝,拷贝出来的变量 copyArray,只是拷贝指针,指向的还是同一个堆内存中的数据,所以,其中一个值改变,另外一个值相应改变
如下图,就是深拷贝,拷贝出来的值,在堆内存中另外开辟空间,存储新值,通过指针指向。当改变新拷贝的值时,原值不会被改变。
JSON.prase( JSON.string() )
var arr = [1,2,3,4,5];
var copyArray = JSON.parse( JSON.stringify(arr) );
copyArray[0] = 0;
console.log( arr ) // [1, 2, 3, 4, 5]
console.log( copyArray ) // [0, 2, 3, 4, 5]
但是 JSON.parse来转译深拷贝,真的就没问题吗?
先多层嵌套,试一下是否还能深拷贝
var arr = [1, [2,3] , {name: '1'} ];
var copyArray = JSON.parse( JSON.stringify(arr) );
copyArray[1][1] = 0;
console.log( arr ); // [1, [2,3] , {name: '1'} ]
console.log( copyArray ) ; // [1, [2,0], {name: "1"} ]
从上面代码可以看出,多层嵌套时,也能深拷贝。当数据里含有function是否可以依然深拷贝?
var obj = { name: "1" , f: function(){ alert(1) } };
var copyObj = JSON.parse( JSON.stringify(obj) );
console.log( obj ); // {name: "1", f: ?}
console.log( copyObj ) ; // {name: "1"}
从上面代码可以总结出:
JSON.parse进行深拷贝时,能够满足部分数据需求,能够进行多层次数据的拷贝,但是会忽略function,undefined,symbo,所以在使用时,要注意数据结构
循环递归深拷贝
function copy( obj ){
// 定义常量
const newCopy = obj.constructor === Array ? [] : {};
// 循环数据
for( var key in obj ){
// 判断是否有这个变量
if( obj.hasOwnProperty(key) ){
// 判断当前属性是否有值,并且属不属于Array和object (typeOf,不管array还是object都返回object)
if( !!obj[key] && typeof obj[key] === 'object' ){
// 属于Array或者object,并且有值,调用自身,重新循环
newCopy[key] = copy(obj[key]);
}else {
// 不属于或者没值,直接赋值
newCopy[key] = obj[key]
}
}
}
// return出深拷贝数据
return newCopy;
};
// 调用一下
var demoObj = {
name: {
val:"1",
val2:"2",
val3:"3"
} ,
arr: [1,2,3,4],
f: function(){ alert(2) }
}
var cloneDemoObj = copy(demoObj);
cloneDemoObj.f = function(){
alert(6);
}
demoObj.f(); // 弹出2
cloneDemoObj.f(); // 弹出6
cloneDemoObj.arr[0] = 6;
cloneDemoObj.name.val = "6";
console.log( demoObj ); // {name: {val:"1",val2:"2",val3:"3"} , arr: [1,2,2,4], f:f{} }
console.log( cloneDemoObj); // {name: {val:"6",val2:"2",val3:"3"} , arr: [6,2,2,4], f:f{} }
concat() , slice(),都不改变原数组,新建数据,经测试,只能深拷贝首层数据
var arr = [1,2,3];
var copyArr = arr.concat();
copyArr[0] = 2;
console.log( arr ); // [1, 2, 3]
console.log( copyArr ); // [2, 2, 3]
var arr1 = [1, [1,1,1], 2];
var copyArr1 = arr1.concat();
copyArr1[0] = 0;
copyArr1[1][0] = 0; //深层次数据没有深拷贝,被改变,如下
console.log( arr1 ); // [1, [0,1,1], 2];
console.log( copyArr1); // [0, [0,1,1], 2];
相关推荐
- pip的使用及配置_pip怎么配置
-
要使用python必须要学会使用pip,pip的全称:packageinstallerforpython,也就是Python包管理工具,主要是对python的第三方库进行安装、更新、卸载等操作,...
- Anaconda下安装pytorch_anaconda下安装tensorflow
-
之前的文章介绍了tensorflow-gpu的安装方法,也介绍了许多基本的工具与使用方法,具体可以看Ubuntu快速安装tensorflow2.4的gpu版本。pytorch也是一个十分流行的机器学...
- Centos 7 64位安装 python3的教程
-
wgethttps://www.python.org/ftp/python/3.10.13/Python-3.10.13.tgz#下载指定版本软件安装包tar-xzfPython-3.10.1...
- 如何安装 pip 管理工具_pip安装详细步骤
-
如何安装pip管理工具方法一:yum方式安装Centos安装python3和python3-devel开发包>#yuminstallgcclibffi-develpy...
- Python入门——从开发环境搭建到hello world
-
一、Python解释器安装1、在windows下步骤1、下载安装包https://www.python.org/downloads/打开后选择【Downloads】->【Windows】小编是一...
- 生产环境中使用的十大 Python 设计模式
-
在软件开发的浩瀚世界中,设计模式如同指引方向的灯塔,为我们构建稳定、高效且易于维护的系统提供了经过验证的解决方案。对于Python开发者而言,理解和掌握这些模式,更是提升代码质量、加速开发进程的关...
- 如何创建和管理Python虚拟环境_python怎么创建虚拟环境
-
在Python开发中,虚拟环境是隔离项目依赖的关键工具。下面介绍创建和管理Python虚拟环境的主流方法。一、内置工具:venv(Python3.3+推荐)venv是Python标准...
- 初学者入门Python的第一步——环境搭建
-
Python如今成为零基础编程爱好者的首选学习语言,这和Python语言自身的强大功能和简单易学是分不开的。今天千锋武汉Python培训小编将带领Python零基础的初学者完成入门的第一步——环境搭建...
- 全网最简我的世界Minecraft搭建Python编程环境
-
这篇文章将给大家介绍一种在我的世界minecraft里搭建Python编程开发环境的操作方法。目前看起来应该是全网最简单的方法。搭建完成后,马上就可以利用python代码在我的世界自动创建很多有意思的...
- Python开发中的虚拟环境管理_python3虚拟环境
-
Python开发中,虚拟环境管理帮助隔离项目依赖,避免不同项目之间的依赖冲突。虚拟环境的作用隔离依赖:不同项目可能需要不同版本的库,虚拟环境可以为每个项目创建独立的环境。避免全局污染:全局安装的库可...
- Python内置zipfile模块:操作 ZIP 归档文件详解
-
一、知识导图二、知识讲解(一)zipfile模块概述zipfile模块是Python内置的用于操作ZIP归档文件的模块。它提供了创建、读取、写入、添加及列出ZIP文件的功能。(二)ZipFile类1....
- Python内置模块pydoc :文档生成器和在线帮助系统详解
-
一、引言在Python开发中,良好的文档是提高代码可读性和可维护性的关键。pydoc是Python自带的一个强大的文档生成器和在线帮助系统,它可以根据Python模块自动生成文档,并支持多种输出格式...
- Python sys模块使用教程_python system模块
-
1.知识导图2.sys模块概述2.1模块定义与作用sys模块是Python标准库中的一个内置模块,提供了与Python解释器及其环境交互的接口。它包含了许多与系统相关的变量和函数,可以用来控制P...
- Python Logging 模块完全解读_python logging详解
-
私信我,回复:学习,获取免费学习资源包。Python中的logging模块可以让你跟踪代码运行时的事件,当程序崩溃时可以查看日志并且发现是什么引发了错误。Log信息有内置的层级——调试(deb...
- 软件测试|Python logging模块怎么使用,你会了吗?
-
Pythonlogging模块使用在开发和维护Python应用程序时,日志记录是一项非常重要的任务。Python提供了内置的logging模块,它可以帮助我们方便地记录应用程序的运行时信息、错误和调...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)