不管是在面试中还是我们的项目中经常会用到数组或者对象的深拷贝,下面我就自己总结的分享给大家。

首先要知道什么是深拷贝?什么是浅拷贝?

深拷贝:源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。

浅拷贝:拷贝出来的目标对象的指针和源对象的指针指向的内存空间是同一块空间。

怎么理解呢?

举个栗子:定义了一个对象 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中对象和数组的深拷贝的更多相关文章

  1. javascript中对象和数组的异同点

    一.JS声明对象或数组 JS对象:{ } JS数组:[ ] 对象 var b={m:'123',n:'abc'};alert(b.m);alert(b.n); 一维数组 var a=[1,2,3];a ...

  2. javascript中对象字面量的理解

    javascript中对象字面量与数组字面量 第一部分 我们知道JavaScript中的数据类型有基本数据类型和引用类型,其中Object类型就是非常常用的类型.那么如果创建一个Object类型的实例 ...

  3. javascript中对象的深度克隆

    记录一个常见的面试题,javascript中对象的深度克隆,转载自:http://www.2cto.com/kf/201409/332955.html 今天就聊一下一个常见的笔试.面试题,js中对象的 ...

  4. javaScript(8)---对象和数组

    javaScript(8)---对象和数组 学习要点: 1.Object类型 2.Array类型 3.对象中的方法 什么是对象,其实就是一种类型,即引用类型.而对象的值就是引用类型的实例.在ECMAS ...

  5. javaScript遍历对象、数组总结(转载)

    javaScript遍历对象.数组总结  转载来源 https://www.cnblogs.com/chenyablog/p/6477866.html 在日常工作过程中,我们对于javaScript遍 ...

  6. JavaScript中对象的属性

    在JavaScript中,属性决定了一个对象的状态,本文详细的研究了它们是如何工作的. 属性类型 JavaScript中有三种不同类型的属性:命名数据属性(named data properties) ...

  7. JavaScript中对象转换为原始值的规则

    JavaScript中对象转换为原始值遵循哪些原则? P52 对象到布尔值对象到布尔值的转换非常简单:所有的对象(包括数字和函数)都转换为true.对于包装对象亦是如此:new Boolean(fal ...

  8. JavaScript 遍历对象、数组总结

    在日常工作过程中,我们对于javaScript遍历对象.数组的操作是十分的频繁的,今天抽空把经常用到的方法小结一下,方便今后参考使用!   javaScript遍历对象总结     1.使用Objec ...

  9. JavaScript中常见的数组操作函数及用法

    JavaScript中常见的数组操作函数及用法 昨天写了个帖子,汇总了下常见的JavaScript中的字符串操作函数及用法.今天正好有时间,也去把JavaScript中常见的数组操作函数及用法总结一下 ...

随机推荐

  1. ubuntu下安装PyCharm的两种方式

    PyCharm一个是Python集成开发环境,它既提供收费的专业版,也提供免费的社区版本.PyCharm带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试.语法高亮.Proj ...

  2. 理解npm run

    引言 ReactNative 开发中经常用到一些npm run的命令来打包.最近在这上面踩了一个坑,所以研究了一下. 在阅文做了两个ReactNative混合开发的项目,都用npm run bundl ...

  3. python中的向上取整向下取整以及四舍五入的方法

    import math #向上取整print "math.ceil---"print "math.ceil(2.3) => ", math.ceil(2. ...

  4. cygwin的sh: line 15: $'\r': command not found错误

    安装dos2unix工具,转换一下sh文件即可 apt-cyg install dos2unix dos2unix xxx.sh

  5. 11.全局变量(static)

    1.数组 数组名是常量 2. 指针数组 4.局部变量 (1).作用域 作用的范围: (2).普通局部变量 在{}内定义: 只有执行到定义变量的这个语句,系统才会给这个变量分配空间. 当离开{},这个非 ...

  6. Android Studio旧版(内含SDK)安装和环境变量配置 转自I-T枭

    win10下Android Studio和SDK下载.安装和环境变量配置 ------made by siwuxie095 转自I-T枭https://me.csdn.net/hahahhahahah ...

  7. JavaScript实现RSA加解密

    在GitHub上找到jsencrypt.js对RSA加解密的工具文件,地址分别是:https://github.com/travist/jsencrypt和https://github.com/ope ...

  8. 《linux就该这么学》第十一节课: 第九章,网卡绑定与sshd服务

    8.4.服务的访问控制列表 TCPwrappers是RHEL7中默认启用的流量监控程序,能够对服务做出允许或拒绝. TCPwrappers服务由两个文件控制:  /etc/hosts.allow    ...

  9. HDFS组件性能调优:数据平衡

    生产系统中什么情况下会添加一个节点呢? 1 增加存储能力 disk 2 增加计算能力 cpu mem 如果增加是的是存储能力,说明存储已接近饱和或者说过段时间就会没有剩余的空间给作业来用.新加的节点存 ...

  10. 在vue中使用echarts图表

    在vue中使用echarts图表   转载请注明出处:https://www.cnblogs.com/wenjunwei/p/9815290.html 安装vue依赖 使用npm npm instal ...