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
}