let forms = this.form forms.card_type = this.type; forms.token = this.token;
本来是这样写的,把原本的form赋值给新的forms,但是下面添加了俩属性,原数组居然也变了,
然后上网查了一下。
let forms = JSON.parse(JSON.stringify(this.form)); forms.card_type = this.type; forms.token = this.token;
应该这样写,就不会改变原对象了,
因为js中的内存空间分为栈,堆,池。
栈 存放基本数据
堆 存放引用数据
池 存放常量
// 基本数据 字符串、数值、布尔值等
这种情况是数据直接存放到栈中,b直接拷贝了一份数据,所以不会改变原数据,
// 引用数据 数组,对象等较大较复杂的
let aa = {
name:"一号",
age:"11"
}
//这个是引用数据类型,是存放的堆中,就像他在堆中锁着,会有一把钥匙,存放在栈中
// ,然后从栈中拿到这把钥匙,就共享了这个数据,就能改变这个数据
let bb = aa //而这一步操作,实际上是复制了aa在栈中存放的那把钥匙,数据俩人用的都是堆中的一个
aa.name = "二号"
console.log(aa,bb) //输出为,俩都是一样的
{ {
name:"二号", name:"二号",
age:"11" age:"11"
} }
所以说原数据改变了。解决办法就是深拷贝,
JSON.parse(JSON.stringify(xxx));
通过JSON转换,相当于生成了一个新的钥匙对应一份新的数据,所以就不会改变原数据。
浅拷贝
如果是基本数据类型拷贝的就是数据本身,如果是引用数据类型拷贝的就是他的 “钥匙”,
深拷贝
会拷贝所有属性,创建新的对象,占用新的内存,拿到一把新的 “钥匙”,这样前后两个数据不会相互有任何的影响,