成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

js淺拷貝及深拷貝的幾種方法

wing324 / 1245人閱讀

摘要:但這兩種拷貝有一個(gè)問(wèn)題就是只能賦值一層,假設(shè)我們有如下數(shù)據(jù)結(jié)構(gòu)臧三小明小芳我們會(huì)發(fā)現(xiàn)打印出的結(jié)果如下上圖可看出的結(jié)果均變了,這并不是我們想要的結(jié)果,所以我們要用到深拷貝。

一個(gè)項(xiàng)目開(kāi)發(fā)中經(jīng)常會(huì)用到需要復(fù)制一個(gè)對(duì)象或者數(shù)組,但是卻不能改變?cè)紝?duì)象,所以就要用到拷貝,拷貝又分深拷貝和淺拷貝,今天列舉一下幾種拷貝形式。

一、淺拷貝 (1) Object.assign()

Object.assign我們經(jīng)常會(huì)用到合并對(duì)象,當(dāng)然利用Object.assign性質(zhì)我們也可以實(shí)現(xiàn)對(duì)象的拷貝。

var obj1 = {a: 1, b: 2}
 
var obj2 = Object.assign({}, obj1)
 
obj2.a = 4
 
console.log(obj1, obj2)

結(jié)果如圖:

這里要注意的是Object.assign第一個(gè)參數(shù)必須是個(gè)空對(duì)象

(2) 解構(gòu)賦值
var obj1 = {a: 1, b: 2}
 
var obj2 = {...obj1}
 
obj2.a = 4
 
console.log(obj1, obj2)

結(jié)果如圖:

這里一樣可以實(shí)現(xiàn)之前上面的結(jié)果。

但這兩種拷貝有一個(gè)問(wèn)題就是只能賦值一層,假設(shè)我們有如下數(shù)據(jù)結(jié)構(gòu)

var obj1 = [{
    name: "臧三",
    childs: ["小明", "小芳"]
}]
 
var obj2 = [...obj1]
 
obj2[0].childs = []
 
console.log(obj1, obj2)

我們會(huì)發(fā)現(xiàn)打印出的結(jié)果如下:

上圖可看出obj1,obj2 的結(jié)果均變了,這并不是我們想要的結(jié)果,所以我們要用到深拷貝。

二、深拷貝 (1) 利用json.stringify
var obj1 = [{
    name: "臧三",
    childs: ["小明", "小芳"]
}]
 
var obj2 = JSON.parse(JSON.stringify(obj1))
 
obj2[0].childs = []
 
console.log(obj1, obj2)

結(jié)果如下:

這樣的話就能達(dá)到我們想要的結(jié)果。

這種方法簡(jiǎn)單,但也有弊端,看看下面的數(shù)據(jù)結(jié)構(gòu):

var obj1 = [{
    name: "臧三",
    childs: ["小明", "小芳"],
    fn: function() {},
    age: undefined
}]
 
var obj2 = JSON.parse(JSON.stringify(obj1))
 
obj2[0].childs = []
 
console.log(obj1, obj2)

結(jié)果:

我們從結(jié)果中發(fā)現(xiàn),值為undefined,或者function的時(shí)候并不會(huì)拷貝過(guò)來(lái)。

(2) 利用遞歸來(lái)實(shí)現(xiàn)一個(gè)方法進(jìn)行拷貝
var obj1 = [{
    name: "臧三",
    childs: ["小明", "小芳"],
    fn: function() {},
    age: undefined
}]
 
var obj2 = extend(obj1)
 
obj2[0].childs = []
 
console.log(obj1, obj2)
 
function extend(data) {
    if (typeof data === "object" && data) {
        let val = typeof data.length === "number" ? [] : {}
        for(let i in data) {
            val[i] = extend(data[i])
        }
        return val
    } else {
        return data
    }
}

結(jié)果:

這樣我們就能把所有值都拷貝過(guò)來(lái)。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/103224.html

