JavaScript中的深浅拷贝

深浅拷贝

let a = {
    age: 1
}
let b = a
a.age = 2
console.log(b.age) // 2

从上面的例子能够发明,假如给一个变量赋值一个对象,那末二者的值会是同一个援用,个中一方转变,另一方也会响应转变。

处理这个题目,能够引入浅拷贝:

浅拷贝

  1. 能够运用Object.assign 来处理这个题目
let a = {
    age: 1
}
let b = Object.assign({}, a)
a.age = 2
console.log(b.age) // 1
  1. 运用ES6睁开运算符(…)处理
let a = {
    age: 1
}
let b = {...a}
a.age = 2
console.log(b.age) // 1

一般浅拷贝能处理大部分的题目,然则当碰到,对象内里嵌套一个对象的时刻,就须要用到深拷贝了

let a = {
    age: 1,
    name: {
        first: 'black'
    }
}
let = {...a}
a.name.first = 'guyue'
console.log(b.name.first) // guyue

如许申明浅拷贝并没有对嵌套的对象见效。此时须要深拷贝上场:

深拷贝

深拷贝最简朴的完成方法就是运用JSON.parse(JSON.stringify(object)) 来处理。

let a = {
    age: 1,
    name: {
        first: 'black'
    }
}
let b = JSON.parse(JSON.stringify(a))
a.name.first = 'guyue'
console.log(b.name.first) // black

然则当涌现以下几种状况的时刻,会涌现题目:

let obj = {
    a: 1,
    b: {
        c: 2
    }
}
obj.c = obj.b
obj.d = obj.a
obj.b.c = obj.c
let newObj = JSON.parse(JSON.stringify(obj))
console.log(newObj)
// Uncaught TypeError: Converting circular structure to JSON

报错了,不能处理轮回援用对象的题目。

let obj = {
       age: undefined,
    sex: function(){},
    name: 'black'
}
let newObj = JSON.parse(JSON.stringify(obj))
console.log(newObj) // {name: "black"}

发明只拷贝了name ,而疏忽了undefinedfuncion

所以,JSON.parse(JSON.stringify(obj))碰到这几种状况会涌现题目:

  • 不会拷贝 undefined
  • 不能拷贝函数
  • 不能处理轮回援用的对象

所以采纳下面的体式格局:

function deepClone(obj) {
    let res = obj instanceof Array ? [] : {}
    for(let k in obj) {
        res[k] = obj[k]
        if(typeof obj[k] === Object) {
            deepClone(obj[k])
        }
    }
    return res
}

let obj = {
       age: undefined,
    sex: function(){},
    name: 'black'
}

let newObj = deepClone(obj)
console.log(newObj) // {age: undefined, sex: ƒ, name: "black"}

能够采纳ES2017的新语法:

function copyObject(orig) {
  return Object.create(
    Object.getPrototypeOf(orig),
    Object.getOwnPropertyDescriptors(orig)
  );
}

let obj = {
       age: undefined,
    sex: function(){},
    name: 'black'
}

let newObj = copyObject(obj)
console.log(newObj) // {age: undefined, sex: ƒ, name: "black"}
    原文作者:hu970804
    原文地址: https://segmentfault.com/a/1190000016149265
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