目录
第三种 ES6 利用object.assign()的方式对对象进行合并
1.用 JSON.stringify() JSON.parse()的方式来进行实现
模拟:
面试官经常问到的方式:
1.面试题:
哪些是浅拷贝 哪些是深拷贝?
得到的是深拷贝还是浅拷贝?
Object.assign() 得到的是深拷贝还是浅拷贝?
说一下如何得到深拷贝的对象 如何进行深拷贝?
如果让你回答,你会如何进行回答呢!!!!!
原因 在下边:(深拷贝 浅拷贝 堆和栈的区分场景回答)
深拷贝
深拷贝就是 对目标的完全拷贝 拷贝多层,每一级别的数据都会拷贝出来 而且不受原对象影响
浅拷贝
浅拷贝就是只复制一层,深层次的对象级别就拷贝引用
栈
保存 基本数据类型
基本数据类型的大小是固定的 有固定的空间进行存储
堆
引用数据类型
引用数据类型的大小是不确定的, 只能在堆当中开辟空间进行存储
将其指向的地址保存在栈中(因为指向的地址的大小是固定不变的)
2. 浅拷贝的实现方式有哪几种?(3种)
第一种 赋值变量, 仅仅拷贝了栈内存地址
let arr = [1, 2, 3];
let arr2 = arr; // 复制 拷贝 仅仅拷贝了栈内存地址
arr[1] = '我被修改了';
console.log("arr:", arr);
console.log("arr2:", arr2); */
第二种 ES6 语法 ...拓展运算符
let arr = [1, 2, 3, ['a', 'b', 'c']];
let arr2 = [...arr]; // 浅拷贝
arr[3][1] = '我被修改了';
console.log("arr:", arr);
console.log("arr2:", arr2); */
第三种 ES6 利用object.assign()的方式对对象进行合并
let obj = {
name: '苏星',
age: 38,
desc: {
height: 150,
weight: 200,
zx: '漂亮'
}
}
let obj2 = Object.assign({}, obj);
// obj['name'] = '张晨玥';
obj['desc']['zx'] = '漂亮?';
console.log("obj :", obj);
console.log('obj2:', obj2); */
3.实现深拷贝的方式有哪几种?(2种)
1.用 JSON.stringify() JSON.parse()的方式来进行实现
let obj = {
name: '苏星',
age: 38,
desc: {
height: 150,
weight: 200,
zx: '漂亮'
}
}
console.log(JSON.stringify(obj), typeof JSON.stringify(obj));
let obj2 = JSON.parse(JSON.stringify(obj)); // 将对象进行深拷贝
obj['desc']['zx'] = '丑';
console.log("obj :", obj);
console.log("obj2:", obj2);
2. 递归实现深拷贝
let obj = {
name: '苏星',
age: 38,
desc: {
height: 150,
weight: 200,
zx: '漂亮'
}
}
function deepClone(obj) {
let obj2 = {};
if(obj instanceof Array) {
obj2 = []
}
for(let key in obj) {
// console.log("key:", key, obj[key]);
if(typeof(obj[key]) === 'object' && obj[key] !== null ) {
obj2[key] = deepClone(obj[key])
} else {
obj2[key] = obj[key]
}
}
return obj2;
}
let obj2 = deepClone(obj);
obj['desc']['zx'] = '丑';
console.log("obj :", obj);
console.log("obj2:", obj2);