真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

使用javascript怎么實(shí)現(xiàn)深淺拷貝-創(chuàng)新互聯(lián)

使用javascript怎么實(shí)現(xiàn)深淺拷貝?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

十余年的清遠(yuǎn)網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)營(yíng)銷(xiāo)推廣的優(yōu)勢(shì)是能夠根據(jù)用戶(hù)設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整清遠(yuǎn)建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“清遠(yuǎn)網(wǎng)站設(shè)計(jì)”,“清遠(yuǎn)網(wǎng)站推廣”以來(lái),每個(gè)客戶(hù)項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

JavaScript的特點(diǎn)

1.JavaScript主要用來(lái)向HTML頁(yè)面添加交互行為。 2.JavaScript可以直接嵌入到HTML頁(yè)面,但寫(xiě)成單獨(dú)的js文件有利于結(jié)構(gòu)和行為的分離。 3.JavaScript具有跨平臺(tái)特性,在絕大多數(shù)瀏覽器的支持下,可以在多種平臺(tái)下運(yùn)行。

基本類(lèi)型復(fù)制:

var a = 1;
var b = a;//復(fù)制
console.log(b)//1
a = 2;//改變a的值
console.log(b)//1
console.log(a) //2

因?yàn)閍,b都是屬于基本類(lèi)型,基本類(lèi)型的復(fù)制是不會(huì)影響對(duì)方的,因?yàn)榛绢?lèi)型是每一次創(chuàng)建變量都會(huì)在棧內(nèi)存中開(kāi)辟一塊內(nèi)存,用來(lái)存放值,所以基本類(lèi)型進(jìn)行復(fù)制是不會(huì)對(duì)另外一個(gè)變量有影響的;

引用類(lèi)型復(fù)制:

引用類(lèi)型的復(fù)制我們分為數(shù)組的復(fù)制和對(duì)象的復(fù)制兩個(gè)方面來(lái)進(jìn)行講解:

js的淺拷貝:

var arr1 = ['red','green'];
var arr2 = arr1;//復(fù)制
console.log(arr2)//['red','green'];
arr1.push('black') ;//改變color1的值
console.log(arr2)//['red','green','black']
console.log(arr1) //["red", "green", "black"]

上面的案例是javascript數(shù)組的淺拷貝,通過(guò)上面的知識(shí)我們可以看知道數(shù)組是引用類(lèi)型數(shù)據(jù),引用類(lèi)型數(shù)據(jù)復(fù)制是會(huì)進(jìn)行相互影響的,我們看到arr1.push('black')添加了一個(gè)新的子項(xiàng),因?yàn)樯厦鎣ar arr2=arr1這行代碼是將兩個(gè)引用類(lèi)型數(shù)據(jù)的地址指針指向了同一塊堆內(nèi)存區(qū)域,所以不管是arr1還是arr2修改,任何一個(gè)一個(gè)改動(dòng)兩個(gè)數(shù)組都是會(huì)互相產(chǎn)生影響的;上面的那種直接賦值方式的復(fù)制就是我們常說(shuō)的引用類(lèi)型的淺拷貝;

關(guān)于深拷貝很多同學(xué)都誤以為js的原生方法concat、slice是屬于深拷貝,其實(shí)不是的;js的原生方法concat、slice都是僅適用于一維數(shù)組,一旦到了二維數(shù)組或者多維數(shù)組中就會(huì)出現(xiàn)問(wèn)題,就出現(xiàn)拷貝的不夠徹底導(dǎo)致還是會(huì)發(fā)生數(shù)據(jù)的相互牽引問(wèn)題;

slice:

var arr1 = ['red','green'];
var arr2 = arr1.slice(0);//復(fù)制
console.log(arr2)//['red','green'];
arr1.push('black') ;//改變color1的值
console.log(arr2)//["red", "green"]
console.log(arr1)//["red", "green", "black"]

