interview
frontend-classic
深拷贝和浅拷贝有什么区别?JS怎么实现深拷贝?

前端经典面试题合集, 深拷贝和浅拷贝有什么区别?JS 怎么实现深拷贝?

前端经典面试题合集, 深拷贝和浅拷贝有什么区别?JS 怎么实现深拷贝?

QA

Step 1

Q:: 深拷贝和浅拷贝有什么区别?

A:: 浅拷贝只是复制对象的引用,所以新对象和原对象共享同一个内存地址,修改一个对象的属性会影响另一个对象。深拷贝则是创建一个新的对象,并递归地复制所有的属性和子对象,从而使新对象和原对象完全独立,互不影响。

Step 2

Q:: JS 怎么实现深拷贝?

A:: 在 JavaScript 中,可以使用 JSON.parse(JSON.stringify(object)) 方法实现深拷贝,但这种方法有局限性,比如不能拷贝函数、Date对象等。另一种方式是使用递归来实现深拷贝:

function deepClone(obj) { if (obj === null || typeof obj !== 'object') { return obj; } const clone = Array.isArray(obj) ? [] : {}; for (const key in obj) { if (obj.hasOwnProperty(key)) { clone[key] = deepClone(obj[key]); } } return clone; }

用途

面试这个内容是因为深拷贝和浅拷贝是前端开发中常见的操作,特别是在处理复杂数据结构和状态管理时,了解两者的区别和实现方式可以避免不必要的副作用和 bug。在实际生产环境下,例如在 Redux 中管理应用状态时,正确地使用深拷贝可以确保状态的不可变性,从而保证应用的稳定性和可维护性。\n

相关问题

🦆
什么是 JSON?它的主要用途是什么?

JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它主要用于在客户端和服务器之间传输数据。

🦆
如何在 JavaScript 中合并两个对象?

可以使用 Object.assign() 方法或扩展运算符(spread operator)来合并两个对象。例如:

const obj1 = {a: 1, b: 2}; const obj2 = {b: 3, c: 4}; const mergedObj = {...obj1, ...obj2}; // mergedObj 为 {a: 1, b: 3, c: 4}

🦆
什么是闭包Closure?

闭包是指在 JavaScript 中,函数能够记住并访问其词法作用域,即使这个函数在其词法作用域之外执行。闭包常用于创建私有变量和函数,避免全局作用域污染。例如:

function createCounter() { let count = 0; return function() { return ++count; } } const counter = createCounter(); counter(); // 1 counter(); // 2

🦆
解释 JavaScript 中的事件循环Event Loop.

事件循环是 JavaScript 处理异步操作的一种机制。JavaScript 是单线程的,通过事件循环来处理异步操作,如定时器、网络请求等。事件循环不断检查任务队列,如果主线程为空闲状态,就会取出队列中的任务执行,从而实现异步操作。

🦆
JavaScript 中的原型链是什么?

原型链是指 JavaScript 对象通过 proto 属性(或 prototype 属性)连接起来形成的链条。当访问对象的属性或方法时,JavaScript 引擎会沿着原型链查找,直到找到对应的属性或方法为止。如果没有找到,则返回 undefined。