JavaScript小知识点(一):深浅拷贝

浅拷贝

一般我们需要拷贝复制的就是对象和数组两种数据类型。

对于数组可以利用一些原生的方法来实现浅拷贝。

var old_arr = ['old']
var new_arr1 = old_arr.slice()
var new_arr2 = old_arr.concat() 

而对于对象可以使用for in 循环

var old_obj = {'a': 'old'}
var new_obj = {}
for (key in old_obj) {
  if(old_obj.hasOwnProperty(key)) {
    new_obj[key] = old_obj[key]
  }
}

浅拷贝的好处在于性能较好,简单粗暴。但只能在数组或对象的元素是基本类型时使用,不然拷贝的时候只是拷贝了其引用,对新数组进行修改时会影响到旧数组。

深拷贝

有一个最简单粗暴的方法,而且适用数组和对象:

var old_arr = ['old', ['old1', 'old2']]
var new_arr = JSON.parse( JSON.stringify(old) )
new_arr[1][0] = 'new'
console.log(old)
console.log(new_arr)

打印结果表明深拷贝成功,new_arr数组的引用类型元素变化并不会影响到old_arr数组。

但这种方法不能拷贝函数类型的值,因此我们需要使用递归的方法来复制:

var deepCopy = function(obj) {
    if (typeof obj !== 'object') return;
    var new_obj = obj instanceof Array ? [] : {}
    for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
            new_obj[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key]
        }
    }
    return new_obj
}
posted @ 2017-11-13 11:48  Q-Zhan  阅读(118)  评论(0编辑  收藏  举报