赋值
赋值语句指向都是同一栈,基本类型指向栈中的值,引用数据类型指向栈中的地址
const obj={name:'Tom',arr:[1,3,1,4,5,2,0]};
const obj1=obj;
obj1.name='Jerry'
obj1.arr[6]=1;
console.log('obj',obj); //{name:'Jerry',arr:[1,3,1,4,5,2,1]}
console.log('obj1',obj1); //{name:'Jerry',arr:[1,3,1,4,5,2,1]}
浅拷贝
拷贝前后对象的基本数据类型互不影响,拷贝前后对象的引用类型因共享同一块内存,会相互影响。如果属性是基本类型,拷贝的就是基本类型的值。如果属性是引用类型,拷贝的就是内存地址
const obj={name:'Tom',arr:[1,3,1,4,5,2,0]};
const obj1=_.clone(obj);//用lodash库里的浅拷贝
obj1.name='Jerry',
obj1.arr[6]=1;
console.log('obj',obj); //{name:'Tom',arr:[1,3,1,4,5,2,1]}
console.log('obj1',obj1); //{name:'Jerry',arr:[1,3,1,4,5,2,1]}
深拷贝
深拷贝开辟一个新的栈,两个对象属完成相同,但是对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性
const obj={name:'Tom',arr:[1,3,1,4,5,2,0]};
const obj1=_.deepClone(obj);//用lodash库里的深拷贝
obj1.name='Jerry',
obj1.arr[6]=1;
console.log('obj',obj); //{name:'Tom',arr:[1,3,1,4,5,2,0]}
console.log('obj1',obj1);//{name:'Jerry',arr:[1,3,1,4,5,2,1]}
浅拷贝的实现方式
Object.assign(); //const cloneObj= Object.assign({},obj)
函数库lodash的_.clone方法;
展开运算符...; // const cloneObj={...obj}
Array.prototype.concat(); //const cloneArr= arr.slice()
Array.prototype.slice(); //const cloneArr= arr.concat()
手写浅拷贝
//第一种
const cloneObj = (obj) => {
if (typeof obj !== "object") {
return obj;
}
if (obj instanceof Object) {
return Object.assign({}, obj);
}
if (obj instanceof Array) {
return [].concat(obj);
}
};
const obj={name:'Tom',arr:[1,3,1,4,5,2,0]};
const obj1=cloneObje(obj);
obj1.name='Jerry',
obj1.arr[6]=1;
console.log('obj',obj); //{name:'Tom',arr:[1,3,1,4,5,2,1]}
console.log('obj1',obj1); //{name:'Jerry',arr:[1,3,1,4,5,2,1]}
//第二种
function shallowClone(obj) {
const newObj = {};
for(let prop in obj) {
if(obj.hasOwnProperty(prop)){//hasOwnProperty() 方法返回一个布尔值,表示对象自有属性(而不是继承来的属性)中是否具有指定的属性。
newObj[prop] = obj[prop];
}
}
return newObj;
}
const obj={name:'Tom',arr:[1,3,1,4,5,2,0]};
const obj1=shallowClone(obj);
obj1.name='Jerry',
obj1.arr[6]=1;
console.log('obj',obj); //{name:'Tom',arr:[1,3,1,4,5,2,1]}
console.log('obj1',obj1);//{name:'Jerry',arr:[1,3,1,4,5,2,1]}
深拷贝的实现方式
JSON.parse(JSON.stringify());可以实现深拷贝,问题很多,不建议使用。
函数库lodash的_.cloneDeep方法。
手写深拷贝
const deepClone = (obj) => {
if (typeof obj !== "object" || obj == null) {
return obj;
}
let result = Array.isArray(obj) ? [] : {};
for (const key in obj) {
// 保证key不是从原型取得的属性
if (Object.hasOwnProperty.call(obj, key)) {
// 递归调用
result[key] = deepClone(obj[key]);
}
}
return result;
};
const obj={name:'Tom',arr:[1,3,1,4,5,2,0]};
const obj1=deepClone(obj);
obj1.name='Jerry',
obj1.arr[6]=1;
console.log('obj',obj); //{name:'Tom',arr:[1,3,1,4,5,2,0]}
console.log('obj1',obj1);//{name:'Jerry',arr:[1,3,1,4,5,2,1]}