最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript數(shù)組和對象的復制

 更新時間:2017年03月21日 08:37:01   作者:tonyinsh  
本篇文章主要介紹了JavaScript數(shù)組和對象的復制的相關知識。具有很好的參考價值。下面跟著小編一起來看下吧

一、數(shù)據(jù)類型

從狹義上來說,JS把所有的數(shù)據(jù)分成兩大類型:基本類型和引用類型,其中基本類型包括Undefined、Null、Boolean、Number和String,引用類型為Object,常用的Array、Date、RegExp、Function等都屬于Object類型。

基本型數(shù)據(jù)和引用型數(shù)據(jù)的區(qū)別之一就是,在復制變量時,基本型數(shù)據(jù)復制獨立的一份新的拷貝,而引用型數(shù)據(jù)復制的是原變量的引用。下面是一個例子:

// 基本類型數(shù)據(jù)的復制
var a = 10;
var b = a; // b = 10
a = 20; // a = 20, b = 10
// 引用類型數(shù)據(jù)的復制
var m = [1, 2];
var n = m;
m[0] = 10;
console.log(n[0]); // 10

如果我想復制引用類型本身的值而非引用,顯然不能采用上面的方式。

二、數(shù)組的淺復制

淺復制是指對象(數(shù)組)被復制時,其引用字段的值不會被復制,而是復制了對應字段的引用。如:

var src = [
 'alpha',
 ['bravo', 'chalie']
];
var dest = [];
for (var i = 0; i < src.length; i++) {
 dest[i] = src[i];
}
//此時,如果改變src中的引用字段,dest中相應的字段也會被改變
src[1].push('delta');
console.log(dest[1]); // ['bravo', 'chalie', 'delta']

淺復制一般用于一維數(shù)組,即數(shù)組中不存在引用類型的情況。常用的淺復制方法有:

concat方法

 var src = ['alpha', 'bravo'],
  dest = [];
 dest = dest.concat(src);

concat方法更多地被用在數(shù)組合并中,比如:

 var a = ['alpha', 'bravo'],
  b = ['chalie', 'delta'],
  combine;
 combine = a.concat(b);

特別要指出,concat用于數(shù)組合并時,是將兩個(或多個)數(shù)組中的所有元素復制到新的對象,對于大型數(shù)組來說,開銷比較大。更好的辦法是把后一個數(shù)組的元素復制到前一個數(shù)組中:

 var src = ['alpha', 'bravo'],
  dest = ['chalie', 'delta'];
 Array.prototype.push.apply(src, dest);

slice方法

slice方法可以從已有數(shù)組中返回選定的元素,返回的是一個新數(shù)組。

 var src = ['alpha', 'bravo'],
 var dest = src.slice(0);

三、對象的淺復制

對象的淺復制可以用for-in遍歷來實現(xiàn),在es6中提供了更為方便的Object.assign()方法。

 var src = {name: 'fox', age: 20},
  dest = null;
 dest = Object.assign({}, src);

也可以使用jQuery中的$.extend,underscore中的_.extend等方法來實現(xiàn)對象的復制。

四、深度復制

淺復制的應用場景有限,更多情況下,我們希望能夠將對象復制出一個完整的副本,這就需要用到typeof或instanof操作符來對各個字段的類型進行判斷。如果某字段是基本類型的,可以直接復制。如果某字段是引用類型的,還需要對該字段的所有字段進行上述判斷,這就很容易讓我們考慮使用遞歸來實現(xiàn)這個功能。

function deep_copy(src, dest) {
 for (var p in src) {
  if (Array.isArray(src[p]) || src[p] instanceof Object) {
   dest[p] = Array.isArray(src[p]) ? [] : {};
   arguments.callee(dest[p], src[p]);
  }else {
   dest[p] = src[p];
  }
 }
}

在上述代碼中,由于數(shù)組是特殊的對象,因此可以用for-in來遍歷。

另外,還可以使用json大法:

 function deep_copy_in_json(src) {
  return JSON.parse(JSON.stringify(src));
 }

