数据分为基本数据类型(string,number,boolean,null,undefined,symbol)和引用数据类型(object类型,有:object,array,data,regexp,function)
1.基本数据类型:直接存储在栈(stack)的数据
2.引用数据类型:存储在该对象在栈中引用,真实的数据存放在堆内存里
具体呢?引用数据类型在栈中存储的是指针,然后让指针指向堆中该实体的地址。从而获取我们的实际的数据
浅拷贝只复制指向对象的指针,而不复制对象的本身,新旧对象还是共享同一块内存。
深拷贝会另外的创建一个一摸一样的对象,新对象和旧对象不共享内存,修改新对象不会改到源对象
浅拷贝就是只赋值数据(对象)本身,而不复制其内容(引用数据的内容),最终两个数组中指向同一套数据。
深拷贝则是既赋值本身也赋值内容,
js中对于引用类型的数据,默认都是浅拷贝
object.assign我们经常会用到合并对象,当然利用object.assign性质我们也可以实现对象的拷贝
var obj1 = {a: 1, b: 2}
var obj2 = Object.assign({}, obj1)
obj2.a = 4
console.log(obj1, obj2)
注意的是Object.assign第一个参数必须是个空对象
var obj1 = { a:1 , b:2 }
var obj2 = { ...obj1 }
obj2.a = 4;
console.log(obj1,obj2)
但这两种拷贝有一个问题就是只能赋值一层,假设我们有如下数据结构
var obj1 = [{
name: '臧三',
childs: ['小明', '小芳']
}]
var obj2 = [...obj1]
obj2[0].childs = []
console.log(obj1, obj2)
obj1,obj2 的结果均变了,这并不是我们想要的结果,所以我们要用到深拷贝。
//通过js的内置对象JSON来进行数组对象的深拷贝
function deepClone(obj) {
var _obj = JSON.stringify(obj),
objClone = JSON.parse(_obj);
return objClone;
}
//第一个参数不传(false是不能够显示的写出来的)默认为false,是浅拷贝。传true为深拷贝。
$.extend(true,object1, object2)
//newObject 即为深拷贝出来的对象
var newObject = $.extend(true , {} , object);
注意
这种简单粗暴的方法有其局限性,当值为undefined、function、symbol 会在转换过程中被忽略
利用数组的 slice 方法或者 concat 方法
var arr1 = ["aaa","bbb","ccc"];
var arr2 = arr1.slice(0);
arr2[0] = "ddd";
var arr1 = ["aaa","bbb","ccc"];
var arr2 = arr1.concat();
arr2[0] = "ddd";