先来了解一下这些:在js中变量类型基本分为两种:基本数据类型和引用数据类型;
基本类型:Underfied Null Boolean Number String。(保存在栈内存)
引用类型:可能包含多个值的对象。(保存在堆内存中)
根本原因在于保存在栈内存的必须是大小固定的数据,引用类型的大小不固定,只能保存在堆内存中,但是我们可以把它的地址写在占内存中以供我们访问。
深浅拷贝:
浅拷贝:1)在复制基本数据类型时,我们直接使用=完成复制
2)在引用类型的时候,我们循环遍历对象,对每个属性或值使用=完成复制
深拷贝:深复制实现的方式:对属性中所有引用类型的值,遍历到是基本类型的值为止,从这种方式上,我们很容易就可以想到利用递归来实现深复制。
function deepCopy (obj) {
var result;
//引用类型分数组和对象分别递归
if (Object.prototype.toString.call(obj) == '[object Array]') {
result = []
for (i = 0; i < obj.length; i++) {
result[i] = deepCopy(obj[i])
}
} else if (Object.prototype.toString.call(obj) == '[object Object]') {
result = {}
for (var attr in obj) {
result[attr] = deepCopy(obj[attr])
}
}
//值类型直接返回
else {
return obj
}
return result
}
对于深浅复制的区别,其实核心的关键点就是是只复制了第一属性还是完全复制了所有的属性,使用slice和concat对对象数组的拷贝,整个拷贝还是浅拷贝,拷贝之后数组各个值的指针还是指向相同的存储地址。
因此,slice和concat这两个方法,仅适用于对不包含引用对象的一维数组的深拷贝
转载于https://segmentfault.com/a/1190000008838101
网友评论