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

基于對象合并功能的實(shí)現(xiàn)示例

 更新時間:2017年10月10日 08:24:21   作者:Shapeying  
下面小編就為大家?guī)硪黄趯ο蠛喜⒐δ艿膶?shí)現(xiàn)示例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

前言

jQuery 中的 $.extend() 是經(jīng)常使用到工具函數(shù),多用于合并參數(shù)(對象),具體用法在這里不過多贅述,可通過傳參控制合并過程中是否使用深度拷貝;而ES2015中新增的 Object.assign()方法,也可以實(shí)現(xiàn)對象的合并,不過合并過程中使用的是淺拷貝;本文參考了jQuery的extend方法的源碼,將自己實(shí)現(xiàn)對象合并,即將多個對象的屬性復(fù)制到目標(biāo)對象上,若有相同的屬性,后面的對象覆蓋前面的。

淺拷貝的方式實(shí)現(xiàn)對象合并

之前的一篇博文 有專門介紹對象和數(shù)組的深淺拷貝,不了解的童鞋請移步。先看實(shí)現(xiàn)再解釋

function extend() { //extend 淺拷貝實(shí)現(xiàn)
  var name,options,copy,
   length = arguments.length,
   i = 1,
   target = arguments[0] || {}; //取目標(biāo)對象
  
 if(['object','function'].indexOf(typeof target) < 0){
  target = {};
  }
 

  for(;i<length;i++){

  options = arguments[i]

  if(options != null){ //排除空參數(shù)的情況 extend({},,)

   for(name in options){ //遍歷對象 賦值

   copy = options[name];

   if (copy !== undefined) {
    target[name] = copy;
   }
   }
  }
  }

  return target 
 }

 //測試數(shù)據(jù) 
 var test1 = {
  a : 1,
  b : {
  c : 2,
  d : 3
  },
  e : [1,'a']
 },
 test2 = {
  b : {
  c : 4,
  d : 5,
  f : 6
  },
  e : [1,'a'],
  g : 7
 }

 var test = extend({},test1,test2);
 console.log(test.b.d); //5

 test2.b.d = 'x'; //修改test2
 console.log(test.b.d); // 'x' test隨之修改

思路如下:

1、默認(rèn)取第一個參數(shù)為目標(biāo)對象,若第一個參數(shù)非對象數(shù)據(jù)類型,則賦值為空對象

2、遍歷剩下的參數(shù)(源對象),將源對象的屬性復(fù)制到目標(biāo)對象上 。

3、返回目標(biāo)對象為合并的結(jié)果

在第二步中沒有對源對象的屬性值進(jìn)行判斷,所有的全部使用 ‘=' 賦值,所以當(dāng)源對象的屬性值為對象屬性時,復(fù)制的只是引用值,即為淺拷貝的方式,在測試結(jié)果中可以看出 test 和 test2 的 b 屬性的屬性值,使用的是同一個對象,會互相影響。知道了這些之后,如何實(shí)現(xiàn)合并時的深拷貝也應(yīng)該有思路了。

深度拷貝的方式實(shí)現(xiàn)對象合并

需要在復(fù)制源對象屬性值時,判斷值的類型,如果是對象數(shù)據(jù)類型,則遞歸調(diào)用extend函數(shù)。則可以實(shí)習(xí)深拷貝方式的對象合并,實(shí)現(xiàn)如下:

function extend() { //extend 深拷貝實(shí)現(xiàn)
  var name,options,src,copy,
   deep = false, //是否深拷貝 默認(rèn)為false
   length = arguments.length,
   i = 1,
   target = arguments[0] || {};

  //如果第一個參數(shù)為boolean類型,賦值給deep
  if(typeof target == 'boolean'){
  deep = arguments[0];
  target = arguments[i] || {}; //目標(biāo)對象順延
  i++;
  }

  //如果target不是對象數(shù)據(jù)類型的話 target賦值為 {}
  if(['object','function'].indexOf(typeof target) < 0){
  target = {};
  }

  for(;i<length;i++){

  options = arguments[i];

  if(options != null){

   for(name in options){

   copy = options[name];
   src = target[name];

   if(target === copy){ //避免重復(fù)循環(huán)
    continue;
   }

   if(deep && copy && (typeof copy == 'object')){ // 類型判斷

    src = Object.prototype.toString.call(copy) == '[object Array]' ? [] : {}; //區(qū)分?jǐn)?shù)組和‘對象'
    target[name] = extend(deep,src,copy);
   }else {

    if (copy !== undefined) {

    target[name] = copy;
    }
   }
   }
  }
  }

  return target
 }

1、參數(shù)判斷,若第一個參數(shù)為布爾類型,則取為控制是否深度拷貝的參數(shù)deep , deep 默認(rèn)為false;同時 目標(biāo)元素會是第二個參數(shù)

