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

資訊專欄INFORMATION COLUMN

Javascript-深淺拷貝

layman / 3584人閱讀

摘要:深淺拷貝簡(jiǎn)介中對(duì)于和這兩個(gè)類型,把一個(gè)變量賦值給另一個(gè)變量淺拷貝只是對(duì)拷貝對(duì)象的引用,深拷貝是徹底拷貝,生成一個(gè)新的屬性相同的對(duì)象淺拷貝淺拷貝只是對(duì)拷貝對(duì)的引用,兩者相互影響淺拷貝的實(shí)現(xiàn)簡(jiǎn)單賦值實(shí)現(xiàn)例子拷貝了,改變,也會(huì)改變,改變之后者還是

深淺拷貝簡(jiǎn)介

javascript中對(duì)于Object和Array這兩個(gè)類型,把一個(gè)變量賦值給另一個(gè)變量;淺拷貝只是對(duì)拷貝對(duì)象的引用,深拷貝是徹底拷貝,生成一個(gè)新的屬性相同的對(duì)象

淺拷貝(shallow copy)

淺拷貝只是對(duì)拷貝對(duì)的引用,兩者相互影響

淺拷貝的實(shí)現(xiàn) 1.簡(jiǎn)單賦值實(shí)現(xiàn)

例子:obj2拷貝了obj1,obj2改變,obj1也會(huì)改變,改變之后2者還是相同的

    var obj1 = {a: 1}
    var obj2 = obj1
    obj2.b = 2
    console.log(obj1) // {a: 1, b: 2}
    console.log(obj2) //{a: 1, b: 2}
    console.log(obj1 == obj2) // true
Object.assign()實(shí)現(xiàn)

例子:當(dāng)?shù)谝粋€(gè)傳參是你需要拷貝的對(duì)象(PS:Object.assign()也可以實(shí)現(xiàn)深拷貝)

    var obj1 = {a: 1}
    var obj2 = Object.assign(obj1)
    obj2.b = 2
    console.log(obj1) // {a: 1, b: 2}
    console.log(obj2) // {a: 1, b: 2}
    console.log(obj1 == obj2) // true
深拷貝(deep copy)

徹底拷貝,生成一個(gè)新的屬性相同的對(duì)象

深拷貝的實(shí)現(xiàn) Object.assign()實(shí)現(xiàn)

例子:拷貝對(duì)象不是第一個(gè)傳參

    var obj1 = {a: 1}
    var obj2 = Object.assign({}, obj1)
    obj2.b = 2
    console.log(obj1) // {a: 1}
    console.log(obj2) // {a: 1, b: 2}
    console.log(obj1 == obj2) // false
Array.slice()可以實(shí)現(xiàn)數(shù)組的深拷貝(數(shù)組中不能有Object和Array,Object和Array只是淺拷貝)
    var arr1 = [1, [2]]
    var arr2 = arr1.slice()
    arr2[1].push(3)
    arr2.push(4)
    console.log(arr1) // [1, [2, 3]]
    console.log(arr2) // [1, [2, 3], 4]
    console.log(arr1 == arr2) // false
JSON.stringify()和JSON.parse()實(shí)現(xiàn)
    var obj1 = {a: 1}
    var obj2 = JSON.parse(JSON.stringify(obj1))
    console.log(obj1 == obj2) // false
    obj2.b = 2
    console.log(obj1) // {a: 1}
    console.log(obj2) // {a: 1, b: 2}
遞歸實(shí)現(xiàn)
    var deepCopy = function(obj) {
        if (typeof obj !== "object") return;
        var newObj = obj instanceof Array ? [] : {};
        for (var key in obj) {
            if (obj.hasOwnProperty(key)) {
                newObj[key] = typeof obj[key] === "object" ? deepCopy(obj[key]) : obj[key];
            }
        }
        return newObj;
    }
    var obj1 = {a: 1}
    var obj2 = deepCopy(obj1)
    console.log(obj1 == obj2) // false
    obj2.b = 2
    console.log(obj1) // {a: 1}
    console.log(obj2) // {a: 1, b: 2}
