深拷贝和浅拷贝的问题
简单理解就是:浅拷贝复制的是对象的引用地址,没有开辟新的栈,复制的结果是两个对象指向同一个地址,所以修改其中一个对象的属性,另一个对象的属性也跟着改变了。:在拷贝的时候,创建新的对象,并把原对象所有的属性都深拷贝到新对象,原属性如果是对象,也会重新创建新的对象并拷贝到新对象属性中,这样。:只复制一层对象,当对象的属性是引用类型时,实质上复制的是其引用,当引用指向的值发生变化时,深拷贝会开辟新的栈,
先来复习一下什么是深拷贝和浅拷贝:
浅拷贝:只复制一层对象,当对象的属性是引用类型时,实质上复制的是其引用,当引用指向的值发生变化时,原对象的属性值也会跟着变化,互相影响。
深拷贝:在拷贝的时候,创建新的对象,并把原对象所有的属性都深拷贝到新对象,原属性如果是对象,也会重新创建新的对象并拷贝到新对象属性中,这样旧对象和新对象就是互相独立的,互不影响。【默认情况下基本数据类型(number,string,null,undefined,boolean)都是深拷贝。】
简单理解就是:浅拷贝复制的是对象的引用地址,没有开辟新的栈,复制的结果是两个对象指向同一个地址,所以修改其中一个对象的属性,另一个对象的属性也跟着改变了。
深拷贝会开辟新的栈,两个对象对应两个不同的地址,修改对象A的属性,并不会影响到对象B
数组浅拷贝解决方案
- 使用slice()
- 使用concat()
- ES6扩展运算符
- Array.form()
对象浅拷贝解决方案
用 JSON.stringify 把对象转换成字符串,再用JSON.parse把字符串转换成新的对象,但如果对象中包含 function 或 RegExp 则不能用这种方法。
vue中遇到的深拷贝和浅拷贝的问题
这里是把原来的数据变成字符串类型
for(var i in this.tablerow){
this.tablerow[i] = this.tablerow[i].toString();
}
但这样只是一层浅拷贝,当对话框里的内容改变时,表单里也会跟着改变。
解决:使用vue里的$set方法来实现深拷贝,这时对话框里的内容改变就不会影响到表单内容了
// 浅拷贝变为深拷贝
var json = {};
for(var i in this.tablerow){
this.$set(json,i,this.tablerow[i].toString());
}
this.form = json;
更多推荐
所有评论(0)