亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

JavaScript的深淺拷貝

zhunjiee / 590人閱讀

摘要:什么是深淺概念深拷貝淺拷貝只針對像這樣的對象,對于基本類型而言,可以理解為是沒有深淺的區(qū)別的。和指向了同一塊內(nèi)存深拷貝重新開辟了一個空間,修改對象的屬性,彼此不會影響。并不會更改使用遞歸適用于對象里面有對象

什么是深淺 概念

深拷貝、淺拷貝只針對像Object/Array這樣的對象,對于基本類型而言,可以理解為是沒有深淺的區(qū)別的。

淺拷貝復(fù)制的是引用,修改對象的屬性,會彼此影響。

just like this

let a = {name: "ziv"}
let b = a // a和b指向了同一塊內(nèi)存
b.name = "lucky"
console.log(a.name) // "lucky"
console.log(b.name) // "lucky"

深拷貝重新開辟了一個空間,修改對象的屬性,彼此不會影響。

實(shí)現(xiàn)淺拷貝 使用內(nèi)置的方法
// Object.assign()
//只能用于淺拷貝對象或者合并對象
let obj = {a:"x", b: {c: "y"}}
let newObj = Object.assign({}, obj)
obj.b.c = "z"
console.log(newObj) // {a:"x", b: {c: "z"}}

// Array.from() 
// ...操作符
// slice()
// concat() 用于數(shù)組

let arr = [1,2, [3,4,5]]
let sliceArr = arr.slice()
let concatArr = arr.concat()
let fromArr = Array.from(arr)
let newArr = [...arr]

arr[2][1] = "sixsix"

console.log(sliceArr) // [1,2,[3,"sixsix",5]]
console.log(concatArr) // [1,2,[3,"sixsix",5]]
console.log(fromArr) // [1,2,[3,"sixsix",5]]
使用遍歷
// 對象淺拷貝
let shallowCopy = function(obj) {
    // 如果不是對象,不執(zhí)行拷貝
    if (typeof obj !== "object") return 
    // 判斷對象是數(shù)組還是對象
    let newObj = obj instanceof Array ? [] : {}
    // 遍歷obj
    for (let key in obj) {
        if (obj.hasOwnProperty(key)) {
            // 拷貝到新對象中
            newObj[key] = obj[key]
        }
    }
    return newObj
}
實(shí)現(xiàn)深拷貝 序列化反序列化
// 適用于數(shù)組還有對象,但是對于函數(shù)對象、正則對象、稀疏數(shù)組等無法進(jìn)行深拷貝(而且會直接丟失相應(yīng)的值),并且會拋棄對象的constructor,也就是說無論這個函數(shù)的構(gòu)造函數(shù)是誰,使用這種拷貝之后,constructor都會變成Object。對循環(huán)引用同樣無法處理。
let arr = ["old", 1, true, ["old1", "old2"], {old: 1}]

let new_arr = JSON.parse(JSON.stringify(arr))
arr[3][0] = "new1" // new_arr并不會更改
console.log(new_arr) 
使用遞歸
// 適用于對象里面有對象
let deepCopy = function(obj) {
    if (typeof obj !== "object") return obj
    let newObj = obj instanceof Array ? [] : {}
    
    for (let key in obj) {
        if (obj.hasOwnProperty(key)) {
            newObj[key] = typeof obj[key] === "object" ? deepCopy(obj[key]) : obj[key]
        }
    }
    return newObj
}

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/93873.html

相關(guān)文章

  • Javascript對象深淺拷貝

    摘要:開門見山,有人叫對象的復(fù)制為深復(fù)制淺復(fù)制,也有人叫深拷貝淺拷貝。高級屬性修改深拷貝滿足對象的復(fù)制,淺拷貝影響原數(shù)組。關(guān)于對象的深淺拷貝,暫且探索到這里,后續(xù)有新發(fā)現(xiàn)再進(jìn)行補(bǔ)充。 showImg(https://segmentfault.com/img/remote/1460000014305581); 開門見山,有人叫對象的復(fù)制為深復(fù)制淺復(fù)制,也有人叫深拷貝淺拷貝。其實(shí)都是copy。 ...

    qieangel2013 評論0 收藏0
  • JavaScript專題之深淺拷貝

    摘要:專題系列第六篇,講解深淺拷貝的技巧和以及實(shí)現(xiàn)深淺拷貝的思路前言拷貝也是面試經(jīng)典吶數(shù)組的淺拷貝如果是數(shù)組,我們可以利用數(shù)組的一些方法比如返回一個新數(shù)組的特性來實(shí)現(xiàn)拷貝。所以我們可以看出使用和是一種淺拷貝。 JavaScript 專題系列第六篇,講解深淺拷貝的技巧和以及實(shí)現(xiàn)深淺拷貝的思路 前言 拷貝也是面試經(jīng)典吶! 數(shù)組的淺拷貝 如果是數(shù)組,我們可以利用數(shù)組的一些方法比如:slice、co...

    RancherLabs 評論0 收藏0
  • javascript深淺拷貝

    摘要:為何寫最近在研究深淺拷貝,找了很多資料,感覺不是很滿意,所以自己就整理了一份。深拷貝如果給放到新的內(nèi)存中,將的各個屬性都復(fù)制到新內(nèi)存里,就是深拷貝。安全的值是指能夠呈現(xiàn)為有效格式的值。參考文檔冴羽的專題之深淺拷貝深拷貝與淺拷貝的實(shí)現(xiàn) 為何寫: 最近在研究深淺拷貝,找了很多資料,感覺不是很滿意,所以自己就整理了一份。廢話不多說,我們來一起復(fù)習(xí)一下吧,也希望留下您寶貴意見。 何為深淺拷貝?...

    LMou 評論0 收藏0
  • 深淺拷貝

    摘要:深復(fù)制實(shí)現(xiàn)代碼如下第一種方法通過遞歸解析解決第二種方法通過解析解決作者六師兄鏈接原生深拷貝的實(shí)現(xiàn)處理未輸入新對象的情況通過方法構(gòu)造新的對象 深淺拷貝針對的是 對象類型,如果是字符串的數(shù)組用[...arr],還是不會影響 要區(qū)分針對數(shù)組的深淺拷貝(默認(rèn)情況為里面沒有對象的數(shù)組),與針對對象的深淺拷貝 JavaScript數(shù)組深拷貝和淺拷貝的兩種方法 let a1 = [1, 2]; ...

    Karrdy 評論0 收藏0
  • 復(fù)習(xí)Javascript專題(四):js中深淺拷貝

    摘要:基本數(shù)據(jù)類型的復(fù)制很簡單,就是賦值操作,所以深淺拷貝也是針對,這類引用類型數(shù)據(jù)。它會拋棄對象的。另外,查資料過程中還看到這么一個詞結(jié)構(gòu)化克隆算法還有這一篇資料也有參考,也寫得比較詳細(xì)了的深淺拷貝 基本數(shù)據(jù)類型的復(fù)制很簡單,就是賦值操作,所以深淺拷貝也是針對Object,Array這類引用類型數(shù)據(jù)。 淺拷貝對于字符串來說,是值的復(fù)制,而對于對象來說則是對對象地址的復(fù)制;而深拷貝的話,它不...

    MobService 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<