JavaScript的深拷贝和浅拷贝总结
深拷贝和浅拷贝
深拷贝:拷贝实例;浅拷贝:拷贝引用(原对象)。
说深拷贝和浅拷贝之前,我先去了解了下高程书上的JavaScript的变量类型:
基本类型:undefined、null、Boolean、number、string。变量直接按指存放在栈区内,可以直接访问,所以我们平时把字符串、数字的值赋值给新变量,相当于把值完全复制过去,新变量的改变不会影响旧变量。
引用类型:存放在堆区的对象,变量在栈区中保存的是一个指针地址。
例子
let a = 123;
let b = a;
b = 456;
console.log(a);//123
console.log(b);//456
深拷贝和浅拷贝图解
浅拷贝实现方式
函数实现
function shallowClone (source){
if(!source || typeof source != 'object'){
throw new Error ('error');
}
var targetObj = source.constructor === Array ? [] : {};
for(var keys in source) {
if(source.hasOwnProperty(keys)){
targetObj[keys] = source[keys];
}
}
return targetObj;
}
最简单的浅拷贝:变量复制
let a = 123;
let b = a;
b = 456;
console.log(a);
console.log(b);
通过es6新增的Object.assign来复制对象
let obj = { name: '程序狗', age:{child: 12} }
let copy = Object.assign({}, obj);
copy.name = '单身狗';
copy.age.child = 24;
console.log(obj);// { name: '程序狗', age:{child: 24} }
jquey中的$.extend({}, obj); Array.prototype.slice()和Array.prototype.concat()都会返回一个数组或者对象的浅拷贝。(看起来像深拷贝)
- 深拷贝实现
函数实现
function cloneDeep(obj){
if(typeof obj !== 'object' || Object.keys(obj).length === 0 ){
return obj;
}
let resultData = {};
return recurison(obj, resultData);
} function recurison(obj, data = {}){
for(key in obj){
if(typeof obj[key] == 'object' && Object.keys(obj[key].length > 0 )){
data[key] = recurison(obj[key]);
}else{
data[key] = obj[key];
}
}
return data;
} var o1 = {
arr: [1, 2, 3],
obj: {
key: 'value'
},
func: function(){
return 1;
}
}; var o3 = cloneDeep(o1);
console.log(o3 === o1);//false
console.log(o3.obj === 01.obj);//false
console.log(o3.func === o1.func);//true
JSON对象中的parse和stringify,JOSN对象中的stringify可以把一个js对象序列化为一个JSON字符串,parse可以把JSON字符串反序列化为一个js对象,通过这两个方法,也可以实现对象的深复制。
JavaScript的深拷贝和浅拷贝总结的更多相关文章
- javascript对象深拷贝,浅拷贝 ,支持数组
javascript对象深拷贝,浅拷贝 ,支持数组 经常看到讨论c#深拷贝,浅拷贝的博客,最近js写的比较多, 所以也来玩玩js的对象拷贝. 下面是维基百科对深浅拷贝的解释: 浅拷贝 One meth ...
- 也来玩玩 javascript对象深拷贝,浅拷贝
经常看到讨论c#深拷贝,浅拷贝的博客,最近js写的比较多, 所以也来玩玩js的对象拷贝. 下面是维基百科对深浅拷贝的解释: 浅拷贝 One method of copying an object is ...
- JavaScript的深拷贝和浅拷贝
一.数据类型 数据分为基本数据类型(String, Number, Boolean, Null, Undefined,Symbol)和对象数据类型.. 1.基本数据类型的特点:直接存储在栈(stack ...
- JavaScript的深拷贝与浅拷贝
深拷贝和浅拷贝是在面试中经常遇到的问题.今天在这里总结一下. 深拷贝与浅拷贝的问题,涉及到JavaScript的变量类型,先来说说变量的类型,变量类型包括基本类型和引用类型. 基本类型:Undefin ...
- 详解javascript的深拷贝与浅拷贝
1. 认识深拷贝和浅拷贝 javascript中一般有按值传递和按引用传递两种复制,按值传递的是基本数据类型(Number,String,Boolean,Null,Undefined),一般存放于内存 ...
- JavaScript 的 深拷贝和浅拷贝
深拷贝和浅拷贝都是针对的引用类型, JS中的变量类型分为值类型(基本类型)和引用类型: 对值类型进行复制操作会对值进行一份拷贝,而对引用类型赋值,则会对地址进行拷贝,最终两个变量指向同一份数据 一.先 ...
- JavaScript之深拷贝和浅拷贝
前言 工作中会经常遇到操作数组.对象的情况,你肯定会将原数组.对象进行‘备份’当真正对其操作时发现备份的也发生改变,此时你一脸懵逼,到时是为啥,不是已经备份了么,怎么备份的数组.对象也会发生变化.如果 ...
- javaScript深拷贝和浅拷贝简单梳理
在了解深拷贝和浅拷贝之前,我们先梳理一下: JavaScript中,分为基本数据类型(原始值)和复杂类型(对象),同时它们各自的数据类型细分下又有好几种数据类型 基本数据类型 数字Number 字符串 ...
- 读懂javascript深拷贝与浅拷贝
1. 认识深拷贝和浅拷贝 javascript中一般有按值传递和按引用传递两种复制,按值传递的是基本数据类型(Number,String,Boolean,Null,Undefined),一般存放于内存 ...
随机推荐
- Java应用开发的一条重要经验:先建立基础设施
一旦为应用建立良好的基础设施, 后续的开发就会变得容易而快速.这些基础设施包括: 1. 线程池的建立与配置: 在 JDK 并发库的基础上建立适合于应用的多任务接口和框架: 2. 外部系统服务 ...
- python recv()是什么
socket有个recv方法,recv有一个参数,指定数据缓冲区的大小 但是现在的问题就是不知道将要接受的数据的大小到底是多少,可能只有几个字节,可能会有几M,google了一下socket的入门文章 ...
- linux常用命令:ip 命令
ip命令是Linux下较新的功能强大的网络配置工具. 1.命令格式: ip [OPTIONS] OBJECT [COMMAND [ARGUMENTS]] 2.命令功能: ip命令用来显示或操纵L ...
- Linux服务器---使用mysql
使用mysql 1.登录,可以用密码登录,也可以不用密码登录.命令格式“mysql –u 用户名 –p 密码” [root@localhost src]# mysql -u root –p / ...
- Linux基础命令---resizefs
resize2fs 调整ext2\ext3\ext4文件系统的大小,它可以放大或者缩小没有挂载的文件系统的大小.如果文件系统已经挂载,它可以扩大文件系统的大小,前提是内核支持在线调整大小. size参 ...
- SQL锁机制和事务隔离级别
摘自:http://www.cnblogs.com/haiyang1985/archive/2009/02/27/1399641.html 锁机制 NOLOCK和READPAST的区别. 1. ...
- Rest风格(占位符)的映射
- 查询oracle数据库里面所有的表名
如果是当前用户,"select * from tab"即可
- [BZOJ1497]最大获利
Description 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS&T通讯公司在新一代通讯技术血战的前夜,需要做太多的准备工作,仅就站址选择一 ...
- HDU 3746 Cyclic Nacklace(KMP+最小循环节)题解
思路: 最小循环节的解释在这里,有人证明了那么就很好计算了 之前对KMP了解不是很深啊,就很容易做错,特别是对fail的理解 注意一下这里getFail的不同含义 代码: #include<io ...