深拷贝浅拷贝的区别

·  阅读 200

一.浅拷贝

浅拷贝指的是创建新的数据,这个数据有着原始数据属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值。如果属性是引用类型,拷贝的就是内存地址。

在js中,浅拷贝的方法有以下几种:

Object.assign

var obj={
    age:18,
    names:{
      name1:'lixi',
      name2:'xixi'
   },
   hobby:['sing','shopping']
}
var newObj = Object.assign({},fxObj)
复制代码

slice()

  const fxArr = ['One','Two','Three']
  const fxArrs = fxArr.slice(0)
  fxArrs[1] = 'love'
  console.log(fxArr)  // ['One','Two','Three']
  console.log(fxArrs)  //['One','love','Three']
复制代码

concat()

  const fxArr = ['One','Two','Three']
  const fxArrs = fxArr.concat()
  fxArrs[1] = 'love';
  console.log(fxArr) // ['One', 'Two', 'Three']
  console.log(fxArrs) // ['One', 'love', 'Three']
复制代码

拓展运算符

    const fxArr = ["One", "Two", "Three"]
    const fxArrs = [...fxArr]
    fxArrs[1] = "love";
    console.log(fxArr) // ["One", "Two", "Three"]
    console.log(fxArrs) // ["One", "love", "Three"]
复制代码

二、深拷贝

深拷贝开辟一个新的栈,两个对象属性完全相同,但是对应不同的地址,修改一个对象的属性,另一个对象的属性不会变。

常见的深拷贝的方法有以下几种:

_.cloneDeep()

    const _ = require('lodash');
    const obj1 = {
        a: 1,
        b: { f: { g: 1 } },
        c: [1, 2, 3]
    };
    const obj2 = _.cloneDeep(obj1);
    console.log(obj1.b.f === obj2.b.f);// false
复制代码

jQuery.extend()

    const $ = require('lodash');
    const obj1 = {
        a: 1,
        b: { f: { g: 1 } },
        c: [1, 2, 3]
    };
    const obj2 =$.extend(true, {}, obj1);
    console.log(obj1.b.f === obj2.b.f);// false
复制代码

JSON.stringify()

const obj2=JSON.parse(JSON.stringify(obj1));
复制代码
  • 但是这种方法,会忽略undefined、symbol和函数
    const obj = {
        name: 'A',
        name1: undefined,
        name3: function() {},
        name4:  Symbol('A')
    }
    const obj2 = JSON.parse(JSON.stringify(obj));
    console.log(obj2); // {name: "A"}
复制代码
分类:
前端