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

javascript對(duì)淺拷貝和深拷貝的詳解

 更新時(shí)間:2016年10月14日 12:15:55   作者:易成波  
這篇文章主要為大家詳細(xì)介紹了JavaScript對(duì)象的淺拷貝和深拷貝代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下.

下面小編就為大家?guī)硪黄獪\談JavaScript中面向?qū)ο蟮牡纳羁截惡蜏\拷貝。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。

1.淺拷貝:復(fù)制一份引用,所有引用對(duì)象都指向一份數(shù)據(jù),并且都可以修改這份數(shù)據(jù)。

2.深拷貝(復(fù)雜):復(fù)制變量值,對(duì)于非基本類型的變量,則遞歸至基本類型變量后,再復(fù)制。

這里畫一個(gè)簡單的圖來加深理解:

一、數(shù)組的深淺拷貝

在使用JavaScript對(duì)數(shù)組進(jìn)行操作的時(shí)候,我們經(jīng)常需要將數(shù)組進(jìn)行備份,事實(shí)證明如果只是簡單的將它賦予其他變量,那么我們只要更改其中的任何一個(gè),然后其他的也會(huì)跟著改變,這就導(dǎo)致了問題的發(fā)生。

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

像上面的這種直接賦值的方式就是淺拷貝,很多時(shí)候,這樣并不是我們想要得到的結(jié)果,其實(shí)我們想要的是arr的值不變,不是嗎?

方法一:js的slice函數(shù)

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

方法二:js的concat方法

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

二、對(duì)象的深淺拷貝

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}

就是把對(duì)象的屬性遍歷一遍,賦給一個(gè)新的對(duì)象。

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

舉一個(gè)jQuery中的例子:

jQuery.extend = jQuery.fn.extend = function() {//1.將extend方法擴(kuò)展到JQ(函數(shù))下邊:擴(kuò)展靜態(tài)方法
 //2. jQuery.fn.extend 把extend擴(kuò)展到j(luò)q.fn下 且jQuery.fn = jQuery.prototype 擴(kuò)展實(shí)例方法
 // 1.2.功能相似
 var options, name, src, copy, copyIsArray, clone, //定義一些變量
 target = arguments[0] || {}, 
 //目標(biāo)元素是【0】第一個(gè)元素$.extend( a , { name : 'hello' } , { age : 30 } );
 i = 1, //第一個(gè)元素的位置
 length = arguments.length,//第一個(gè)個(gè)對(duì)象的元素
 deep = false; //是否是深拷貝 默認(rèn) false不是

 // Handle a deep copy situation 看是不是深拷貝情況
 if ( typeof target === "boolean" ) { //是布爾值 
 deep = target;
 target = arguments[1] || {}; //目標(biāo)元素是第二個(gè)$.extend( true , a , b )
 // skip the boolean and the target
 i = 2;
 }

 // Handle case when target is a string or something (possible in deep copy) 看參數(shù)正確不
 if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
 // 當(dāng)目標(biāo)不是對(duì)象或者不是函數(shù)的時(shí)候
 target = {}; //變成一個(gè)空的jason
 }

 // extend jQuery itself if only one argument is passed看是不是插件情況
 if ( length === i ) { //只寫了一個(gè)對(duì)象 要把這個(gè)對(duì)象擴(kuò)展到j(luò)q源碼上 靜態(tài)方法 或者是實(shí)例方法
 target = this; //this 是$ 或者 $();
 --i;
 }
