亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

javascript深拷貝和淺拷貝詳解

2019-11-19 17:35:05
字體:
來源:轉載
供稿:網友

一、數組的深淺拷貝

在使用JavaScript對數組進行操作的時候,我們經常需要將數組進行備份,事實證明如果只是簡單的將它賦予其他變量,那么我們只要更改其中的任何一個,然后其他的也會跟著改變,這就導致了問題的發生。

這是為什么呢?

因為如果只是簡單的賦值,它只是進行了地址的引用,所以改變一個另一個也會跟著變。

var arr = ["One","Two","Three"];var arrto = arr;arrto[1] = "test";document.writeln("數組的原始值:" + arr + "<br />");//Export:數組的原始值:One,test,Threedocument.writeln("數組的新值:" + arrto + "<br />");//Export:數組的新值:One,test,Three

像上面這樣就屬于淺拷貝,那我們怎么樣才能不改變原始的呢?

方法一:js的slice函數

var arr = ["One","Two","Three"];var arrtoo = arr.slice(0);arrtoo[1] = "set Map";document.writeln("數組的原始值:" + arr + "<br />");//Export:數組的原始值:One,Two,Threedocument.writeln("數組的新值:" + arrtoo + "<br />");//Export:數組的新值:One,set Map,Three

方法二:js的concat方法

concat() 方法用于連接兩個或多個數組。

該方法不會改變現有的數組,而僅僅會返回被連接數組的一個副本。

var arr = ["One","Two","Three"];var arrtooo = arr.concat();arrtooo[1] = "set Map To";document.writeln("數組的原始值:" + arr + "<br />");//Export:數組的原始值:One,Two,Threedocument.writeln("數組的新值:" + arrtooo + "<br />");//Export:數組的新值:One,set Map To,Three

二、對象的深淺拷貝

var a={name:'yy',age:26};var b=new Object();b.name=a.name;b.age=a.age;a.name='xx';console.log(b);//Object { name="yy", age=26}console.log(a);//Object { name="xx", age=26}

或者

var deepCopy= function(source) { var result={}; for (var key in source) {  result[key] = typeof source[key]==='object'? deepCoyp(source[key]): source[key]; }  return result; }

object()方法:json格式的發明人Douglas Crockford,提出了一個object()函數,可以做到這一點。

function object(o) {    function F() {}    F.prototype = o;    return new F();  }//這個object()函數,其實只做一件事,就是把子對象的prototype屬性,指向父對象,從而使得子對象與父對象連在一起。

使用的時候,第一步先在父對象的基礎上,生成子對象:

var Doctor = object(Chinese);//然后,再加上子對象本身的屬性:Doctor.career = '醫生';//這時,子對象已經繼承了父對象的屬性了。alert(Doctor.nation); //中國

下面我們看看阮一峰的方法

比如,現在有一個對象,叫做"中國人"。

  var Chinese = {    nation:'中國'  };

還有一個對象,叫做"醫生"。

  var Doctor ={    career:'醫生'  }

請問怎樣才能讓"醫生"去繼承"中國人",也就是說,我怎樣才能生成一個"中國醫生"的對象?

三、淺拷貝

除了使用"prototype鏈"以外,還有另一種思路:把父對象的屬性,全部拷貝給子對象,也能實現繼承。

下面這個函數,就是在做拷貝:

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

使用的時候,這樣寫:

  var Doctor = extendCopy(Chinese);  Doctor.career = '醫生';  alert(Doctor.nation); // 中國

但是,這樣的拷貝有一個問題。那就是,如果父對象的屬性等于數組或另一個對象,那么實際上,子對象獲得的只是一個內存地址,而不是真正拷貝,因此存在父對象被篡改的可能。

請看,現在給Chinese添加一個"出生地"屬性,它的值是一個數組。

  Chinese.birthPlaces = ['北京','上海','香港'];

通過extendCopy()函數,Doctor繼承了Chinese。

  var Doctor = extendCopy(Chinese);

然后,我們為Doctor的"出生地"添加一個城市:

  Doctor.birthPlaces.push('廈門');

發生了什么事?Chinese的"出生地"也被改掉了!  

alert(Doctor.birthPlaces); //北京, 上海, 香港, 廈門alert(Chinese.birthPlaces); //北京, 上海, 香港, 廈門

所以,extendCopy()只是拷貝基本類型的數據,我們把這種拷貝叫做"淺拷貝"。這是早期jQuery實現繼承的方式。

四、深拷貝

所謂"深拷貝",就是能夠實現真正意義上的數組和對象的拷貝。它的實現并不難,只要遞歸調用"淺拷貝"就行了。

  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;  }

使用的時候這樣寫:

var Doctor = deepCopy(Chinese);

現在,給父對象加一個屬性,值為數組。然后,在子對象上修改這個屬性:

  Chinese.birthPlaces = ['北京','上海','香港'];  Doctor.birthPlaces.push('廈門');

這時,父對象就不會受到影響了。

  alert(Doctor.birthPlaces); //北京, 上海, 香港, 廈門  alert(Chinese.birthPlaces); //北京, 上海, 香港