這樣做雖然比較簡便,但原對象的很多屬性在操作后會丟失,比如construtor屬性以及對象原型中的一些方法。

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

相關文章

  • 微信小程序中如何實現(xiàn)動態(tài)改變SVG顏色和尺寸

    微信小程序中如何實現(xiàn)動態(tài)改變SVG顏色和尺寸

    SVG可被非常多的工具讀取和修改SVG與JPEG和GIF圖像比起來,尺寸更小,且可壓縮性更強,下面這篇文章主要給大家介紹了關于微信小程序中如何實現(xiàn)動態(tài)改變SVG顏色和尺寸的相關資料,需要的朋友可以參考下
    2022-07-07
  • JS實現(xiàn)圖片拖拽交換效果

    JS實現(xiàn)圖片拖拽交換效果

    這篇文章主要為大家詳細介紹了JS實現(xiàn)圖片拖拽交換效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • js實現(xiàn)移動端輪播圖滑動切換

    js實現(xiàn)移動端輪播圖滑動切換

    這篇文章主要為大家詳細介紹了js實現(xiàn)移動端輪播圖滑動切換,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • JS實現(xiàn)的碰撞檢測與周期移動完整示例

    JS實現(xiàn)的碰撞檢測與周期移動完整示例

    這篇文章主要介紹了JS實現(xiàn)的碰撞檢測與周期移動,結合完整實例形式分析了javascript結合時間函數(shù)的頁面元素屬性動態(tài)操作及事件響應相關使用技巧,需要的朋友可以參考下
    2019-09-09
  • 微信小程序 wx.login解密出現(xiàn)亂碼的問題解決辦法

    微信小程序 wx.login解密出現(xiàn)亂碼的問題解決辦法

    這篇文章主要介紹了微信小程序 wx.login解密出現(xiàn)亂碼的問題解決辦法的相關資料,需要的朋友可以參考下
    2017-03-03
  • TypeScript遍歷Array的方法(for,forEach,every)

    TypeScript遍歷Array的方法(for,forEach,every)

    本文主要介紹了TypeScript遍歷Array的方法(for,forEach,every),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • javascript中String對象的slice()方法分析

    javascript中String對象的slice()方法分析

    這篇文章主要介紹了javascript中String對象的slice()方法,以實例形式分析了slice()方法的定義、參數(shù)與具體用法,具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-12-12
  • javascript實現(xiàn)修改微信分享的標題內容等

    javascript實現(xiàn)修改微信分享的標題內容等

    這篇文章主要介紹了javascript實現(xiàn)修改微信分享的標題內容等,需要的朋友可以參考下
    2014-12-12
  • Javascript函數(shù)的參數(shù)

    Javascript函數(shù)的參數(shù)

    本文給大家分享的是網(wǎng)易云課堂中金旭亮老師的課堂筆記,對于大家學習javascript非常有幫助,這里推薦給小伙伴們
    2015-07-07
  • TypeScript中的接口Interface詳解(對象類型的強大工具)

    TypeScript中的接口Interface詳解(對象類型的強大工具)

    TypeScript中的接口是一個強大而靈活的特性,它為我們提供了一種清晰、簡潔的方式來定義對象的結構和類型,通過使用接口,我們可以編寫更加健壯、可維護的代碼,這篇文章主要介紹了TypeScript中的接口(Interface):對象類型的強大工具,需要的朋友可以參考下
    2024-08-08

最新評論

谢通门县| 南和县| 通城县| 宁津县| 阜新| 泽普县| 喀什市| 赣榆县| 揭阳市| 玉山县| 调兵山市| 井研县| 汉阴县| 山西省| 八宿县| 兰考县| 滁州市| 邵东县| 永平县| 镇宁| 凉城县| 会昌县| 四平市| 江孜县| 将乐县| 贵溪市| 延庆县| 巴马| 南溪县| 讷河市| 彰化县| 长兴县| 涿鹿县| 壤塘县| 松原市| 毕节市| 威海市| 麟游县| 唐山市| 昭通市| 密山市|