2、復(fù)制屬性值時,要判斷deep參數(shù)和 屬性值的類型 ; 若 deep為true 且 屬性值為對象類型 則遞歸調(diào)用 extend函數(shù) , 否則直接賦值

3、需要區(qū)分 數(shù)組 和 ‘對象' ,來給 目標(biāo)對象的屬性賦值不同的初始值。如果都是 {} 的話,數(shù)組類型的屬性值復(fù)制到目標(biāo)元素上會變?yōu)?{'0':xx , '1' : xx ...}

結(jié)語

一直都是在直接使用 $.extend(),好用但是不是很清楚其中的實(shí)現(xiàn),自己擼一擼,也許實(shí)現(xiàn)上還有不嚴(yán)謹(jǐn)?shù)牡胤?,但是覺得收獲還是不錯的。

以上這篇基于對象合并功能的實(shí)現(xiàn)示例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • js中如何對json數(shù)組進(jìn)行排序

    js中如何對json數(shù)組進(jìn)行排序

    這篇文章主要介紹了js中如何對json數(shù)組進(jìn)行排序的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • js原生代碼實(shí)現(xiàn)輪播圖的實(shí)例講解

    js原生代碼實(shí)現(xiàn)輪播圖的實(shí)例講解

    下面小編就為大家?guī)硪黄猨s原生代碼實(shí)現(xiàn)輪播圖的實(shí)例講解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • jsp網(wǎng)頁搜索結(jié)果中實(shí)現(xiàn)選中一行使其高亮

    jsp網(wǎng)頁搜索結(jié)果中實(shí)現(xiàn)選中一行使其高亮

    在做搜索結(jié)果時為了好看需要將選中的行變的高亮些,下面有個不錯的示例,需要的朋友可以參考下
    2014-02-02
  • Bootstrap table使用方法總結(jié)

    Bootstrap table使用方法總結(jié)

    這篇文章主要總結(jié)介紹了Bootstrap table的使用方法,服務(wù)器分頁、客戶端分頁的轉(zhuǎn)換,table刷新,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • javascript實(shí)現(xiàn)密碼強(qiáng)度顯示

    javascript實(shí)現(xiàn)密碼強(qiáng)度顯示

    這篇文章主要介紹了使用javascript實(shí)現(xiàn)密碼強(qiáng)度顯示,十分實(shí)用的功能,從個人項目中移植出來的,分享給大家,希望大家能夠喜歡。
    2015-03-03
  • setTimeout()與setInterval()方法區(qū)別介紹

    setTimeout()與setInterval()方法區(qū)別介紹

    計時器setTimeout()和setInterval()兩個都是js的計時功能的函數(shù)兩個有些區(qū)別,下面為大家簡單介紹下,希望對大家有所幫助
    2013-12-12
  • JavaScript中變量提升和函數(shù)提升的詳解

    JavaScript中變量提升和函數(shù)提升的詳解

    這篇文章主要介紹了JavaScript中變量提升和函數(shù)提升的詳解,文章通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 如何在js中計算兩個時間段重疊的時長問題詳解

    如何在js中計算兩個時間段重疊的時長問題詳解

    這篇文章主要給大家介紹了關(guān)于如何在js中計算兩個時間段重疊的時長問題的相關(guān)資料,判斷兩個時間段是否重疊可以通過比較兩個時間段的開始時間和結(jié)束時間來實(shí)現(xiàn),文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2024-04-04
  • location.hash保存頁面狀態(tài)的技巧

    location.hash保存頁面狀態(tài)的技巧

    hash 屬性是一個可讀可寫的字符串,該字符串是 URL 的錨部分(從 # 號開始的部分)。接下來通過本文給大家介紹location.hash保存頁面狀態(tài)的相關(guān)內(nèi)容,感興趣的朋友一起學(xué)習(xí)吧
    2016-04-04
  • Javascript非構(gòu)造函數(shù)的繼承

    Javascript非構(gòu)造函數(shù)的繼承

    本文給大家介紹的是不使用構(gòu)造函數(shù)實(shí)現(xiàn)"繼承",非常的簡單,小伙伴們仔細(xì)了解下就可以非常熟悉了。
    2015-04-04

最新評論

临安市| 从江县| 阿坝| 久治县| 婺源县| 甘泉县| 油尖旺区| 汕尾市| 兴文县| 天门市| 晋江市| 清镇市| 临颍县| 龙游县| 泾源县| 桂阳县| 调兵山市| 渑池县| 建昌县| 乌鲁木齐县| 夏邑县| 苏州市| 博客| 大邑县| 龙海市| 灵台县| 平邑县| 镇原县| 泰州市| 昆明市| 太仆寺旗| 盐池县| 阿巴嘎旗| 北流市| 玉门市| 苗栗县| 翁牛特旗| 新邵县| 荣昌县| 荔浦县| 康定县|