日韩精品欧美激情国产一区_中文无码精品一区二区三区在线_岛国毛片AV在线无码不卡_亞洲歐美日韓精品在線_使劲操好爽好粗视频在线播放_日韩一区欧美二区_八戒八戒网影院在线观看神马_亚洲怡红院在线色网_av无码不卡亚洲电影_国产麻豆媒体MDX

javascript中賦值、淺拷貝、深拷貝的區(qū)別及實(shí)例詳解

時(shí)間:2023-06-20 15:39:11 類型:JS/JQUERY
字號(hào):    

一. 賦值: 

            當(dāng)把一個(gè)對(duì)象a賦值給另外一個(gè)對(duì)象b時(shí),賦的值是對(duì)象a在棧中的地址,而不是堆中的數(shù)據(jù)。

let person ={
                name:'小米',
                age:16,
                score:{
                    english:60,
                    math:100,
                },
            }
         let person1 = person
             person1.name='大米'
             person1.score.english = 99
            console.log('person',person)
            console.log('person1',person1)

1.png

由此可知:對(duì)象person1和對(duì)象person指向同一地址,無(wú)論哪個(gè)對(duì)象發(fā)生改變,另外一個(gè)對(duì)象都會(huì)聯(lián)動(dòng)變化.


淺拷貝:

            淺拷貝它會(huì)創(chuàng)建一個(gè)新對(duì)象,不會(huì)指向同一個(gè)地址,只會(huì)賦值制對(duì)象的非對(duì)象屬性
(如果屬性是基本類型,拷貝的就是基本類型的值;如果屬性是內(nèi)存地址(引用類型),拷貝的就是內(nèi)存地址)

 let person ={
                name:'小米',
                age:16,
                score:{
                    english:60,
                    math:100,
                },
            }
        let  p2 = {}
             Object.assign(p2,person)
             p2.name = "小小小米"
             p2.score.math = 88
             console.log('person',person);
             console.log('p2',p2)

2.png

由此可知:


p2 對(duì)象改變 name的值和 score 對(duì)象,person 對(duì)象只有score對(duì)象的值發(fā)生改變,name未受影響。

因?yàn)?,name是基本類型,p2改變自身值,person 不會(huì)改變;而score是一個(gè)對(duì)象,為引用類型,p2拷貝的是該對(duì)象的地址,與person指向同一個(gè)地址,所以p2改變score對(duì)象的值時(shí),person也發(fā)生變化。


深拷貝:

          深拷貝會(huì)另外拷貝一份一個(gè)一模一樣的對(duì)象,但是不同的是會(huì)從堆內(nèi)存中開(kāi)辟一個(gè)新的區(qū)域存放新對(duì)象,新對(duì)象跟原對(duì)象不再共享內(nèi)存,修改賦值后的對(duì)象不會(huì)改到原對(duì)象。

         遞歸方法實(shí)現(xiàn)深度克隆

/**
 * 深拷貝
 * @param {Object} obj 要拷貝對(duì)象
 */function deepClone(obj = {}) {
    if (typeof obj !== 'object' || obj == null) {
        // 不是對(duì)象,或者是null
        return obj    }
    //初始化返回結(jié)果
    let result    if (obj instanceof Array) {
        result =[]
    }else{
        result = {}
    }
    for (const key in obj) {
        //保證key不是原型的屬性
        if (obj.hasOwnProperty(key)) { 
            //遞歸調(diào)用!!
            result[key] = deepClone(obj[key])
        }
    }
    //返回結(jié)果
    return result}


<