面试干货!JavaScript 浅拷贝你真的会吗?
在 JavaScript 面试中,浅拷贝 vs 深拷贝是经常考查的基础概念。今天我们就通过几段真实截图,带你“入门即精通”。
一、浅拷贝是什么?
浅拷贝是指仅拷贝对象的第一层属性,而对于嵌套的对象或数组,则依然保留对原始引用。简单来说,一级属性独立,嵌套结构共享。
-
常用方式:
Object.assign(target, source)
- 展开语法
{ ...obj }
(Medium, CarlosRojasDev, MDN Web Docs, JavaScript教程)
二、实战截图解析
- 目标对象被修改:
第一张图展示了Object.assign(target, source)
后,target
除了接收source
的属性,还被直接改变,这说明浅拷贝会改写 target 变量本身。 - 后面的覆盖前面:
第二张图中,source
中的属性会覆盖target
中相同的属性,这也是Object.assign
的预期行为。(MDN Web Docs)
3. 引用类型共享问题:
第三张是典型面试题:浅拷贝后对嵌套数组或对象的修改,会反映在源对象和拷贝对象身上。这就是引用被共享的后果。(CarlosRojasDev, Medium, JavaScript教程)
三、何时用浅拷贝,何时用深拷贝?
数据结构类型 | 使用建议 |
---|---|
只有一层属性的对象(扁平对象) | 使用浅拷贝即可,性能更优 |
包含嵌套对象/数组等引用类型 | 推荐使用深拷贝,避免共享引用引发问题 |
常见深拷贝实现方式:
JSON.parse(JSON.stringify(obj))
- 新语法:
structuredClone(obj)
- 第三方库:
Lodash.cloneDeep(obj)
(Medium, LogRocket Blog, mayallo.com, CarlosRojasDev, sitepoint.com)
四、面试高频问答总结
- 问:
Object.assign
是浅拷贝还是深拷贝?
答:浅拷贝,只复制第一层属性,对于引用类型仍是共享引用。(Stack Overflow, CarlosRojasDev, JavaScript教程) - 问:浅拷贝能完整隔离修改吗?
答:只能隔离最外层属性的修改,内层嵌套对象变动仍会互相影响。 - 问:深拷贝推荐方法?
答:简单数据结构用JSON.stringify
+JSON.parse
,现代项目建议用structuredClone()
或更强大的cloneDeep
函数/库。
总结
这三张图真实反映了面试常问的三个点:浅拷贝会改变 target,对象属性覆盖行为,以及嵌套引用共享的问题。掌握这些再背上常见实现方式及区别,面试官问“你对 JavaScript 拷贝了解多少?”你就有底气答上来!
希望这篇博客草稿能帮到你啦,有什么想加的内容也可以随时告诉我!