js深浅拷贝
时间:2021-07-12
本文章向大家介绍js深浅拷贝,主要包括js深浅拷贝使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
深拷贝不会修改数组 浅拷贝会修改数组
首先要知道数据的类型
Number,String,null,Undefined,Object,Boolean
分成两大类 :
基本数据类型,引用数据类型
基本数据类型:
Number,String,null,Undefined,Boolean
复杂数据类型:
Object(引用数据类型)
基本数据类型存储在栈内存里边,引用数据存储在堆内存里边,根本原因是在于保存在栈内存的必须是大小固定的数据,引用类型的大小不固定,只能保存在堆内存中,但是可以把他的地址写在栈内存里边供我们访问。
如果是基本数据类型,就按值访问。操作的就是变量保存的值,如果是引用类型的值,就通过保存在变量中的引用地址来操作实际对象
一、复制:
1.基本数据类型的复制:
赋值的时候,在栈内存里边重新开辟内存,存放变量b,所以在栈内存里边分别存放着变量a,b的值,修改时候互补影响
2.引用类型的复制:
color1和color2指向的是堆内存中的同一个对象,复制的只是引用地址
二、深浅拷贝:
浅拷贝值复制对象的引用地址,而不是复制对象本身,新旧对象还是共享一个引用地址,但是深拷贝会创造一个一模一样的对象,新对象不会和就对象共享内存,修改新对象不会影响旧对象。
1.浅拷贝:
定义:创建一个新对象,这个对象有原始对象的属性值的一份精确拷贝,如果是基本数据的话拷贝的就是它的值,如果数引用数据类型,拷贝的就是它的堆内存的地址,修改一个对象 会影响另一个对象。值是相同的,但是地址也是新开辟的。
浅拷贝的几种方法:
(1)、Object.assign()
对Object。assign而言如果对象的属性值为简单的类型(number,stringify)通过Object.assign()得到的新对象为深拷贝,如果属性值为对象或者其他的引用类型,对这个对象来说就是浅拷贝
Object.assign({},src,src1)对于src src1之间相同的属性是直接覆盖的,如果属性值为对象的话,是不会对 对象之间的属性进行合并的
(2)slice和concat
只有一层的时候是深拷贝
多层的时候:
缺点:数组的slice和concat只是会复制第一层,对于第一层的值都是深拷贝,而到了第二层的时候slice和concat就是复制引用
(3))lodash的clone函数
-.clone(value)
参数:
value(*)要深拷贝的值
返回
(*)返回拷贝后的值
例子:
深拷贝的方法:
(1)递归:
对属性中所有的引用类型的值,遍历到是基本数据为止
(2)JSON对象的parse和stringify
JSON对象中的stringify可以把js对象序列化成一个JSON字符串,parse可以把JSON字符串反序列化成为一个js对象,实现的是深拷贝
缺点:1.使用条件有限制JSON。stringify无法正确转换正则表达式都会转化成{}
2.如果obj里面有时间对象,则JSON.stringify后再JSON.parse的结果,时间将只是字符串的形式,而不是对象的形式
3.如果obj里有函数,undefined,则序列化的结果会把函数或 undefined丢失
4.如果obj里有NaN、Infinity和-Infinity,则序列化的结果会变成null
5.JSON.stringify()只能序列化对象的可枚举的自有属性,例如 如果obj中的对象是有构造函数生成的, 则使用JSON.parse(JSON.stringify(obj))深拷贝后,会丢弃对象的constructor;
(3)lodash的cloneDeep函数
-.cloneDeep(value)
参数:
value(*)要深拷贝的值
返回
(*)返回拷贝后的值
例子:
(4)用的jqery里面的extend方法;
var a = {
name: "zjam",
obj: {
am: "zaofnd",
dvd: "ddddd",
},
};
var b = $.extend(true, {}, a); // 第一个参数true为深拷贝,第二个参数为目标对象,第三个参数为源对象即你用拷贝那个数据
a.obj.am = "早上";
console.log(a);
console.log(b);
缺点:拷贝复杂对象的时候会报错耗性能,内置的拷贝方法会比cloneDeep安全
三、深浅拷贝的主要区别就是:复制的是引用地址还是复制的值
什么时候用深拷贝 /浅拷贝
无论深浅,都是需要的,当深拷贝发生时通常表明存在着一个聚合关系,
当浅拷贝发生时,通常表明存在着相识关系
举个简单例子:当实现一个组合模式 Composite Pattern 时通常都会实
现深拷贝
当实现一个观察者模式 Observer Pattern,时,就需要实现浅拷贝
原文地址:https://www.cnblogs.com/cjq0525/p/15003476.html
- R语言学习 - 图形设置中英字体
- 递归思想解决输出目录下的全部文件
- Linux学习 - 又双叒叕一个软件安装方法
- 在Python中实现你自己的推荐系统
- 在Java中如何实现“Pless presss any key to continue.”
- 震惊小伙伴的Python单行代码
- 如何打造一款可靠的WAF(Web应用防火墙)
- 为啥我的Python这么慢 (一)
- 矩阵的基本知识构造重复矩阵的方法——repmat(xxx,xxx,xxx)构造器的构造方法单位数组的构造方法指定公差的等差数列指定项数的等差数列指定项数的lg等差数列sub2ind()从矩阵索引==》
- 简单的Writer和ReaderWriter的主要方法Writer工作原理Reader的主要方法readLine():String
- 为啥我的Python这么慢 - 项查找 (二)
- 初识字节流+实现缓冲字节流OutputStream的主要方法构造方法读关流实现BufferedInputStream实现BufferedOutputStream为什么read()返回的是Int型而不是
- Properties+重温Map+本地计数器Map方法Properties的方法用Properties的好处
- SequenceInputStreamSequenceInputStream构造方法读关流刷新
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- strstr和strcchr查找字符串和区别
- php获取当前操作系统类型 PHP_OS
- php is_dir 判断是否存在这目录
- php strtoupper 和 array_change_key_case 字符串转大写,小写
- php register_shutdown_function响应error 配合error_get_last 捕获错误
- C# 实现Winform全屏后不遮挡任务栏,显示任务栏
- [TP5填坑]关于助手函数input一不小心取不到get值的解决办法
- 关于nginx为站点绑定域名以及绑定多个域名
- PBMC or 全血,应该选哪个?
- 关于thinkphp5的报错 "mkdir() Permission denied"的解决
- 不同步节点在线使用Remix开发以太坊Dapp及solidity学习入门 ( 一 ):智能合约HelloWorld
- solidity编写eth智能合约之contract 创建合约(二)
- solidity modifier函数修改器 智能合约开发知识浅学(三)
- solidity struct 结构体创建与使用浅学 (四)
- solidity bytes 智能合约开发知识浅学(五点一)bytes基本概念