JavaScript中对象和数组的深拷贝
不管是在面试中还是我们的项目中经常会用到数组或者对象的深拷贝,下面我就自己总结的分享给大家。
首先要知道什么是深拷贝?什么是浅拷贝?
深拷贝:源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。
浅拷贝:拷贝出来的目标对象的指针和源对象的指针指向的内存空间是同一块空间。
怎么理解呢?
举个栗子:定义了一个对象 A={x:0,y:0},和一个对象B,我现在要将对象A赋值给对象B,如果对象A的值发生改变后对象B的值也发生改变的话我们称这种拷贝为浅拷贝,如果A的值发生变化后B的值不发生变化则称这种拷贝为深拷贝。当A被赋值时就已经有了自己的内存,深拷贝的同时为对象B开辟了 一个新的内存,A所对应的内存和B所对应的内存相互独自,互不影响。而浅拷贝时不会为B开辟新的内存,B指向了A的内存,A的值的变化会影响B的值。
1、对象(object)的深拷贝和浅拷贝:
1.1对象的浅拷贝:
var a={x:0,y:0};
var b=a;
a.x=2;
console.log(a); //=>Object {x: 2, y: 0}
console.log(b); //=>Object {x: 2, y: 0}
以上代码很简单,定义了一个对象a,将对象a赋值给对象b,修改a的x值为2,打印a和b的值,结果显示a的x值为2,而b的x值也为2,这就是简单的浅拷贝。
1.2对象的深拷贝的几种方法:
方法1:利用JSON.parse();
var obj1={x:0,y:0};
var obj2=JSON.parse(JSON.stringify(obj1));
obj1.x=2;
console.log(obj1); //=>Object {x: 2, y: 0}
console.log(obj2); //=>Object {x: 0, y: 0}
方法2:es6中的Object.assign();
var obj1={x:1,y:1};
var obj2=Object.assign({},obj1);
obj1.x=2;
console.log(obj1);//=>Object {x: 2, y: 1}
console.log(obj2);//=>Object {x: 1, y: 1}
以上两种方法显示:obj1的值发生变化不会影响obj2的值。
2、数组(Array)的深拷贝和浅拷贝:
2.1数组的浅拷贝:
var arr1=[1,2,3];
var arr2=arr1;
arr1.push(5);
console.log(arr1);//=>[1, 2, 3, 5]
console.log(arr2);//=>[1, 2, 3, 5]
以上通过赋值的方法进行浅拷贝,结果显示,数组arr1发生变化时数组arr2的值也发生变化。
2.2数组深拷贝的几种方法:
方法一:利用slice()方法:
var arr=[1,2,3];
var arr2=arr.slice();
arr.push(4);
console.log(arr); //=>[1, 2, 3, 4]
console.log(arr2);//=>[1, 2, 3]
方法二:利用 Object.assign() 方法:
var arr=[1,2,3];
var arr2=Object.assign([],arr);
arr.push(4);
console.log(arr);//=>[1, 2, 3, 4]
console.log(arr2);//=>[1, 2, 3]
方法三:数组的 concat() 方法:
var arr=[1,2,3];
var arr2=arr.concat();
arr.push(4);
console.log(arr);//=>[1, 2, 3, 4]
console.log(arr2);//=>[1, 2, 3]
方法四:es6中的扩展运算符:
let arr=[1,2,3];
let [...arr2]=arr;
arr.push(4);
console.log(arr);//=>[1, 2, 3, 4]
console.log(arr2);//=>[1, 2, 3]
方法五:通过遍历将值赋值:
let arr=[1,2,3];
let arr2=arr.map((item,index)=>{
return item;
})
arr.push(4);
console.log(arr);//=>[1, 2, 3, 4]
console.log(arr2);//=>[1, 2, 3]
通过以上5中方法实现了数组的深拷贝,数组arr1和数组arr2相互独自,互不影响。
JavaScript中对象和数组的深拷贝的更多相关文章
- javascript中对象和数组的异同点
一.JS声明对象或数组 JS对象:{ } JS数组:[ ] 对象 var b={m:'123',n:'abc'};alert(b.m);alert(b.n); 一维数组 var a=[1,2,3];a ...
- javascript中对象字面量的理解
javascript中对象字面量与数组字面量 第一部分 我们知道JavaScript中的数据类型有基本数据类型和引用类型,其中Object类型就是非常常用的类型.那么如果创建一个Object类型的实例 ...
- javascript中对象的深度克隆
记录一个常见的面试题,javascript中对象的深度克隆,转载自:http://www.2cto.com/kf/201409/332955.html 今天就聊一下一个常见的笔试.面试题,js中对象的 ...
- javaScript(8)---对象和数组
javaScript(8)---对象和数组 学习要点: 1.Object类型 2.Array类型 3.对象中的方法 什么是对象,其实就是一种类型,即引用类型.而对象的值就是引用类型的实例.在ECMAS ...
- javaScript遍历对象、数组总结(转载)
javaScript遍历对象.数组总结 转载来源 https://www.cnblogs.com/chenyablog/p/6477866.html 在日常工作过程中,我们对于javaScript遍 ...
- JavaScript中对象的属性
在JavaScript中,属性决定了一个对象的状态,本文详细的研究了它们是如何工作的. 属性类型 JavaScript中有三种不同类型的属性:命名数据属性(named data properties) ...
- JavaScript中对象转换为原始值的规则
JavaScript中对象转换为原始值遵循哪些原则? P52 对象到布尔值对象到布尔值的转换非常简单:所有的对象(包括数字和函数)都转换为true.对于包装对象亦是如此:new Boolean(fal ...
- JavaScript 遍历对象、数组总结
在日常工作过程中,我们对于javaScript遍历对象.数组的操作是十分的频繁的,今天抽空把经常用到的方法小结一下,方便今后参考使用! javaScript遍历对象总结 1.使用Objec ...
- JavaScript中常见的数组操作函数及用法
JavaScript中常见的数组操作函数及用法 昨天写了个帖子,汇总了下常见的JavaScript中的字符串操作函数及用法.今天正好有时间,也去把JavaScript中常见的数组操作函数及用法总结一下 ...
随机推荐
- 动态规划 hdu 1024
Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- subline text3 安装 rem装换工具
CSSREM 一个CSS的px值转rem值的Sublime Text 3自动完成插件. 插件效果如下: 安装 下载本项目,比如:git clone https://github.com/flashli ...
- Elasticsearch学习笔记(五)索引元数据和集群元数据
一.索引元数据 执行:GET /ecommerce/product/1 返回结果: { "_index": "ecommerce", "_ty ...
- yii的数据库相关操作
获取某一列数据 self::find()->where(['pid'=>$this->id])->select('id')->column(); 更新操作 $model- ...
- Spring Boot(二):Spring-Data-JPA操作数据库( Hibernate)增删改查
一.Maven使用3.3.9版本或以上,选择Binary 版本 二.添加spring-data-jpa和数据库依赖,以oracle为例 三.添加连接数据库配置 四.新建model自动生成数据库表(不用 ...
- jsp的环境搭建
JSP : 动态网页 一.静态和动态的区别: 1.是否会随着时间.地点.用户操作的改变而改变. 2.动态网页需要使用服务器端的脚本语言(JSP) 二.BS CS 1.CS:QQ.微信.CS游戏. 缺点 ...
- 【window】mongodb安装和配置
最近要独立开发vue+mongodb+node的小项目,项目不大,但之前没了解过mongodb还是蛮不容易的,因为以前用MySQL的时候都是用的集成化的工具,完全不用写命令去启动,用mogodb首先需 ...
- 学号 20175201张驰 《Java程序设计》第4周学习总结
学号 20175201张驰 <Java程序设计>第4周学习总结 教材学习内容总结 第5章 继承:避免多个类间重复定义共同行为,用我们已经有的类,去创建新的类 任何子类都可以继承它的父类的成 ...
- 关于微信跳转,这里有你想知道的一切weixin://dl/business/?ticket=td9cd0bf056c561fe9f56e33c61df61bf
纠结了了很久,还是放出来部分接口,相信能够看到这篇文章的人也基本都是需求比较强烈的. 京东: https://wq.jd.com/mjgj/link/GetOpenLink?rurl=http%3a% ...
- Mybatis 元素内容必须由格式正确的字符数据或标记组成
一个web应用,框架为SpringMVC Spring Mybatis ,昨天写了一下午的代码,因为逻辑较大,期间也没测,打算写完这个功能点在进行测试,谁知道写完的时候,tomcat根本启动不起来了, ...