相關(guān)文章

  • js拷貝和深拷貝

    摘要:拷貝分為淺拷貝和深拷貝。淺拷貝是引用復(fù)制,深拷貝是完全單純拷貝數(shù)據(jù)的值。所以,這種方法只是簡(jiǎn)單繞過(guò)第一層箱子的引用復(fù)制深拷貝目前比較好的方法就是大法,要么就是自己寫(xiě)遞歸的深拷貝函數(shù)。附帶深拷貝的自定義函數(shù)源自大佬的 經(jīng)常遇到數(shù)組或?qū)ο蟮纫妙?lèi)型作為函數(shù)的參數(shù)的情況,但又不想修改原來(lái)的數(shù)據(jù),這時(shí)候就需要拷貝(基本類(lèi)型的變量不需要考慮)??截惙譃闇\拷貝和深拷貝。淺拷貝是引用復(fù)制,深拷貝是完...

    jsliang 評(píng)論0 收藏0
  • 前端基礎(chǔ)匯總

    摘要:及相關(guān)問(wèn)題數(shù)據(jù)類(lèi)型函數(shù)中指向原型作用域閉包面向?qū)ο髮?duì)象創(chuàng)建模式繼承嚴(yán)格模式與對(duì)象轉(zhuǎn)換的方法添加屬性,根據(jù)原型創(chuàng)建區(qū)別新特性解構(gòu)賦值簡(jiǎn)化對(duì)象寫(xiě)法剪頭函數(shù)三點(diǎn)運(yùn)算符模板字符串形參默認(rèn)值異步過(guò)程深拷貝與淺拷貝賦值與淺拷貝的區(qū)別淺拷貝的幾種方法實(shí)現(xiàn) js及es相關(guān)問(wèn)題 數(shù)據(jù)類(lèi)型函數(shù)中this指向——————原型作用域閉包——————面向?qū)ο髮?duì)象創(chuàng)建模式繼承——————Es5嚴(yán)格模式Json與j...

    2json 評(píng)論0 收藏0
  • 前端基礎(chǔ)匯總

    摘要:及相關(guān)問(wèn)題數(shù)據(jù)類(lèi)型函數(shù)中指向原型作用域閉包面向?qū)ο髮?duì)象創(chuàng)建模式繼承嚴(yán)格模式與對(duì)象轉(zhuǎn)換的方法添加屬性,根據(jù)原型創(chuàng)建區(qū)別新特性解構(gòu)賦值簡(jiǎn)化對(duì)象寫(xiě)法剪頭函數(shù)三點(diǎn)運(yùn)算符模板字符串形參默認(rèn)值異步過(guò)程深拷貝與淺拷貝賦值與淺拷貝的區(qū)別淺拷貝的幾種方法實(shí)現(xiàn) js及es相關(guān)問(wèn)題 數(shù)據(jù)類(lèi)型函數(shù)中this指向——————原型作用域閉包——————面向?qū)ο髮?duì)象創(chuàng)建模式繼承——————Es5嚴(yán)格模式Json與j...

    laznrbfe 評(píng)論0 收藏0
  • js深度克隆幾種方法

    摘要:方法一老老實(shí)實(shí)敲代碼法迭代法,適用于所有方法二利用將對(duì)象序列化字符串,再使用來(lái)反序列化還原對(duì)象缺點(diǎn)如果里面有時(shí)間對(duì)象,則后再的結(jié)果,時(shí)間將只是字符串的形式。簡(jiǎn)而言之,第一層實(shí)現(xiàn)了深度拷貝,后續(xù)層次還是淺拷貝 方法一 老老實(shí)實(shí)敲代碼法(迭代法,適用于所有) function deepClone(obj) { let newObj = Array.isArray(obj) ? [...

    Pluser 評(píng)論0 收藏0
  • 面試小結(jié)(一)

    摘要:面試問(wèn)到的問(wèn)題繼承的幾種方法,,原形繼承面向?qū)ο蟮膸追N方法五種方式對(duì)象字面量創(chuàng)建實(shí)例對(duì)象構(gòu)造函數(shù)工廠模式用一個(gè)函數(shù),通過(guò)傳遞參數(shù)返回對(duì)象。打包原理打包原理把所有依賴(lài)打包成一個(gè)文件,通過(guò)代碼分割成單元片段并按需加載。 面試問(wèn)到的問(wèn)題:1、繼承的幾種方法; Call,apply,原形繼承; 2、面向?qū)ο蟮膸追N方法; 五種方式: 1)對(duì)象字面量:var obj={}; 2)創(chuàng)建實(shí)例對(duì)象:va...

    xiaodao 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<