一、先说数据类型,再谈深拷贝浅拷贝。
JavaScript中的数据类型分为基本数据类型和引用数据类型。
基本数据类型:
即为值类型,字符串string
,数值number
,布尔值boolean
,null
, undefined
1、占用空间固定,保存在栈
中:当一个方法执行时,每个方法都会建立自己的内存栈,也就是所谓的函数作用域,基础变量的值是存储在栈区中的。
2、保存与复制的是值本身。
3、可以用typeof
检测值类型
引用数据类型:
即引用对象:Object(Array,Date,RegExp等)
1、引用类型变量存储在栈中的是指向堆中的数组或者对象的"地址",占用空间不固定,保存在堆
中:由于对象的创建成本比较大,在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用,这个运行时数据区就是堆内存
2、保存与复制的是指向对象的一个指针。
3、使用instanceof()
检测数据类型。
4、使用 new()
方法构造出的对象是引用型
二、深拷贝与浅拷贝
拷贝,就是赋值。
把一个变量赋给另外一个变量,就是把变量的内容进行拷贝。把一个对象的值赋给另外一个对象,就是把一个对象拷贝一份。
let x=1;
y=x;
console.log(y);//y=1,此时将x的值赋值给y,x和y的值相等
y=5;//此时改变y的值,x值不变
console.log(y);//y=5
console.log(x);//y=1
//基本数据类型赋值,赋的是数据本身,没有深浅拷贝这一说。
引用数据类型的深拷贝与浅拷贝:
1、浅拷贝:
let obj={
name:'张三',
age:'18'
}
let newObj=obj;
newObj.name='李四';
// 将obj的值赋值给newObj,并且更改了newObj的属性值,
// 这时我们发现原来的obj的属性值name也发生了变化
console.log(obj.name);//李四
console.log(newObj.name);//李四
// 引用类型赋值时,赋的值地址。
// 这时只是把obj的地址拷贝了一份,赋值给newObj,并没有将数据拷贝一份。
2、深拷贝
let obj={
name:'张三',
age:'18'
}
let newObj = JSON.parse(JSON.stringify(obj));
newObj.name = '李四';
// 将obj的值赋值给newObj,通过JSON.parse(JSON.stringify(obj))的方式,
// 将地址和数据都进行拷贝,此时在去更改newObj的属性值,obj则不会发生变化;
console.log(obj.name);//张三
console.log(newObj.name);//李四