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

JavaScript對象的淺拷貝與深拷貝實例分析

 更新時間:2018年07月25日 11:19:58   作者:筱葭  
這篇文章主要介紹了JavaScript對象的淺拷貝與深拷貝,結(jié)合實例形式分析了javascript淺拷貝與深拷貝的原理、實現(xiàn)方法與相關(guān)操作技巧,需要的朋友可以參考下

本文實例講述了JavaScript對象的淺拷貝和深拷貝。分享給大家供大家參考,具體如下:

1、淺拷貝

僅僅復(fù)制對象的引用,而不是對象本身。

var person = {
  name: 'Alice',
  friends: ['Bruce', 'Cindy']
}
var student = {
  id: 30
}
student = simpleClone(person, student);
student.friends.push('David');
alert(person.friends);
function simpleClone(oldObj, newObj) {
  var newObj = newObj || {};
  for (var i in oldObj)
    newObj[i] = oldObj[i];
  return newObj;
}

使用在線HTML/CSS/JavaScript代碼運行工具http://tools.jb51.net/code/HtmlJsRun,測試運行結(jié)果:

給子對象的數(shù)組類型的屬性添加一個新值,父對象的該屬性值也被篡改。

2、深拷貝

把復(fù)制的對象所引用的全部對象都復(fù)制一遍,能夠?qū)崿F(xiàn)真正意義上的數(shù)組和對象的拷貝。

淺拷貝的問題:如果父對象的屬性值為一個數(shù)組或另一個對象,那么實際上子對象獲得的只是一個內(nèi)存地址,而不是對父對象的真正拷貝,因此存在父對象被篡改的可能。

解決方法:使用深拷貝。

var person = {
  name: 'Alice',
  friends: ['Bruce', 'Cindy']
}
var student = {
  id: 30
}
student = deepClone(person, student);
student.friends.push('David');
alert(person.friends); // 'Bruce', 'Cindy'
function deepClone(oldObj, newObj) {
  var newObj = newObj || {};
  newObj = JSON.parse(JSON.stringify(oldObj));
  return newObj;
}

使用在線HTML/CSS/JavaScript代碼運行工具http://tools.jb51.net/code/HtmlJsRun,測試運行結(jié)果:

3、實現(xiàn)深拷貝的方法

1) 方法1:使用JSON.parse()方法

function deepClone(oldObj, newObj) {
  var newObj = newObj || {};
  newObj = JSON.parse(JSON.stringify(oldObj));
  return newObj;
}

優(yōu)點:

簡單易用。

缺點:

① 會拋棄對象的constructor,即,深拷貝后,不管該對象原來的構(gòu)造函數(shù)是什么,在深拷貝之后都會變成Object。

② 能正確處理的對象只有 Number, String, Boolean, Array,即那些能夠被JSON直接表示的數(shù)據(jù)結(jié)構(gòu),RegExp對象等無法通過這種方式深拷貝。

2) 方法2:遞歸拷貝

function deepClone(oldObj, newObj) {
  var newObj = newObj || {};
  for (var i in oldObj) {
    if (typeof oldObj[i] === 'object') {
      newObj[i] = (oldObj[i].constructor === Array) ? [] : {};
      arguments.callee(oldObj[i], newObj[i]);
    }
    else
      newObj[i] = oldObj[i];
  }
  return newObj;
}

問題:當(dāng)遇到兩個互相引用的對象,會出現(xiàn)死循環(huán)的情況。

解決方法:在遍歷時判斷兩個對象是否相互引用(如oldObj.property === newObj),如果是則退出循環(huán)。

function deepClone(oldObj, newObj) {
  var newObj = newObj || {};
  for (var i in oldObj) {
    var prop = oldObj[i];
    if (prop === newObj)
          continue;
    if (typeof prop === 'object') {
      newObj[i] = (prop.constructor === Array) ? [] : {};
      arguments.callee(prop, newObj[i]);
    }
    else
      newObj[i] = prop;
  }
  return newObj;
}

3) 方法3:使用Object.create()方法

