js 浅拷贝和深拷贝(详细面试+代码)(20220318)

目录

模拟:

1.面试题:

哪些是浅拷贝 哪些是深拷贝?

得到的是深拷贝还是浅拷贝?

 Object.assign() 得到的是深拷贝还是浅拷贝?

说一下如何得到深拷贝的对象 如何进行深拷贝?

2. 浅拷贝的实现方式有哪几种?(3种)

  第一种   赋值变量, 仅仅拷贝了栈内存地址

第二种   ES6 语法   ...拓展运算符

第三种   ES6   利用object.assign()的方式对对象进行合并

3.实现深拷贝的方式有哪几种?(2种)

1.用 JSON.stringify()   JSON.parse()的方式来进行实现

2. 递归实现深拷贝


模拟:

面试官经常问到的方式:

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);

猜你喜欢

转载自blog.csdn.net/weixin_59519449/article/details/123582770