数据的存储问题?
1:简单数据类型存储:把值存储在栈里面
2:复杂数据类型的存储,分为两步,就是地址存储在栈里面,而复杂数据类型的值(也就是对象)存储在堆里面。
注意点:在拷贝,new关键字,会在堆中生成一个空对象,对象的诞生,也就代表着地址也会生成
将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影响原对象
一、浅拷贝
只是拷贝了一层,更深层次的对象级别(复杂数据类型)的只拷贝了引用(也就是地址)
注意点:就是在obj里面有着对象的时候,就是有着地址和值,仅仅只能把地址被拷贝过去,
于是造成被拷贝的对象和拷贝对象,都指向同一个地址,不管修改那个对象的地址,都会互相影响。
第一种浅拷贝方法 利用for in的方法
let obj = {
id: 1,
name: "pink",
msg: {
age: 18
}
}
let o = {}
for (let k in obj) {
// k为属性名 obj[k]为属性名 直接把属性值拷贝给另一个对象
o[k] = obj[k];
}
console.log(o); //{id: 1, name: "pink", msg: {…}} age=18
obj.msg.age = 30;
console.log(o);
console.log(obj);
第二种方法 利用es6的方法 Object.assign(target,…sources)
参数一位需要拷贝的对象,参数二:被拷贝的对象
let obj = {
id: 1,
name: "pink",
msg: {
age: 18
}
}
let o = {}
//浅拷贝的第二种方法 es6方法 Object.assign(target,...sources) 参数一位需要拷贝的对象,参数二:被拷贝的对象
Object.assign(o, obj);
console.log(o); //age 为18
obj.msg.age = 30; //若是修改了年龄后,不管是下面的o,还是obj对象,还是上面的o对象都被修改了。
console.log(o);
console.log(obj);
二、深拷贝
深拷贝是拷贝多层,每一层级别的数据都会被拷贝(不仅地址,还有值)
深拷贝: 就是对象里面的复杂数据类型,整个对象复制一次后,在开辟一个新的空间,两个存储空间互不影响
实现—先遍历外层的数据(对象),然后在遍历内存的数据(对象) —可以使用递归的方式
let obj = {
id: 1,
name: "lala",
msg: {
age: 20
},
color: ["red", "pink", "yellow"]
}
let o = {}
//封装一个函数,这边需要遍历两次对象,
function deepCopy(newobj, oldobj) {
for (let k in oldobj) {
//先判断第一层的属性值属于那种数据类型 先判断是否为数组,然后判断是否为对象,最后判断是否属于简单数据类型
let item = oldobj[k]; //属性值
if (item instanceof Array) { //先判断是否为数组(因为数组也是属于对象,所以先判断)
newobj[k] = []; //先创建一个空数组,用于存放数据
deepCopy(newobj[k], item); //把item拷贝到newobj[k]
} else if (item instanceof Object) {
newobj[k] = {};
deepCopy(newobj[k], item);
} else {
newobj[k] = item;
}
}
}
deepCopy(o, obj)
console.log(o); //age为20
obj.msg.age = 30;
console.log(obj); //agewei30
//注意:深拷贝,修改o或者obj都不会互相影响
方式3 推荐
function deepCopy(obj) {
// 判断传递进来的是 数组还是对象
let newObj = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj[key] && typeof obj[key] === "object") {
newObj[key] = deepCopy(obj[key]);
} else {
// 没有子元素 简单数据类型
newObj[key] = obj[key];
}
}
// console.log("newObj", newObj);
return newObj;
}
let obj = {
id: 1,
name: "lala",
msg: {
age: 20,
},
color: ["red", "pink", "yellow"],
};
let resObj = deepCopy(obj);
resObj.id = 2
resObj.msg.age = 30
resObj.color[1] = 'pink222'
console.log('obj',obj);
console.log("resObj", resObj);
- 效果
方式2:
this.flistVal = JSON.parse(JSON.stringify(this.GuaranteeKaiLiFList));