国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Javascript中的深復(fù)制

104828720 / 1204人閱讀

摘要:對(duì)一個(gè)對(duì)象或者數(shù)組這種引用類型的值進(jìn)行復(fù)制可以分為淺復(fù)制和深復(fù)制,比如這樣的一個(gè)對(duì)象很明顯這個(gè)對(duì)象是存在兩層的,不是基本類型值,而是另一個(gè)對(duì)象。上面講的就是淺復(fù)制,在實(shí)際應(yīng)用中存在很嚴(yán)重的問題。基于的做法是這樣的淺復(fù)制深復(fù)制

對(duì)一個(gè)對(duì)象或者數(shù)組這種引用類型的值進(jìn)行復(fù)制可以分為淺復(fù)制和深復(fù)制,比如這樣的一個(gè)對(duì)象

</>復(fù)制代碼

  1. let obj={
  2. a:1,
  3. b:{
  4. a:1,
  5. b:2
  6. },
  7. c:3
  8. }

很明顯這個(gè)對(duì)象是存在兩層的,obj[b]不是基本類型值,而是另一個(gè)對(duì)象。如果使用淺復(fù)制去拷貝這個(gè)對(duì)象的話,那么拷貝出來新的對(duì)象的b屬性的值是原來對(duì)象b屬性的引用地址,也就是說,如果改變?cè)磳?duì)象的b屬性,新的對(duì)象也會(huì)受到影響,因?yàn)槲覀冎皇褂脺\復(fù)制拷貝了一層。

上面講的就是淺復(fù)制,在實(shí)際應(yīng)用中存在很嚴(yán)重的問題。所以我們一般復(fù)制對(duì)象都是用深復(fù)制,深復(fù)制不是簡(jiǎn)單的復(fù)制一層,而是遍歷整個(gè)對(duì)象,一直到獲取到的值不是引用類型,而是基本類型的時(shí)候才進(jìn)行復(fù)制,這樣就使得新的對(duì)象跟原來的對(duì)象完全是兩個(gè)不同的對(duì)象了。

下面是我寫的一個(gè)簡(jiǎn)單的深復(fù)制函數(shù)

</>復(fù)制代碼

  1. let obj={
  2. a:1,
  3. b:{
  4. a:1,
  5. b:2
  6. },
  7. c:3
  8. }
  9. function deepClone(object){
  10. let obj=new Object();
  11. if(object instanceof Object){
  12. // 說明是對(duì)象
  13. for(let attr in object){
  14. if(object.hasOwnProperty(attr)){
  15. // 過濾基本類型值
  16. if(typeof object[attr]!="object"||object[attr]==null){
  17. obj[attr]=object[attr];
  18. }else{
  19. obj[attr]=deepClone(object[attr]);
  20. }
  21. }
  22. }
  23. }
  24. return obj;
  25. }
  26. let obj2=deepClone(obj);
  27. obj.b=1;
  28. console.log(obj,obj2);

注意,這個(gè)函數(shù)是存在問題的,因?yàn)檫@個(gè)函數(shù)只能處理純對(duì)象類型,也就是說屬性中包含數(shù)組的對(duì)象該方法是無法處理的。

下面這里有一個(gè)方法是stackoverflow上的答案,兼容了數(shù)組與對(duì)象的

