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

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

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

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

怎么理解呢?

举个栗子:定义了一个对象 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. VS2015调试ArcMap Add-in插件提示尝试运行项目时出错,无法启动程序“路径\arcmap.exe”

    如图所示的错误: 打开VS2015→工具→选项→常规→如图标记的两项打钩: 参考: https://gis.stackovernet.com/cn/q/40845 http://www.voidcn. ...

  2. 初步学习python

    自计算机诞生以来,也伴随着计算机语言的诞生,现在,全世界的编程语言有600多种,但流行的编程语言也就20多种. Java和C一直占据着前两名.但是近年来伴随着人工智能的发展,Python发展迅猛,以其 ...

  3. 点击按钮如何改变当前窗口的url

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. iOS 控制器的生命周期(UIController)

    前言: 在iOS开发中,控制器的生命周期非常重要,什么时候加载页面,什么时候请求接口,什么时候刷新界面等等,都有很多值得优化的地方 loadView: 最先执行的方法,控制器关联的有Nib文件的时候, ...

  5. java实验一总结

    实验一第一部分 在Linux中运行结果 通过cd和mkdir命令建立tree,带包编译并用 javac -d bin 的命令将编译文件保存在bin目录中 通过 java -cp 的命令运行带包的程序 ...

  6. ESP8266 RTOS SDK(IDF)编译环境搭建

    前提条件 按照https://www.cnblogs.com/ansersion/p/10458171.html的步骤搭建非IDF环境 下载 https://github.com/espressif/ ...

  7. Xamarin.Forms 未能找到路径“x:\platforms”的一部分

    https://stackoverflow.com/questions/45500269/xamarin-android-common-targets-error-could-not-find-a-p ...

  8. 让我怀疑人生的bug集合

    bug1:一个人人都知道全局变量易污染,但是我就是污染不了的问题 解决:刚开始动用了session来存这个值,后来觉得太小题大做了,最后使用了闭包来解决,第一个function结束后开启第二个,起初没 ...

  9. namenode No valid image files

    1,角色日志报错 Encountered exception loading fsimage java.io.FileNotFoundException: No valid image files f ...

  10. Vue.js新城之勇者探秘录

    那么我们就继续来聊聊学习Vue的一些方法?以下的学习思路可以供大家作为参考: 1.视频教程带你入门:初学者如果没有MVVM模式的基础学习Vue,可能初期切换思路有比较大的难度,这个时候可以借助视频教程 ...