js深拷贝

该文章主要用于本身在平时学习记录使用javascript

浅拷贝与深拷贝

主要是针对js中引用类型的复制。在引用类型中,定义的变量至关于一个指针,指向了某个对象或数组的引用java

浅拷贝

let obj = {a: 1, b: 1};
let newObj = obj;
newObj.a = 2;
console.log(obj.a);  // 2
复制代码

newObjobj这两个变量都存储了指向对象的一个引用地址,实则共用一个对象,因此当改变newObj.a = 2时,obj.a也发生改变。这就是浅拷贝数组

深拷贝

深拷贝就是让newObj.a发送变化时,obj.a不发生变化,newObjobj至关于两个彻底不一样的对象。bash

深拷贝方法

  • 使用最原始的方法,创建一个新的空对象或数组,遍历每一个元素,将其放到新的对象或数组中,若是碰到元素也是引用类型的,则进行递归。
  • 当进行深拷贝的元素数据为一个数组时,能够使用slice()或者concat()或者ES6中的扩展运算符(该方法也可用于一个对象)方法,可是该方法有个问题,当数组的元素也是一个引用类型时,则没法进行深层次的深拷贝。
let arr = [1, 2, [3, 4], {a: 1, b: 2}];
    let newArr = arr.slice(); //newArr -> [1, 2, [3, 4], {a: 1, b: 2}]
    newArr[0] = 'change';
    console.log(arr, newArr);
复制代码

能够发现:newArr经过slice()方法复制了arr,当改变newArr第一层的元素时,arr不受影响学习

当改变深层的元素内容时,再来看一下效果:测试

能够发现:newArrarr的元素值都有变化ui

经测试,concat()ES6拓展运算符slice()状况相同,有兴趣的童鞋能够本身试验下,童叟无欺!!!spa

  • 最暴力、最直接的方式:JSON.parse(JSON.stringify(obj)),可是该方法也有一些缺陷:3d

    1.数组

    数组元素有 undefinednull时:

    let arr = [undefined, 1, 2, 3, null];
    console.log(JSON.parse(JSON.stringify(arr)));  // [ null, 1, 2, 3, null ];
    复制代码

    其中undefined被转为null, null依然为null指针

    2.对象

    对象中有属性的valueundefined 或者 null时:

    let obj = {a: 1, b: undefined, c: null, d: 'null', e: 'undefined'};
    console.log(JSON.parse(JSON.stringify(obj))); // { a: 1, c: null, d: 'null', e: 'undefined' }
    复制代码

    其中valueundefined的属性被剔除,其他状况不变。

相关文章
相关标签/搜索