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

資訊專欄INFORMATION COLUMN

20170606-淺拷貝與深拷貝

Kerr1Gan / 2798人閱讀

摘要:什么是深拷貝,什么是淺拷貝中的淺拷貝與深拷貝是針對復雜數(shù)據(jù)類型引用類型的復制問題。

什么是深拷貝,什么是淺拷貝

JS中的淺拷貝與深拷貝是針對復雜數(shù)據(jù)類型(引用類型)的復制問題。

淺拷貝:淺拷貝是拷貝引用(拷貝地址),拷貝后兩個變量指向的是同一塊內(nèi)存空間

深拷貝:會在內(nèi)存中開辟一塊新的內(nèi)存空間,它不僅將原對象的各個屬性逐個復制過去,而且將原對象各個屬性所包含的內(nèi)容也依次采用深復制的方法遞歸復制到新的內(nèi)存空間中,并把新的內(nèi)存空間的地址復制給第二個變量,這兩個變量指向的是不同的對象,兩個變量的任何操作都不會影響到對方

實現(xiàn)深拷貝的常用方法 1.JSON.parse(JSON.stringify(object)) 2. 遞歸實現(xiàn)深拷貝
function deepCopy(obj){
    if(typeof obj !== "object"){
        return obj
    }
    var temp = new Object()
    for(var i in obj){
        if(typeof obj[i] === "object"){
            temp[i] = arguments.callee(obj[i])
        }else {
            temp[i] = obj[i]
        }
    }
    return temp
}

這個方法能正確處理的對象只有 Number, String, Boolean, Array, 扁平對象,即那些能夠被 json 直接表示的數(shù)據(jù)結(jié)構(gòu)。

3. 通過jQuery的extend方法
var CopyObject = $.extend(true, {}, object)

源碼分析

jQuery.extend = jQuery.fn.extend = function() {
    var src, copyIsArray, copy, name, options, clone,
        target = arguments[0] || {},
        i = 1,
        length = arguments.length,
        deep = false;

    // 如果第一個參數(shù)是布爾類型的,說明指定了是否要進行深拷貝,則第二個參數(shù)指的是目標對象
    if ( typeof target === "boolean" ) {
        deep = target;
        target = arguments[ i ] || {};
        i++;
    }

    // Handle case when target is a string or something (possible in deep copy)
    if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
        target = {};
    }

    // extend jQuery itself if only one argument is passed
    if ( i === length ) {
        target = this;
        i--;
    }

    for ( ; i < length; i++ ) {
        // options為源對象
        if ( (options = arguments[ i ]) != null ) {
            
            for ( name in options ) {
                src = target[ name ];
                copy = options[ name ];

                // Prevent never-ending loop
                if ( target === copy ) {
                    continue;
                }

                // 處理純對象和數(shù)組
                if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
                  
                    if ( copyIsArray ) {
                        // 被拷貝的對象是數(shù)組時
                        copyIsArray = false;
                        clone = src && jQuery.isArray(src) ? src : [];

                    } else {
                        // 被拷貝對象是對象
                        clone = src && jQuery.isPlainObject(src) ? src : {};
                    }

                    // 遞歸調(diào)用extend方法,實現(xiàn)該屬性的深拷貝
                    target[ name ] = jQuery.extend( deep, clone, copy );

                
                } else if ( copy !== undefined ) {
                    // 如果屬性是簡單數(shù)據(jù)類型,直接復制
                    target[ name ] = copy;
                }
            }
        }
    }

    // Return the modified object
    return target;
};

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

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

相關(guān)文章

  • 拷貝與深拷貝的區(qū)別

    摘要:淺拷貝與深拷貝一數(shù)據(jù)類型數(shù)據(jù)分為基本數(shù)據(jù)類型,和對象數(shù)據(jù)類型。淺拷貝是按位拷貝對象,它會創(chuàng)建一個新對象,這個對象有著原始對象屬性值的一份精確拷貝。對于字符串數(shù)字及布爾值來說不是或者對象,會拷貝這些值到新的數(shù)組里。 淺拷貝與深拷貝 一、數(shù)據(jù)類型數(shù)據(jù)分為基本數(shù)據(jù)類型(String, Number, Boolean, Null, Undefined,Symbol)和對象數(shù)據(jù)類型。 基本數(shù)據(jù)類...

    jsyzchen 評論0 收藏0
  • JavaScript中的拷貝與深拷貝

    摘要:所以,深拷貝是對對象以及對象的所有子對象進行拷貝實現(xiàn)方式就是遞歸調(diào)用淺拷貝對于深拷貝的對象,改變源對象不會對得到的對象有影響。 為什么會有淺拷貝與深拷貝什么是淺拷貝與深拷貝如何實現(xiàn)淺拷貝與深拷貝好了,問題出來了,那么下面就讓我們帶著這幾個問題去探究一下吧! 如果文章中有出現(xiàn)紕漏、錯誤之處,還請看到的小伙伴多多指教,先行謝過 以下↓ 數(shù)據(jù)類型在開始了解 淺拷貝 與 深拷貝 之前,讓我們先...

    546669204 評論0 收藏0
  • JavaScript中的拷貝與深拷貝

    摘要:所以,深拷貝是對對象以及對象的所有子對象進行拷貝實現(xiàn)方式就是遞歸調(diào)用淺拷貝對于深拷貝的對象,改變源對象不會對得到的對象有影響。 上一篇 JavaScript中的繼承 前言 文章開始之前,讓我們先思考一下這幾個問題: 為什么會有淺拷貝與深拷貝 什么是淺拷貝與深拷貝 如何實現(xiàn)淺拷貝與深拷貝 好了,問題出來了,那么下面就讓我們帶著這幾個問題去探究一下吧! 如果文章中有出現(xiàn)紕漏、錯誤之處...

    AZmake 評論0 收藏0
  • 關(guān)于js的拷貝與深拷貝

    摘要:原文地址淺拷貝和深拷貝只針對像這樣的復雜對象的簡單來說,淺拷貝只拷貝一層對象的屬性,而深拷貝則遞歸拷貝了所有層級。淺拷貝通過來實現(xiàn)淺拷貝。 原文地址:http://www.silenceboy.com/201... 淺拷貝和深拷貝只針對像Object, Array這樣的復雜對象的.簡單來說,淺拷貝只拷貝一層對象的屬性,而深拷貝則遞歸拷貝了所有層級。 淺拷貝 通過 Object.ass...

    summerpxy 評論0 收藏0
  • Python拷貝與深拷貝

    摘要:淺拷貝與深拷貝上一篇文章文件夾處理下一篇文章與對比淺拷貝淺拷貝拷貝了引用,沒有拷貝內(nèi)容。實例的的結(jié)果的的深拷貝深拷貝對于一個對象所有層次的拷貝遞歸。 Python淺拷貝與深拷貝 上一篇文章:Python文件夾處理下一篇文章:Python==與is對比 1、淺拷貝 淺拷貝:拷貝了引用,沒有拷貝內(nèi)容。 實例: a=[1,2,3] b=a print(a的id:,id(a)) print...

    Yu_Huang 評論0 收藏0

發(fā)表評論

0條評論

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