91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript中怎么實現對象的淺拷貝與深拷貝

發布時間:2021-06-11 17:46:53 來源:億速云 閱讀:155 作者:Leah 欄目:web開發

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

JavaScript中怎么實現對象的淺拷貝與深拷貝

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

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

測試運行結果:

JavaScript中怎么實現對象的淺拷貝與深拷貝

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()

看完上述內容,你們掌握JavaScript中怎么實現對象的淺拷貝與深拷貝的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

昭觉县| 汝阳县| 平山县| 常山县| 仪征市| 新丰县| 鸡泽县| 九寨沟县| 金湖县| 台南市| 威远县| 综艺| 新安县| 凤翔县| 扎兰屯市| 德格县| 西丰县| 南康市| 澄迈县| 时尚| 仙居县| 平度市| 福安市| 诏安县| 鲁山县| 溧水县| 康平县| 新民市| 西吉县| 安宁市| 孟村| 商南县| 弋阳县| 锡林郭勒盟| 牡丹江市| 长葛市| 蛟河市| 宁乡县| 宁河县| 紫金县| 新和县|