亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

JavaScript中的深淺拷貝

標簽:
JavaScript

深浅拷贝

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

从上面的例子可以发现,如果给一个变量赋值一个对象,那么两者的值会是同一个引用,其中一方改变,另一方也会相应改变。

解决这个问题,可以引入浅拷贝:

浅拷贝

  1. 可以使用Object.assign 来解决这个问题

let a = {    age: 1}let b = Object.assign({}, a)
a.age = 2console.log(b.age) // 1
  1. 使用ES6展开运算符(...)解决

let a = {    age: 1}let b = {...a}
a.age = 2console.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.clet 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"}



作者:宿雨jj
链接:https://www.jianshu.com/p/b238df26012e


點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消