在js中,数据类型分为基本数据类型和引用数据类型,基本数据类型的值存在在栈中,而引用类型,他在栈内仅仅只存储一个引用,而真正的数据类型存储在堆内存中
当我们对数据进行操作的时候,会发生两种情况
一、基本数据类型
var a = 3;
var b = a;
b = 5;
console.log(a); // 3
console.log(b); // 5
可以看到的是对于基本类型来说,我们将一个基本类型的值赋予 a 变量,接着将 a 的值赋予变量 b ;然后我们修改 b ;可以看到 b 被修改了,而 a 的值没有被修改,两个变量都使用的是独立的数据;
二、引用数据类型
var obj1 = {
a: 1,
b: 2,
c: 3
}
var obj2 = obj1;
obj2.a = 5;
console.log(obj1.a); // 5
console.log(obj2.a); // 5
可以看到的是,两个对象的值全部被修改了
浅拷贝
两个对象指向同一个对象,两个对象是不同名称,但两个对象会相互影响。
上面的例子就是一个简单的浅拷贝
什么是深克隆:在实际的项目中,肯定不能让每个对象的值都指向同一个堆内存,这样的话不便于我们做操作,所以自然而然的诞生了深拷贝
深拷贝作用在引用类型上!例如:Object,Array
深拷贝不会拷贝引用类型的引用,而是将引用类型的值全部拷贝一份,形成一个新的引用类型,这样就不会发生引用错乱的问题,使得我们可以多次使用同样的数据,而不用担心数据之间会起冲突
举个简单的小例子
function checkType(data){
//数组也属于对象的一种
// var obj={}
// console.log(typeof(obj))
// var arr=[]
// console.log(typeof(arr))
//常用的判断数据类型的方法
// var obj={}//对象
// console.log(Object.prototype.toString.call(obj).slice(8,-1))
// var arr=[]//数组
// console.log(Object.prototype.toString.call(arr).slice(8,-1))
return Object.prototype.toString.call(data).slice(8,-1)
}
//对象和数组的深克隆
function deepClone(target){
var result;
var targetType=checkType(target)
if(targetType=='Object'){
result = {}
}else if(targetType=='Array'){
result =[]
}else{
return target
}
for(var i in target){
var value = target[i]
var valueType =checkType(value)
if(valueType=='Object'||valueType=='Array'){
result[i]=deepClone(value)
}else{
result[i]=value
}
}
return result
}
var arr1=[1,2,{age:33}]
var arr2=deepClone(arr1)
arr2[2].age=34
console.log(arr2)