js對象、數字深拷貝方式(轉)

知識點一:js中的對象

談到對象的拷貝,必定要說一下對象的概念。

js中的數據類型分爲兩大類:

原始類型和對象類型。

(1)原始類型包括:數值、字符串、布爾值、nullundefined(後兩個是特殊的原始值,這裏不做詳細的說明,我的上一篇博客有談到過一些)

(2)對象類型包括:對象即是屬性的集合,當然這裏又兩個特殊的對象----函數(js中的一等對象)、數組(鍵值的有序集合)。

好了既然對象分爲這兩類,這兩種類型在複製克隆的時候是有很大區別的。
原始類型存儲的是對象的實際數據,而對象類型存儲的是對象的引用地址(對象的實際內容單獨存放,爲了減少數據開銷通常存放在內存中)。

ps:說到這裏,大家要知道,對象的原型也是引用對象,它把原型的方法和屬性放在內存當中,通過原型鏈的方式來指向這個內存地址。

知識點二:拷貝的概念

淺度拷貝:原始類型爲值傳遞,對象類型仍爲引用傳遞。

深度拷貝:所有元素或屬性均完全複製,與原對象完全脫離,也就是說所有對於新對象的修改都不會反映到原對象中。

知識點三:數組的拷貝

  • 數組深拷貝方式一:for循環
var arr = [1,2,3,4,5]
var arr2 = copyArr(arr)
function copyArr(arr) {
    let res = []
    for (let i = 0; i < arr.length; i++) {
     res.push(arr[i])
    }
    return res
}
  • 數組深拷貝方式二:通過數組的slice()方法
var arr = [1,2,3,4,5]
var arr2 = arr.slice(0)
arr[2] = 5
console.log(arr)
console.log(arr2)

原理:這個代碼實現非常簡單。原理也比較好理解,他是將原數組中抽離部分出來形成一個新數組。我們只要設置爲抽離全部,即可完成數組的深拷貝
  • 數組深拷貝方式三:使用數組的concat()方法
var arr = [1,2,3,4,5]
var arr2 = arr.concat()
arr[2] = 5
console.log(arr)
console.log(arr2)

原理:這個代碼也非常簡單,原理更加粗暴。它是用於連接多個數組組成一個新的數組的方法。那麼,我們只要連接它自己,即可完成數組的深拷貝
  • 數組深拷貝方式四:使用jQuery的$.extend()方法
var newJson = jQuery.extend(true,{}, json);

知識點四:對象的拷貝

  • 對象深拷貝方式一:for循環
var obj = {
  name: 'FungLeo',
  sex: 'man',
  old: '18'
}
var obj2 = copyObj(obj)
function copyObj(obj) {
  let res = {}
  for (var key in obj) {
    res[key] = obj[key]
  }
  return res
}

原理:就是把元對象的內容循環放進新的數組裏面
  • 對象深拷貝方式二:利用json對象
var obj = {
  name: 'FungLeo',
  sex: 'man',
  old: '18'
}
var obj2 = JSON.parse(JSON.stringify(obj))

原文鏈接:http://blog.csdn.net/fungleo/article/details/54931379

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章