国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

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

2019-11-19 13:24:59
字體:
來源:轉載
供稿:網友

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

1、淺拷貝

僅僅復制對象的引用,而不是對象本身。

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.VeVB.COm/code/HtmlJsRun,測試運行結果:

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

2、深拷貝

把復制的對象所引用的全部對象都復制一遍,能夠實現真正意義上的數組和對象的拷貝。

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

解決方法:使用深拷貝。

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.VeVB.COm/code/HtmlJsRun,測試運行結果:

3、實現深拷貝的方法

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

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

優點:

簡單易用。

缺點:

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

② 能正確處理的對象只有 Number, String, Boolean, Array,即那些能夠被JSON直接表示的數據結構,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;}

問題:當遇到兩個互相引用的對象,會出現死循環的情況。

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

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.survivalescaperooms.com/article/144424.htm

更多關于JavaScript相關內容感興趣的讀者可查看本站專題:《javascript面向對象入門教程》、《JavaScript錯誤與調試技巧總結》、《JavaScript數據結構與算法技巧總結》、《JavaScript遍歷算法與技巧總結》及《JavaScript數學運算用法總結

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 简阳市| 全州县| 卓尼县| 渝北区| 柘荣县| 静安区| 诏安县| 西和县| 邵东县| 娱乐| 勐海县| 两当县| 湟中县| 吉安县| 华蓥市| 恩平市| 河津市| 西峡县| 怀化市| 牙克石市| 蕉岭县| 华容县| 黔西| 聊城市| 霞浦县| 广宁县| 晋宁县| 通辽市| 岗巴县| 化德县| 中西区| 灵石县| 温州市| 松溪县| 南康市| 邯郸县| 中江县| 怀仁县| 兴义市| 大同县| 安乡县|