目前,jQuery庫使用的就是這種繼承方法。

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持武林網!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品视频yy9099| 午夜精品三级视频福利| 亚洲精品电影久久久| 亚洲午夜未满十八勿入免费观看全集| 亚洲国产精品嫩草影院久久| 韩国三级电影久久久久久| 国产精品久久久| 2024亚洲男人天堂| 欧美日韩精品在线观看| 欧美二区在线播放| 亚洲天堂男人的天堂| 97超级碰在线看视频免费在线看| 久久69精品久久久久久国产越南| 欧美日韩国产色视频| 爽爽爽爽爽爽爽成人免费观看| 日韩精品亚洲视频| 在线观看日韩www视频免费| 国产精品欧美日韩久久| 欧美另类99xxxxx| 美女视频久久黄| 欧美午夜xxx| 日韩美女免费视频| 久久99久久亚洲国产| 亚洲性生活视频在线观看| 国产亚洲欧美另类中文| 日韩精品免费在线观看| 欧美电影免费播放| 91成人国产在线观看| 亚洲美女动态图120秒| 亚洲一区二区免费在线| 日韩经典中文字幕在线观看| 亚洲开心激情网| 欧美与欧洲交xxxx免费观看| 精品久久久av| 欧美麻豆久久久久久中文| 欧美三级欧美成人高清www| 国产日韩欧美中文| 国产丝袜一区二区三区| 中文字幕亚洲二区| 亚洲人成人99网站| 日韩精品高清在线观看| 日韩精品高清在线观看| 中文字幕日韩在线播放| 久久久久久久一区二区| 亚洲片在线资源| 亚洲加勒比久久88色综合| 亚洲欧美日韩国产中文| 久久91亚洲人成电影网站| 久久精品国产电影| 宅男66日本亚洲欧美视频| 亚洲影视中文字幕| 日本亚洲欧美三级| 亚洲欧美日韩久久久久久| 欧美日韩第一视频| 欧美天堂在线观看| 亚洲自拍欧美色图| 欧美大片网站在线观看| 国产精品88a∨| 亚州成人av在线| 亚洲a∨日韩av高清在线观看| 狠狠躁夜夜躁人人爽天天天天97| 久久久久久亚洲精品不卡| 日韩欧美国产免费播放| 91国产精品视频在线| 国产精品中文久久久久久久| 成人在线播放av| 日韩中文字幕第一页| 狠狠躁夜夜躁人人爽超碰91| 久久中文精品视频| 91久久精品美女| 日韩中文字幕精品| 国产女同一区二区| 奇米成人av国产一区二区三区| 欧美极品在线播放| www.国产一区| 自拍视频国产精品| 2019亚洲日韩新视频| 久久久久久999| 日韩精品中文在线观看| 国内偷自视频区视频综合| 欧美极品少妇xxxxⅹ裸体艺术| 大伊人狠狠躁夜夜躁av一区| 91精品视频一区| 狠狠色狠狠色综合日日小说| 色综合久久精品亚洲国产| 成人免费看吃奶视频网站| 欧美特级www| 欧美黑人xxx| 欧美性20hd另类| 麻豆成人在线看| 91精品国产综合久久男男| 亚洲www永久成人夜色| 欧美性猛交xxxx黑人猛交| 亚洲国产精品成人一区二区| 91伊人影院在线播放| 亚洲伦理中文字幕| 国产精品偷伦视频免费观看国产| 少妇久久久久久| 中文字幕日韩欧美精品在线观看| 欧美电影免费看| 欧美国产日韩一区二区三区| 亚洲成人av片| 亚洲成人av在线| 欧美高清视频一区二区| 久久成人av网站| 国产精品高潮在线| 久久91亚洲精品中文字幕| 国产一区二区三区直播精品电影| 91精品久久久久久久久青青| 欧美日韩国产精品一区二区不卡中文| 欧美日韩中国免费专区在线看| 久久精品青青大伊人av| 成人黄色在线播放| 国产精品高潮粉嫩av| 欧日韩不卡在线视频| 亚洲乱码国产乱码精品精天堂| 久久夜色精品亚洲噜噜国产mv| 日韩成人免费视频| 亚洲片在线观看| 成人h视频在线观看播放| 69av在线视频| 色噜噜久久综合伊人一本| 欧美激情视频播放| 日韩免费观看网站| 欧美在线观看一区二区三区| 美乳少妇欧美精品| 久久精品亚洲一区| 精品动漫一区二区| 亚洲综合成人婷婷小说| 精品久久久久久中文字幕| 国产精品久久久久久久久久久久久| 欧美激情久久久| 欧美极品少妇xxxxⅹ裸体艺术| www.亚洲一区| 午夜精品久久久久久久白皮肤| 九九久久精品一区| 亚洲电影av在线| 日韩成人xxxx| 欧美成人精品激情在线观看| 91免费综合在线| 午夜精品在线观看| 亚洲男人的天堂在线| 欧美超级免费视 在线| 亚洲精品久久久久久久久久久久久| 精品国产一区二区三区久久| 奇米成人av国产一区二区三区| 亚洲精品国偷自产在线99热| 亚洲影视中文字幕| 亚洲男人天堂手机在线| 亚洲免费视频一区二区| 国产精品99久久久久久www| 国产精品久久av| 国产精品视频在线播放| 国产精品96久久久久久又黄又硬| 亚洲欧美精品一区二区| 国产suv精品一区二区| 中文字幕一区二区三区电影| 国内成人精品视频| 国产精品都在这里| 色香阁99久久精品久久久| 日韩小视频在线| 精品视频久久久久久| 久久综合电影一区| 欧美日韩亚洲国产一区|