赋值,浅拷贝,深拷贝的区别
JS数据类型
基本数据类型:数值,字符串,布尔,undefined ,null,symbol这种
引用数据类型:数组,对象
赋值
数组对象的赋值是有影响的,改新的数组和新的对象,老的数据也会发生变化。对于基本数据类型,改变新的对于老的数据是没有影响的。
//对象进行赋值改变新的对象的值
let a={name:'xue',age:[1,2,3,4]}
let aa=a
aa.name='jun'
console.log(aa,a);
//{name: 'jun', age: Array(4)} {name: 'jun', age: Array(4)}
//对于对象进行赋值,新对象变化,老的也变化
浅拷贝
个人的理解浅复制就是复制该对象的的每个属性,如果该属性值是原始值,则复制该原始值,如果属性值是一个对象,那么就复制该对象的引用。
就是如果第一层是基本数据类型,则新数据改变,不会改变老数据的基本数据。引用数据类型变化会影响老的数据变化。
let arr=[1,2,3,[12,34,56]]
let arrclon//浅克隆
//浅克隆第一层里面的基本数据类型不互通,引用数据类型互通
实行浅克隆的方式
Object.assign()是可以实现对象的浅克隆
扩展运算符(...)
let arr={a:1{b:2}}
let arrclon=Object.assign()
let arrr={...arr}
//arrclon的浅克隆
浅克隆的手动实现
function shallowClone(source) {
// 如果是原始值,直接返回
if (typeof source !== 'object') {
return source;
}
// 拷贝后的对象
const copied = Array.isArray(source) ? [] : {};
// 遍历对象的key
for(let key in source) {
// 如果key是对象的自有属性
if(source.hasOwnProperty(key)) {
// 复制属性
copied[key] = source[key]
}
}
// 返回拷贝后的对象
return copied;
}
Object.hasOwnProperty()
返回 true 这个用来判断是否,来复制数据。
深拷贝
JSON.parse()和JSON.stringify()
原生js书写
function deepClone(source) {
// 如果是原始值,直接返回
if (typeof source !== 'object') {
return source;
}
// 拷贝后的对象
const copied = Array.isArray(source) ? [] : {};
// 遍历对象的key
for(let key in source) {
// 如果key是对象的自有属性
if(source.hasOwnProperty(key)) {
// 深复制
copied[key] = deepClone(source[key]);
}
}
return copied;
}