Object.create()實(shí)現(xiàn)
    var deepCopy = function(obj) {
        if (typeof obj !== "object") return;
        var newObj = obj instanceof Array ? [] : {};
        for (var key in obj) {
            if (obj.hasOwnProperty(key)) {
                newObj[key] = typeof obj[key] === "object" ? Object.create(obj[key]) : obj[key];
            }
        }
        return newObj;
    }
    var obj1 = {a: 1}
    var obj2 = deepCopy(obj1)
    console.log(obj1 == obj2) // false
    obj2.b = 2
    console.log(obj1) // {a: 1}
    console.log(obj2) // {a: 1, b: 2}
jQuery.extend()實(shí)現(xiàn)
    var obj1 = {a: 1}
    var obj2 = $.extend(true, {}, obj1)
    console.log(obj1 == obj2) // false
    obj2.b = 2
    console.log(obj1) // {a: 1}
    console.log(obj2) // {a: 1, b: 2}

jQuery.extend()源碼

    jQuery.extend = jQuery.fn.extend = function() {
        var src, copyIsArray, copy, name, options, clone,
            target = arguments[0] || {}, // 默認(rèn)取第一個(gè)參數(shù)賦值給target
            i = 1,
            length = arguments.length, // 獲取參數(shù)的個(gè)數(shù)
            deep = false; // 默認(rèn)淺拷貝

        // Handle a deep copy situation
        if ( typeof target === "boolean" ) { // 如果第一個(gè)參數(shù)類型為boolean,那么把該參數(shù)賦值給局部變量deep
            deep = target;  
            target = arguments[1] || {}; // 把第二個(gè)參數(shù)賦值給target
            // skip the boolean and the target
            i = 2;
        }

        // Handle case when target is a string or something (possible in deep copy)
        if ( typeof target !== "object" && !jQuery.isFunction(target) ) { // target不是object類型或者不是function,就賦值{}
            target = {};
        }

        // extend jQuery itself if only one argument is passed
        if ( length === i ) { // 如果只有一個(gè)參數(shù),這時(shí)候i就是1,length也就是1,那么把target設(shè)置為調(diào)用者,也就是jQuery對(duì)象本身!同時(shí)把i遞減為0
            target = this; // this就是jQuery
            --i;
        }

        for ( ; i < length; i++ ) { // 循環(huán)參數(shù)
            // Only deal with non-null/undefined values
            if ( (options = arguments[ i ]) != null ) {
                // Extend the base object
                for ( name in options ) {
                    src = target[ name ]; 
                    copy = options[ name ];

                    // Prevent never-ending loop
                    if ( target === copy ) { // 防止無(wú)休止循環(huán)
                        continue;
                    }

                    // Recurse if we"re merging plain objects or arrays
                    // deep是否深拷貝,copy是參數(shù)屬性值
                    if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
                        if ( copyIsArray ) { // 被拷貝的屬性值是數(shù)組
                            copyIsArray = false;
                            clone = src && jQuery.isArray(src) ? src : [];
                        } else { // 不是數(shù)組
                            clone = src && jQuery.isPlainObject(src) ? src : {};
                        }

                        // Never move original objects, clone them
                        target[ name ] = jQuery.extend( deep, clone, copy );  // 遞歸~

                    // Don"t bring in undefined values
                    } else if ( copy !== undefined ) {  // 淺拷貝,且屬性值不為undefined
                        target[ name ] = copy;
                    }
                }
            }
        }

        // Return the modified object
        return target;
    };
更多方法...敬請(qǐng)期待

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

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

相關(guān)文章

  • Javascript對(duì)象的深淺拷貝

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

    qieangel2013 評(píng)論0 收藏0
  • JavaScript專題之深淺拷貝

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

    RancherLabs 評(píng)論0 收藏0
  • JavaScript深淺拷貝

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

    zhunjiee 評(píng)論0 收藏0
  • javascript深淺拷貝

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

    LMou 評(píng)論0 收藏0
  • 深淺拷貝

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

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

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

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

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

0條評(píng)論

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