// 可能有多個(gè)對(duì)象情況
 for ( ; i < length; i++ ) {
 // Only deal with non-null/undefined values
 if ( (options = arguments[ i ]) != null ) {//看后邊的對(duì)象是否都有值
 // Extend the base object
 for ( name in options ) {
 src = target[ name ];
 copy = options[ name ];

 // Prevent never-ending loop
 if ( target === copy ) {//防止循環(huán)引用 
  continue;//跳出本次循環(huán)繼續(xù)執(zhí)行
  // $.extend( a , { name : a } ) );循環(huán)引用 a也是一個(gè)對(duì)象
 }

 // Recurse if we're merging plain objects or arrays深拷貝
 if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
  // 是深拷貝 且需有var b = { name : { age : 30 } }; 且b必須是對(duì)象自變量(jason) 或者是個(gè)數(shù)組
  
  //遞歸
  if ( copyIsArray ) { //數(shù)組
  copyIsArray = false;
  clone = src && jQuery.isArray(src) ? src : []; //定義一個(gè)空數(shù)組

  } else {//jason
  clone = src && jQuery.isPlainObject(src) ? src : {};//看原有的屬性有沒有且是不是jason定義一個(gè)空jason
  }
  // var a = { name : { job : 'it' } }; 看有沒有原有的屬性 有的話在原有的上邊添加
  // var b = { name : {age : 30} };
  // $.extend( true , a , b );//a繼承b
  // console.log( a ); a{ name:{ job : 'it' ,age : 30}} 如果只有一個(gè){} 則只有,age : 30
  // Never move original objects, clone(a) them
  target[ name ] = jQuery.extend( deep, clone, copy ); 
  //調(diào)用函數(shù)本身進(jìn)行進(jìn)一步的遞歸處理 

 // Don't bring in undefined values淺拷貝
 } else if ( copy !== undefined ) {
  target[ name ] = copy; //直接復(fù)制因?yàn)槔镞厸]有對(duì)象
 }
 }
 }
 }

 // Return the modified object
 return target;
};

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 微信小程序訪問node.js接口服務(wù)器搭建教程

    微信小程序訪問node.js接口服務(wù)器搭建教程

    這篇文章主要給大家分享了微信小程序訪問node.js接口服務(wù)器的搭建教程,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來跟著小編一起看看吧。
    2017-04-04
  • javascript:void(0)的含義及用法實(shí)例

    javascript:void(0)的含義及用法實(shí)例

    這篇文章介紹了javascript:void(0)的含義及用法實(shí)例,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • java中String類型變量的賦值問題介紹

    java中String類型變量的賦值問題介紹

    下面小編就為大家?guī)硪黄猨ava中String類型變量的賦值問題介紹。小編覺得挺不錯(cuò)的。現(xiàn)在分享給大家,給大家一個(gè)參考。
    2016-03-03
  • JS基礎(chǔ)隨筆(菜鳥必看篇)

    JS基礎(chǔ)隨筆(菜鳥必看篇)

    下面小編就為大家?guī)硪黄狫S基礎(chǔ)隨筆(菜鳥必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-07-07
  • javascript的防抖和節(jié)流你了解嗎

    javascript的防抖和節(jié)流你了解嗎

    這篇文章主要為大家介紹了javascript的防抖和節(jié)流,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • window.requestAnimationFrame是什么意思,怎么用

    window.requestAnimationFrame是什么意思,怎么用

    window.requestAnimationFrame 告訴瀏覽器您要執(zhí)行的動(dòng)畫并且請(qǐng)求瀏覽器的在下一個(gè)動(dòng)畫幀重繪窗口,方法在瀏覽器重繪之前作為一個(gè)回調(diào)函數(shù)被調(diào)用,就是告訴瀏覽器在刷新屏幕的時(shí)候,調(diào)用這個(gè)方法
    2013-01-01
  • js中直接聲明一個(gè)對(duì)象的方法

    js中直接聲明一個(gè)對(duì)象的方法

    這篇文章主要介紹了js中直接聲明一個(gè)對(duì)象的方法,需要的朋友可以參考下
    2014-08-08
  • 深入理解javascript中return的作用

    深入理解javascript中return的作用

    這篇文章主要介紹了javascript中return的作用,有需要的朋友可以參考一下
    2013-12-12
  • 網(wǎng)頁中表單按回車就自動(dòng)提交的問題的解決方案

    網(wǎng)頁中表單按回車就自動(dòng)提交的問題的解決方案

    這篇文章主要介紹了網(wǎng)頁中表單按回車就自動(dòng)提交的問題的解決方案,需要的朋友可以參考下
    2014-11-11
  • javascript中對(duì)Date類型的常用操作小結(jié)

    javascript中對(duì)Date類型的常用操作小結(jié)

    下面小編就為大家?guī)硪黄猨avascript中對(duì)Date類型的常用操作小結(jié)。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-05-05

最新評(píng)論

邹城市| 青铜峡市| 遂平县| 寻乌县| 临潭县| 卢湾区| 洪湖市| 米脂县| 兴文县| 安福县| 荆州市| 紫金县| 上虞市| 常熟市| 巴彦淖尔市| 清苑县| 收藏| 贵德县| 蕲春县| 灯塔市| 封开县| 正阳县| 怀来县| 邵武市| 淅川县| 永春县| 泰和县| 酉阳| 射阳县| 宜兰市| 甘孜县| 榆林市| 吴忠市| 济南市| 保定市| 陕西省| 华容县| 孝义市| 嘉禾县| 凌云县| 镇康县|