一道让人懵逼的面试题

题目描述

Let obj={
    Name:"张三",
    Age:"20",
    Love:{
        Balls:"篮球",
        Food:"三明治"
    }
}
写一段代码,拷贝上面的对象obj得到objCopy,并且执行代码objCopy.Love.Food="沙拉",    
不会使得obj.Love.Food的值发生改变

题目来源及自己的思路

来自隔壁老王公司的面试题,我有点懵逼,到底说的是啥,有人知道吗?

阅读 2.6k
5 个回答

确定代码不是这样:

let obj = {
    Name: '张三',
    Age: 20,
    Love: {
        Balls: '篮球',
        Food: '三明治'
    }
}

如果是这样,那这道题其实考察的是对象深拷贝的问题,一个简单的方法:

let objCopy = JSON.parse(JSON.stringify(obj));
objCopy.Love.Food = '沙拉';

直接用 let objCopy = obj; 复制 objCopy 会和 obj 数据绑定,随便修改其中一个,另一个也会发生改变。

这问题问的就是如何复制可以使得复制出来的对象与原来的对象不存在数据绑定。

一般来说,简单的一维取消绑定用:

let objCopy = Object.assign({}, obj);

多维取消绑定用:

let objCopy = JSON.parse(JSON.stringify(obj));

Object.assign({}, obj) 的方法复制到 objCopy ,你修改 objCopy 的 Name, Age, Love 这些直接属性不会影响 obj ,但是你要修改子属性例如修改 Love.Food 还是会影响 obj 。

所以这个题目就是要用 JSON.parse(JSON.stringify(obj)) 的方法。

楼上说的都说到点子上了,就是对象克隆问题,深浅拷贝,浅拷贝对于某些类型只拷贝引用,引用指向的实际对象是一致的,所以一个更改,都会更改,但是深拷贝不会。

对象是存在堆内存中的 变量只不过是指向了他的地址 存在栈内存中

推荐问题
宣传栏