function deepClone(oldObj, newObj) {
  var newObj = newObj || {};
  for (var i in oldObj) {
    var prop = oldObj[i];
    if (prop === newObj)
          continue;
    if (typeof prop === 'object')
      newObj[i] = (prop.constructor === Array) ? [] : Object.create(prop);
    else
      newObj[i] = prop;
  }
  return newObj;
}

4)方法4:使用jQuery.extend()jQuery.fn.extend()

請見:http://www.fzitv.net/article/144424.htm

更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《JavaScript錯誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運算用法總結(jié)

希望本文所述對大家JavaScript程序設(shè)計有所幫助。

相關(guān)文章

  • 純JS焦點圖特效實例(可一個頁面多用)

    純JS焦點圖特效實例(可一個頁面多用)

    下面小編就為大家?guī)硪黄僇S焦點圖特效實例(可一個頁面多用)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • JS高仿拋物線加入購物車特效實現(xiàn)代碼

    JS高仿拋物線加入購物車特效實現(xiàn)代碼

    本篇文章主要介紹了JS高仿拋物線加入購物車特效實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-02-02
  • 詳解js界面跳轉(zhuǎn)與值傳遞

    詳解js界面跳轉(zhuǎn)與值傳遞

    這篇文章主要為大家詳細(xì)介紹了js界面跳轉(zhuǎn)與值傳遞的相關(guān)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • JavaScript中合并數(shù)組的N種方法

    JavaScript中合并數(shù)組的N種方法

    這篇文章主要介紹了JavaScript中合并數(shù)組的N種方法,本文使用concat、循環(huán)插入、reduce等方法合并JavaScript數(shù)組,需要的朋友可以參考下
    2014-09-09
  • JavaScript函數(shù)聲明和函數(shù)表達(dá)式的區(qū)別

    JavaScript函數(shù)聲明和函數(shù)表達(dá)式的區(qū)別

    這篇文章主要介紹了JavaScript函數(shù)聲明和函數(shù)表達(dá)式的區(qū)別,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-06-06
  • JavaScript中的繼承之類繼承

    JavaScript中的繼承之類繼承

    在JS中繼承是一個非常復(fù)雜的話題,比其他任何面向?qū)ο笳Z言中的繼承都復(fù)雜得多。接下來通過本文給大家介紹JavaScript中的繼承之類繼承,感興趣的朋友一起看看吧
    2016-05-05
  • JavaScript不刷新實現(xiàn)瀏覽器的前進(jìn)后退功能

    JavaScript不刷新實現(xiàn)瀏覽器的前進(jìn)后退功能

    這篇文章主要介紹了JavaScript不刷新實現(xiàn)瀏覽器的前進(jìn)后退功能,本文給出了HTML5解決方案、老舊瀏覽器的寫法等方法,需要的朋友可以參考下
    2014-11-11
  • Bootstrap源碼解讀導(dǎo)航條(7)

    Bootstrap源碼解讀導(dǎo)航條(7)

    這篇文章主要源碼解讀了Bootstrap導(dǎo)航條,介紹了Bootstrap各式各樣的導(dǎo)航條,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • 微信開發(fā) 消息推送實現(xiàn)代碼

    微信開發(fā) 消息推送實現(xiàn)代碼

    這篇文章主要介紹了微信開發(fā) 消息推送實現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • 使用JavaScrip模擬實現(xiàn)仿京東搜索框功能

    使用JavaScrip模擬實現(xiàn)仿京東搜索框功能

    使用js模擬實現(xiàn)京東的搜索框,主要用了js中的onfocus(注冊焦點事件),onblur(失去焦點的事件);本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友參考下吧
    2019-10-10

最新評論

恩施市| 凤庆县| 招远市| 永定县| 平利县| 镇原县| 滕州市| 平邑县| 昌宁县| 铜梁县| 兴文县| 宁化县| 安泽县| 清徐县| 澎湖县| 阳春市| 绥阳县| 福州市| 开封县| 莲花县| 镇宁| 榕江县| 龙口市| 洪洞县| 沙坪坝区| 龙门县| 新宁县| 九江市| 台北市| 浦东新区| 东乡| 宜阳县| 元谋县| 塔河县| 奉新县| 越西县| 天镇县| 鞍山市| 莲花县| 定南县| 蒙山县|