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

JavaScript對(duì)象的淺拷貝與深拷貝實(shí)例分析

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

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

1、淺拷貝

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

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代碼運(yùn)行工具http://tools.jb51.net/code/HtmlJsRun,測(cè)試運(yùn)行結(jié)果:

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

2、深拷貝

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

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

解決方法:使用深拷貝。

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代碼運(yùn)行工具http://tools.jb51.net/code/HtmlJsRun,測(cè)試運(yùn)行結(jié)果:

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

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

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

優(yōu)點(diǎn):

簡(jiǎn)單易用。

缺點(diǎn):

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

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

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;
}

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

解決方法:在遍歷時(shí)判斷兩個(gè)對(duì)象是否相互引用(如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()

請(qǐng)見(jiàn):http://m.fzitv.net/article/144424.htm

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

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

相關(guān)文章

最新評(píng)論

榕江县| 大悟县| 静安区| 南岸区| 巫山县| 台南县| 鄂托克旗| 六枝特区| 五峰| 屯留县| 清新县| 七台河市| 连江县| 镇坪县| 天峨县| 土默特左旗| 黔江区| 吐鲁番市| 清丰县| 玛多县| 石城县| 长武县| 淳安县| 炎陵县| 广汉市| 宜君县| 轮台县| 磐石市| 佳木斯市| 宜兰市| 济源市| 类乌齐县| 兴和县| 开鲁县| 济阳县| 仙游县| 定结县| 广东省| 凤阳县| 金塔县| 四会市|