</>復(fù)制代碼

  1. function clone(obj) {
  2. var copy;
  3. // Handle the 3 simple types, and null or undefined
  4. if (null == obj || "object" != typeof obj) return obj;
  5. // Handle Date
  6. if (obj instanceof Date) {
  7. copy = new Date();
  8. copy.setTime(obj.getTime());
  9. return copy;
  10. }
  11. // Handle Array
  12. if (obj instanceof Array) {
  13. copy = [];
  14. for (var i = 0, len = obj.length; i < len; i++) {
  15. copy[i] = clone(obj[i]);
  16. }
  17. return copy;
  18. }
  19. // Handle Object
  20. if (obj instanceof Object) {
  21. copy = {};
  22. for (var attr in obj) {
  23. if (obj.hasOwnProperty(attr)) copy[attr] = clone(obj[attr]);
  24. }
  25. return copy;
  26. }
  27. throw new Error("Unable to copy obj! Its type isn"t supported.");
  28. }

還有一種比較抖機(jī)靈的做法就是

</>復(fù)制代碼

  1. var cloneOfA = JSON.parse(JSON.stringify(a));

這種做法也是可以實(shí)現(xiàn)深復(fù)制,但是由于JSON.stringify()方法在遇到undefined值時(shí)會(huì)省略對(duì)應(yīng)的屬性,所以這個(gè)方法不太推薦使用,存在問題。

基于jQ的做法是這樣的

</>復(fù)制代碼

  1. var copiedObject = jQuery.extend({}, originalObject) // shallow copy淺復(fù)制
  2. var copiedObject = jQuery.extend(true, {}, originalObject) // deep copy深復(fù)制

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/111808.html

相關(guān)文章

  • 深入剖析 JavaScript 的深復(fù)制

    摘要:的不能算作深復(fù)制,但它至少比直接賦值來得深一些,它創(chuàng)建了一個(gè)新的對(duì)象。它們的主要用途是對(duì)存在環(huán)的對(duì)象進(jìn)行深復(fù)制。比如源對(duì)象中的子對(duì)象在深復(fù)制以后,對(duì)應(yīng)于。希望這篇文章對(duì)你們有幫助深復(fù)制方法所謂擁抱未來的深復(fù)制實(shí)現(xiàn)參考資料 本文最初發(fā)布于我的個(gè)人博客:咀嚼之味 一年前我曾寫過一篇 Javascript 中的一種深復(fù)制實(shí)現(xiàn),當(dāng)時(shí)寫這篇文章的時(shí)候還比較稚嫩,有很多地方?jīng)]有考慮仔細(xì)。...

    gclove 評(píng)論0 收藏0
  • Javascript的深復(fù)制

    摘要:對(duì)一個(gè)對(duì)象或者數(shù)組這種引用類型的值進(jìn)行復(fù)制可以分為淺復(fù)制和深復(fù)制,比如這樣的一個(gè)對(duì)象很明顯這個(gè)對(duì)象是存在兩層的,不是基本類型值,而是另一個(gè)對(duì)象。上面講的就是淺復(fù)制,在實(shí)際應(yīng)用中存在很嚴(yán)重的問題。基于的做法是這樣的淺復(fù)制深復(fù)制 對(duì)一個(gè)對(duì)象或者數(shù)組這種引用類型的值進(jìn)行復(fù)制可以分為淺復(fù)制和深復(fù)制,比如這樣的一個(gè)對(duì)象 let obj={ a:1, b:{ a:1...

    Lin_YT 評(píng)論0 收藏0
  • Javascript的深復(fù)制

    摘要:對(duì)一個(gè)對(duì)象或者數(shù)組這種引用類型的值進(jìn)行復(fù)制可以分為淺復(fù)制和深復(fù)制,比如這樣的一個(gè)對(duì)象很明顯這個(gè)對(duì)象是存在兩層的,不是基本類型值,而是另一個(gè)對(duì)象。上面講的就是淺復(fù)制,在實(shí)際應(yīng)用中存在很嚴(yán)重的問題。基于的做法是這樣的淺復(fù)制深復(fù)制 對(duì)一個(gè)對(duì)象或者數(shù)組這種引用類型的值進(jìn)行復(fù)制可以分為淺復(fù)制和深復(fù)制,比如這樣的一個(gè)對(duì)象 let obj={ a:1, b:{ a:1...

    AbnerMing 評(píng)論0 收藏0
  • 在js的深復(fù)制實(shí)現(xiàn)方法

    摘要:針對(duì)本話題,我在年月發(fā)布了新的文章深入剖析的深復(fù)制要實(shí)現(xiàn)深復(fù)制有很多辦法,比如最簡(jiǎn)單的辦法有上面這種方法好處是非常簡(jiǎn)單易用,但是壞處也顯而易見,這會(huì)拋棄對(duì)象的,也就是深復(fù)制之后,無論這個(gè)對(duì)象原本的構(gòu)造函數(shù)是什么,在深復(fù)制之后都會(huì)變成。 針對(duì)本話題,我在2015年5月發(fā)布了新的文章:深入剖析 JavaScript 的深復(fù)制 要實(shí)現(xiàn)深復(fù)制有很多辦法,比如最簡(jiǎn)單的辦法有: var...

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

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

0條評(píng)論

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