js原生的方法slice會(huì)返回一個(gè)新的數(shù)組,上述代碼乍一看會(huì)以為是深拷貝,因?yàn)閍rr2和arr1相互復(fù)制和牽引,而當(dāng)arr1調(diào)用了push方法添加了新數(shù)組子項(xiàng)的時(shí)候,arr2沒(méi)有發(fā)生變化;是的,這是符合深拷貝的特性,但是拷貝的不夠徹底,所以還不能算是真正意義上的深拷貝,所以slice只能被稱(chēng)為淺拷貝;slice方法只適用于一維數(shù)組的拷貝,在二維數(shù)組中就會(huì)破綻百出;

下面我們?cè)賮?lái)看一下二維數(shù)組的例子:

var arr1=[1,2,3,['1','2','3']];
var arr2=arr1.slice(0);
 arr1[3][0]=0;
 console.log(arr1);//[1,2,3,['0','2','3']]
 console.log(arr2);//[1,2,3,['0','2','3']]

上述代碼是一個(gè)二維數(shù)組,當(dāng)我們?cè)赼rr1[3][0]里面進(jìn)行更改arr1的值的時(shí)候,我們發(fā)現(xiàn)arr1、arr2兩個(gè)數(shù)組的值都發(fā)生了變化;所以事實(shí)證明slice不是深拷貝;

concat:

var arr1 = ['red','green'];
var arr2 = arr1.concat();//復(fù)制
console.log(arr2)//['red','green'];
arr1.push('black') ;//改變color1的值
console.log(arr2)//["red", "green"]
console.log(arr1)//["red", "green", "black"]
var arr1=[1,2,3,['1','2','3']];
var arr2=arr1.concat();
 arr1[3][0]=0;
 console.log(arr1);//[1,2,3,['0','2','3']]
 console.log(arr2);//[1,2,3,['0','2','3']]

concat方法在一維數(shù)組中是不會(huì)影響源數(shù)組的數(shù)據(jù)的,而在二維數(shù)組中concat的表現(xiàn)和slice是一樣的;

js的深拷貝:

js數(shù)組中實(shí)現(xiàn)深拷貝的方法都多種,比如JSON.parse(JSON.stringify())和遞歸以及JQuery庫(kù)的extend方法(只是extend方法需要依賴(lài)JQuery庫(kù),所以我們盡量的使用原生的方式來(lái)實(shí)現(xiàn))都是可以實(shí)現(xiàn)數(shù)組和對(duì)象的深拷貝的;

var arr1 = ['red','green'];
var arr2 = JSON.parse(JSON.stringify(arr1));//復(fù)制
console.log(arr2)//['red','green'];
arr1.push('black') ;//改變color1的值
console.log(arr2)//["red", "green"]
console.log(arr1)//["red", "green", "black"]

上述代碼中我們可以清晰的看到JSON.parse(JSON.stringify())是真正意義上實(shí)現(xiàn)了深拷貝;

遞歸實(shí)現(xiàn)深拷貝:

function deepClone(obj){
  //判斷參數(shù)是不是一個(gè)對(duì)象
  let objClone = obj instanceof Object?[]:{};
  if(obj && typeof obj==="object"){
    for(key in obj){
      if(obj.hasOwnProperty(key)){
        //判斷ojb子元素是否為對(duì)象,如果是,遞歸復(fù)制
        if(obj[key]&&typeof obj[key] ==="object"){
          objClone[key] = deepClone(obj[key]);
        }else{
          //如果不是,簡(jiǎn)單復(fù)制
          objClone[key] = obj[key];
        }
      }
    }
  }
  return objClone;
}  

var a ={
  x:1,
  y:2
};
b=deepClone(a);
a.x=3
console.log(a);
console.log(b);

輸出效果如下:

使用javascript怎么實(shí)現(xiàn)深淺拷貝

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司的支持。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線(xiàn),公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、網(wǎng)站設(shè)計(jì)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。


本文名稱(chēng):使用javascript怎么實(shí)現(xiàn)深淺拷貝-創(chuàng)新互聯(lián)
分享鏈接:http://weahome.cn/article/dspesg.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部