浅拷贝和深拷贝 新手理解
// 深拷贝和浅拷贝
// 一、首先要清楚知道数据的数据类型
// 二、明白存储方式 基本数据存储在栈中,引用数据类型存储在堆中
// 三、基本数据不存在浅拷贝和深拷贝 但是(相当于深拷贝)
//对数组的拷贝
// 一、 数组中不存在引用对象
// 深拷贝和浅拷贝结果相同
var arr = [1, 2, 3, 4, 5, 6]
var cloneArr = simpleClone(arr);
var arr1 = arr.slice();
var arr2 = arr.concat([]);
var arr3 = arr;
console.log(cloneArr == arr);//flase
console.log(arr1 == arr);//false
console.log(arr2 == arr);//false
console.log(arr3 == arr); //true
// 对于arr3 arr3得到的是arr的指针 arr3和arr指向堆中同一个数据数以相等
// 相互之间不会影响
// 二、 数组中存在引用对象
// var arr = [{ name: "arr" }, 1, 2, 3,4, 5];
console.log(cloneArr == arr);//flase
console.log(arr1 == arr);//false
console.log(arr2 == arr);//false
console.log(cloneArr[0] == arr[0]);//true
console.log(arr1[0] == arr[0]);//true
console.log(arr2[0] == arr[0]);//true
// 数组中的对象不是真正的对象 而是原数组中对象所对应的指针(相当于房子的钥匙)
// 所以新数组中的对象还是存储在堆内存中的那个数据 所以是ture
// 对象的拷贝
// 一、object 的浅拷贝 和数组基本相同
var obj = {
name: "obj",
friend: ["小明", "小红"]
}
// 第一种方法
var obj1 = obj;
obj1.say = function () {
console.log(this.name);
} //给obj1添加一个say方法
console.log(obj);//也会有say方法
// 第二种方法
var simpleObj = simpleClone(obj);
console.log(simpleObj.name == obj.name);//ture
console.log(simpleObj == obj); // false
console.log(simpleObj.friend == obj.friend); // true
//和数组中解释一样 属性中的数据 存储的是数据的指针 而不是数据的本身 所以指向相同的数据
// 第三种方法
var extendobj = {}
// Object.assign(目标函数,函数 ,{新加属性}) 新加属性可加可不加 如果新加属性相同 会覆盖前属性值
var returnObj = Object.assign(extendobj, obj, { name: "extendobj" })
console.log(returnObj === extendobj); // true
// 对象的深拷贝
// JSON.parse(JSON.stringify(object))可以实现深拷贝 但会丢失函数 所以一般用于处理数据
// 利用json.stringify将js对象序列化(就是转换成json字符串存储到硬盘上),在使用json.parse反序列化(还原)js对象
var jsonObj = JSON.parse(JSON.stringify(obj));
console.log(jsonObj === obj); // false
console.log(jsonObj.friend === obj.friend); // false
// 自己写函数做深克隆
var deepCloneObj = deepClone(obj);
console.log( deepCloneObj === obj); // false
console.log( deepCloneObj.friend === obj.friend); // false
//浅拷贝函数
function simpleClone(param) {
var newParam = param instanceof Array ? [] : {};
for (var i in param) {
newParam[i] = param[i];
}
return newParam;
}
//深克隆函数
function deepClone(param){
if(param === null){
return null;
}
var newParam = param instanceof Array ? [] : {};
for(var i in param){
newParam[i] = typeof param[i] === "object" ? deepClone(param[i]) : param[i];
}
return newParam;
}
浙公网安备 33010602011771号