返回

深入浅出:JS 基础面试题解析 - 第二弹

前端

深入浅出解析 JavaScript 基础面试题

欢迎来到 JavaScript 基础面试题解析系列的第二篇博文!在上一篇文章中,我们深入探讨了一些常见的面试题,并提供了详细的解释和代码示例。今天,我们将继续沿着这个思路,对更多 JavaScript 基础面试题进行深入浅出的解析,帮助你进一步巩固和提升自己的 JS 技能。

深拷贝与浅拷贝

什么是深拷贝和浅拷贝?

  • 浅拷贝: 仅复制对象的引用,而不是对象本身。修改浅拷贝后的对象,原对象也会受到影响。
  • 深拷贝: 复制对象本身及其所有属性和子属性。修改深拷贝后的对象,原对象不受影响。

如何实现深拷贝?

一种实现深拷贝的方法是使用递归。具体步骤如下:

  1. 对于原始类型(字符串、数字、布尔值),直接返回该值。
  2. 对于数组,创建一个新数组,并递归复制每个元素到新数组中。
  3. 对于对象,创建一个新对象,并递归复制每个属性及其值到新对象中。

代码示例:

function deepCopy(obj) {
  if (typeof obj !== "object" || obj === null) {
    return obj;
  }

  if (Array.isArray(obj)) {
    return obj.map(deepCopy);
  }

  const newObj = {};
  for (const key in obj) {
    newObj[key] = deepCopy(obj[key]);
  }

  return newObj;
}

事件循环

JavaScript 的事件循环机制是什么?

JavaScript 事件循环机制是一个循环,不断从事件队列中获取事件并发送到事件处理程序中执行。该机制包括三个阶段:

  1. 执行阶段: 执行同步代码。
  2. 任务队列阶段: 执行异步代码。
  3. 事件队列阶段: 执行来自浏览器或其他外部来源的事件。

代码示例:

// 同步代码
console.log("同步代码");

// 异步代码
setTimeout(() => {
  console.log("异步代码");
}, 0);

// 事件
document.addEventListener("click", () => {
  console.log("事件");
});

闭包

什么是闭包?

闭包是指可以访问其他函数内部变量的函数。换句话说,闭包可以访问其他函数作用域中的变量。

闭包的应用场景:

  • 数据私有化
  • 事件处理
  • 函数柯里化

代码示例:

function createCounter() {
  let count = 0;

  return function() {
    return count++;
  };
}

const counter = createCounter();
console.log(counter()); // 0
console.log(counter()); // 1

总结

以上就是本篇博文中介绍的几个常见 JS 基础面试题。通过对这些面试题的解析,希望你对 JS 基础知识有更深入的理解。在下一篇文章中,我们将继续探讨更多 JS 基础面试题,敬请期待!

常见问题解答

  1. 深拷贝和浅拷贝有什么区别?
  2. JavaScript 事件循环机制如何工作?
  3. 什么是闭包?
  4. 闭包有什么应用场景?
  5. 如何实现深拷贝?