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

資訊專欄INFORMATION COLUMN

小tips:JS之淺拷貝與深拷貝

Soarkey / 746人閱讀

摘要:淺拷貝深拷貝淺拷貝的問題如果父對象的屬性等于數(shù)組或另一個對象,那么實際上,子對象獲得的只是一個內(nèi)存地址,而不是真正拷貝,因此存在父對象被篡改的可能。

淺拷貝:

function extendCopy(p) {
 var c = {};
 for (var i in p) {
   c[i] = p[i];
 }
 return c;
}

深拷貝:

function deepCopy(p, c) {
  var c = c || {};
  for (var i in p) {
    if (typeof p[i] === "object") {
      c[i] = (p[i].constructor === Array) ? [] : {};
      deepCopy(p[i], c[i]);
    } else {  
            c[i] = p[i];
    }
  }

  return c;
}

淺拷貝的問題:如果父對象的屬性等于數(shù)組或另一個對象,那么實際上,子對象獲得的只是一個內(nèi)存地址,而不是真正拷貝,因此存在父對象被篡改的可能。

下面來個實例:

var obj1 = {
    name:"helloJack",
    inner:{
        sum:5
    }
};

var obj2 = extendCopy(obj1,{});

obj2.name ="sss";
obj2.inner.sum = 7;
console.log(obj1.name); //helloJack
console.log(obj1.inner.sum); //5

存在的問題,如果經(jīng)常改寫這個函數(shù)的方法extendCopy,內(nèi)部再調(diào)用這個方法名就會出錯,還得修改一下這個方法名,那么下面這樣解決:

var extendCopy = (function f(p,c){
    var c = c || {};
    for (var i in p) {
        if(typeof p[i] === "object"){
            c[i] = (p[i] instanceof Array) ? [] : {};
            f(p[i],c[i]);
        }else{
             c[i] = p[i];
        } 
    }
    return c;
});

可參考地址:
小tips:JS嚴格模式(use strict)下不能使用arguments.callee的替代方案
Javascript 面向?qū)ο缶幊蹋ㄒ唬悍庋b
Javascript面向?qū)ο缶幊蹋ǘ簶?gòu)造函數(shù)的繼承
Javascript面向?qū)ο缶幊蹋ㄈ悍菢?gòu)造函數(shù)的繼承

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

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

相關(guān)文章

  • Js之淺拷貝拷貝與對象數(shù)組的遍歷

    摘要:判斷是深拷貝對象還是數(shù)組如果要拷貝的對象的屬性依然是個復(fù)合類型,遞歸運用遞歸,當(dāng)要拷貝的對象或者數(shù)組的屬性依然是個對象或者數(shù)組時,遞歸調(diào)用。遍歷對象聊完了深拷貝和淺拷貝,接下來說一下遍歷。 在js這門語言中,數(shù)據(jù)存放在堆中,而數(shù)據(jù)的引用的存放在棧中。 淺拷貝 我們說的淺拷貝,指的是,引用地址的拷貝,棧中兩塊不同的引用地址都指向了堆中同樣一塊區(qū)域。所以,我們通過一個地址修改了堆中的數(shù)據(jù),...

    liangzai_cool 評論0 收藏0
  • 拷貝與深拷貝的區(qū)別

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

    jsyzchen 評論0 收藏0
  • 拷貝與深拷貝

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

    hzc 評論0 收藏0
  • 拷貝與深拷貝

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

    史占廣 評論0 收藏0
  • Javascript系列之淺復(fù)制與深復(fù)制

    摘要:定義淺復(fù)制如果復(fù)制引用,復(fù)制后的引用都是指向同一個對象的實例,彼此之間的操作會互相影響。淺復(fù)制數(shù)組淺復(fù)制利用數(shù)組方法和返回新數(shù)組特性,進行復(fù)制。深復(fù)制對象深復(fù)制利用對象的和方法。 定義 淺復(fù)制 如果復(fù)制引用,復(fù)制后的引用都是指向同一個對象的實例,彼此之間的操作會互相影響。 深復(fù)制 深復(fù)制不是簡單的復(fù)制引用,而是在堆中重新分配內(nèi)存,并且把源對象實例的所有屬性都進行新建復(fù)制,以保證深復(fù)制的...

    MonoLog 評論0 收藏0

發(fā)表評論

0條評論

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