【进阶篇】javascript对象和数组的深拷贝和浅拷贝

简介: 【进阶篇】javascript对象和数组的深拷贝和浅拷贝

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

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

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

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

1、对象(object)的深拷贝和浅拷贝:

  1.1对象的浅拷贝:

1 var a={x:0,y:0};
2 var b=a;
3       a.x=2;
4 console.log(a); //=>Object {x: 2, y: 0}
5 console.log(b); //=>Object {x: 2, y: 0}

image.gif

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}

image.gif

方法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}

image.gif

 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]

image.gif

  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]

image.gif

   方法二:利用 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]

image.gif

方法三:数组的 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]

image.gif

       方法四: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]

image.gif

方法五:通过遍历将值赋值

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]

image.gif

通过以上5中方法实现了数组的深拷贝,数组arr1和数组arr2相互独自,互不影响。

目录
相关文章
|
1天前
|
存储 JavaScript 前端开发
JavaScript Array(数组) 对象
JavaScript Array(数组) 对象
11 3
|
1天前
|
存储 JavaScript 前端开发
JavaScript 字符串(String) 对象
JavaScript 字符串(String) 对象
10 3
|
1天前
|
JavaScript 前端开发
JavaScript Date(日期) 对象
JavaScript Date(日期) 对象
9 2
|
3天前
|
JSON JavaScript 前端开发
js如何格式化一个JSON对象?
js如何格式化一个JSON对象?
10 3
|
6天前
|
存储 JavaScript 前端开发
JavaScript Number 对象
JavaScript Number 对象
10 0
|
6天前
|
JavaScript 前端开发
JavaScript prototype(原型对象)
JavaScript prototype(原型对象)
11 0
|
6天前
|
JavaScript 前端开发
JavaScript 对象
JavaScript 对象
10 0
|
5月前
|
JSON 前端开发 JavaScript
【面试题】JavaScript 深拷贝和浅拷贝 高级
【面试题】JavaScript 深拷贝和浅拷贝 高级
|
2月前
|
JavaScript 前端开发
JavaScript中的深拷贝与浅拷贝
JavaScript中的深拷贝与浅拷贝
36 2
|
2月前
|
JavaScript 前端开发
JavaScript中的深拷贝和浅拷贝的实现讲解
在JavaScript中,浅拷贝与深拷贝用于复制对象。浅拷贝仅复制基本类型属性,对于引用类型仅复制引用,导致双方共享同一数据,一方修改会影响另一方。深拷贝则完全复制所有层级的数据,包括引用类型,确保双方独立。浅拷贝可通过简单属性赋值实现,而深拷贝需递归复制各层属性以避免共享数据。
41 1