JS中数据分为基本数据类型和引用数据类型。基本数据类型的值是存放在栈内存中的,引用数据类型,在栈内存中只存放了一个引用,实际的数据在堆内存中。 下面举例说明:
基本数据类型
var a = 1
var b = a
b = 2
console.log(a) // 1
console.log(b) // 2
将a的值赋予变量b,然后修改变量b,最后结果是b的值变了,a的值没有变
引用数据类型
var dict1 = {a:1,b:2}
var dict2 = dict1
dict2.a = 3
console.log(dict1.a) //3
console.log(dict2.a) //3
可以看到结果和基本数据类型不一样。我们将dict1的值赋予dict2,仅仅是将dict1在栈内存中的引用赋值给了dict2,而dict1和dict2指向的值是同一个数据。
上面的例子都是浅拷贝,浅拷贝就是只拷贝对象的引用,而不是深层次的拷贝对象的值,多个对象指向同一个值的时候,任何一个修改,都会使所有对象的值发生变化,接下来简单看一下深拷贝
深拷贝
深拷贝作用在引用类型上,例如:Object,Array,深拷贝不会拷贝引用,而是将引用类型的值拷贝一份,然后生成新的引用类型
深拷贝实现
1、JSON.stringfy()和JSON.parse()
var dict1 = {a:1,b:2}
var objString = JSON.stringify(dict1);
var dict2 = JSON.parse(objString);
dict2.a = 3;
console.log(dict1.a); // 1
console.log(dict2.a); // 3
可以看到,通过这种方式赋值之后,修改了新的对象的值,并没有修改原对象的值,也就实现了深拷贝。
注意:此种方法不能拷贝undefined , function, RegExp 等等类型的
2、Object.assign(target, source)
var dict1 = {a:1,b:2}
var dict2 = Object.assign({}, dict1);
dict2.b = 4;
console.log(dict1.b); // 2
console.log(dict2.b); // 4
这种方式对于多层引用也是可行的,这里我简单实现一下,具体的问题需要结合具体实际情况来决定,有时候也需要浅拷贝