js中的深浅拷贝
js中的深浅拷贝
js中有深拷贝、浅拷贝一说,所谓的深浅拷贝是针对value类型为引用类型(函数、对象、数组)而言的,大概理解的就是:
浅拷贝:
拷贝出的对象c和原始对象o,c和o在key对应的value为引用类型时,其指向同一块内存地址,修改一个必然影响另一个。
举个浅拷贝的例子:
var shallowCopy = function (src) {
var dst = {}
for (const key in src) {
if (src.hasOwnProperty(key)) {
dst[key] = src[key];
}
}
return dst
}
var obj = { a: 1, arr: [2, 3] }
var shallowObj = shallowCopy(obj)
console.log(shallowObj) // { a: 1, arr: [ 2, 3 ] }
// 浅拷贝指向同一地址,修改shallowObj的arr则obj.arr也被修改,a属性是值类型不存在该问题
shallowObj.arr[1] = 5;
console.log(obj) // { a: 1, arr: [ 2, 5 ] }
shallowObj.a = 22
// { a: 1, arr: [ 2, 5 ] } { a: 22, arr: [ 2, 5 ] }
console.log(obj, shallowObj)
var obj2 = { a: 1, t: { b: 3, c: 4, d: { e: 6 } } }
var shallowObj2 = shallowCopy(obj2)
// { a: 1, t: { b: 3, c: 4, d: { e: 6 } } }
console.log(shallowObj2)
深拷贝:
深拷贝出的对象和原对象是完全分开的内存地址,不存在修改一个也修改了另一个的问题。
深拷贝的简单实现:
var china = {
nation: '中国',
birthplaces: ['北京', '上海', '广州'],
skincolr: 'yellow',
friends: ['sk', 'ls']
}
//深复制,要想达到深复制就需要用递归
function deepCopy(o, c) {
var c = c || {}
for (var i in o) {
if (typeof o[i] === 'object') {
//要考虑深复制问题了
if (o[i].constructor === Array) {
//这是数组
c[i] = []
} else {
//这是对象
c[i] = {}
}
deepCopy(o[i], c[i])
} else {
c[i] = o[i]
}
}
return c
}
var result = { name: 'result' }
result = deepCopy(china, result)
result.friends.push('slj')
/**
{ nation: '中国',
birthplaces: [ '北京', '上海', '广州' ],
skincolr: 'yellow',
friends: [ 'sk', 'ls' ] }
{ name: 'result',
nation: '中国',
birthplaces: [ '北京', '上海', '广州' ],
skincolr: 'yellow',
friends: [ 'sk', 'ls', 'slj' ] }
*/
console.dir(china)
console.dir(result)
其次,深拷贝使用JSON.parse(JSON.stringify(src))也可以简单实现,只是该实现破坏了原型链;lodash、jquery提供了相应的工具函数来实现深浅拷贝,就不记录了。
js中的深浅拷贝的更多相关文章
- Javascript 中的深浅拷贝
工作中经常会遇到需要复制 JS 数据的时候,遇到 bug 时实在令人头疼:面试中也经常会被问到如何实现一个数据的深浅拷贝,但是你对其中的原理清晰吗?一起来看一下吧! 为什么会有深浅拷贝 想要更加透彻的 ...
- 天啦噜!仅仅5张图,彻底搞懂Python中的深浅拷贝
Python中的深浅拷贝 在讲深浅拷贝之前,我们先重温一下 is 和==的区别. 在判断对象是否相等比较的时候我们可以用is 和 == is:比较两个对象的引用是否相同,即 它们的id 是否一样 == ...
- Python 中的深浅拷贝
Python 中的深浅拷贝 参考文献:https://blog.csdn.net/lnotime/article/details/81194633 参考文献:https://blog.csdn.net ...
- 【 js 基础 】 深浅拷贝
underscore的源码中,有很多地方用到了 Array.prototype.slice() 方法,但是并没有传参,实际上只是为了返回数组的副本,例如 underscore 中 clone 的方法: ...
- JavaScript中的深浅拷贝
深浅拷贝 在JS中,数据类型分为两类: 简单数据类型:Number.Boolean.String.undefined 引用数据类型:Array.Object.Function 简单数据类型通常 ...
- JS复习之深浅拷贝
一.复习导论(数据类型相关) 想掌握JS的深浅拷贝,首先来回顾一下JS的数据类型,JS中数据类型分为基本数据类型和引用数据类型. 基本数据类型是指存放在栈中的简单数据段,数据大小确定,内存空间大小可以 ...
- Python中的深浅拷贝
1.什么是深浅拷贝? python中一切皆对象,python中的数字.字符串.元组等,如果存放在了内存中,这部分内存里面的内容是不会改变的,但是也有情况,内存中存放了可变对象,比如说列表和字典,他们的 ...
- Core Python Programming一书中关于深浅拷贝的错误
该书关于深浅拷贝的论述: 6.20. *Copying Python Objects and Shallow and Deep Copies "when shallow copies are ...
- Python基础【3】:Python中的深浅拷贝解析
深浅拷贝 在研究Python的深浅拷贝区别前需要先弄清楚以下的一些基础概念: 变量--引用--对象(可变对象,不可变对象) 切片(序列化对象)--拷贝(深拷贝,浅拷贝) 我是铺垫~ 一.[变量--引用 ...
随机推荐
- L-BFGS算法介绍
可以看出,拟牛顿法每次迭代只需要根据前次迭代的即可以计算出,不需要求出Hesse矩阵的逆. 2.4 L-BFGS(limited-memory BFGS) BFGS算法中每次迭代计算需要前次迭代得到的 ...
- asp.net core读取appsetting.json文件
1.在Startup.cs文件中注入,ConfigureServices方法 services.Configure<MyConfig>(Configuration.GetSection(& ...
- 实现liunx之间无密码访问——ssh密匙
环境描述 两台linux服务器 172.16.1.22[client],172.16.1.33[server],想要实现client服务器ssh无密码访问server服务器. 使用技术 linux 的 ...
- Mac 设置终端中使用 sublime 打开文件
在Mac下用终端创建文件等比较方便,但如果配合Sublime用,最好是可以直接在终端中输入命令就可以用Sublime打开指定文件或文件夹. #检查用户目录下有没有bin目录,如里没有就创建一个(目的是 ...
- 转载:在spring中嵌入activemq
转载:http://www.dev26.com/blog/article/137 web开发站中的邮件发送使用了activemq我这是从网上找的进行了一些修改,记录下来,为了避免发送邮件时程序对用户操 ...
- JAVA并发编程学习笔记------多线程调优
1. 多线程场景下尽量使用并发容器代替同步容器 (如ConcurrentHashMap代替同步且基于散列的Map, 遍历操作为主要操作的情况下用CopyOnWriteArrayList代替同步的Lis ...
- D07——C语言基础学PYTHON
C语言基础学习PYTHON——基础学习D07 20180826内容纲要: 面向对象进阶学习 1 静态方法 2 类方法 3 属性方法 4 类的特殊成员方法(本节重点) 5 反射(本节重点) 6 异常(本 ...
- Jvm内存工具
1,JConsole 位于 [JDK] bin 下, 2,代码查看当前进程堆内存 long maxMemory = Runtime.getRuntime().maxMemory();long tot ...
- 9、如何在Xamarin中进行iOS真机调试和发布
本文主要引导用户如何使用真机调试和编译发布. 概述 使用前的准备: 1.一台IPhone设备 或者IPad 都行看你自己 2.一台Mac主机和搭建好对应的xamarin.ios 开发环境 3.开发者 ...
- (转)MySQL数据丢失讨论
原文地址:http://hatemysql.com/tag/sync_binlog/ 1. 概述 很多企业选择MySQL都会担心它的数据丢失问题,从而选择Oracle,但是其实并不十分清楚什么情况下 ...