返回

前端深度解密之掌握面试高频题目,一飞冲天

前端

深入解析前端面试高频题目,助你提升技能,轻松征服面试

在前端开发者求职面试中,不可避免地会遇到一些高频题目,这些题目旨在考察应聘者的基础知识和解决问题的能力。深入掌握这些题目,将为你脱颖而出加分不少。

1. 对象的创建与继承

创建对象:

  • 字面量语法: 使用大括号 {} 创建对象,属性和值以键值对形式呈现。
  • 构造函数: 一种特殊函数,通过 new 调用来创建新对象,内部包含属性和方法的定义。

继承对象:

  • 原型继承: 默认的继承方式,子对象通过原型链继承父对象的所有属性和方法。
  • 构造函数继承: 子对象的构造函数调用父对象的构造函数,实现继承。
  • 组合继承: 结合原型继承和构造函数继承的优点,既能继承父对象的属性,又能避免覆盖父对象的方法。

代码示例:

// 字面量语法
const person = {
  name: 'John Doe',
  age: 30,
  occupation: 'Software Engineer'
};

// 构造函数
function Person(name, age, occupation) {
  this.name = name;
  this.age = age;
  this.occupation = occupation;
}

2. 对 this 指向的理解

this 指向当前执行上下文中的对象:

  • 在函数中,指向调用该函数的对象。
  • 在对象方法中,指向该对象本身。

代码示例:

// 函数中 `this` 指向调用对象
function greet() {
  console.log(this.name);
}

const person = {
  name: 'John Doe',
  greet: greet
};

person.greet(); // 输出:John Doe

3. Set 和 Map 数据结构

Set:

  • 无序集合,不允许重复值。
  • 可以存储任何类型的数据,包括对象和函数。

Map:

  • 键值对集合,允许存储重复键值对。
  • 键可以是任何类型的数据,包括对象和函数。
  • 值可以是任何类型的数据。

代码示例:

// Set
const set = new Set([1, 2, 3, 4, 5]);

// Map
const map = new Map([
  [1, 'one'],
  [2, 'two'],
  [3, 'three']
]);

4. 数组众数的查找

众数是指数组中最常见的元素。

  • 哈希表: 将数组元素作为键,出现次数作为值,取出现次数最多的键。
  • 排序: 排序数组,中间元素或两个中间元素的平均值即为众数。
  • 摩尔投票算法: 计数器记录当前众数,遍历数组,如果当前元素与计数器中元素相同,计数器加一,否则减一。当计数器为零时,重置计数器并更新当前众数。

代码示例:

// 摩尔投票算法
function findMode(arr) {
  let candidate;
  let count = 0;

  for (let i = 0; i < arr.length; i++) {
    if (count === 0) {
      candidate = arr[i];
      count = 1;
    } else if (candidate === arr[i]) {
      count++;
    } else {
      count--;
    }
  }

  return candidate;
}

5. 树形结构的遍历

  • 前序遍历: 先访问根节点,再访问左子树,最后访问右子树。
  • 中序遍历: 先访问左子树,再访问根节点,最后访问右子树。
  • 后序遍历: 先访问左子树,再访问右子树,最后访问根节点。

代码示例:

// 前序遍历
function preorder(root) {
  if (root !== null) {
    console.log(root.data);
    preorder(root.left);
    preorder(root.right);
  }
}

常见问题解答

  • Q:原型继承和构造函数继承的区别是什么?

    • A: 原型继承在子对象中创建一个指向父对象原型的指针,而构造函数继承在子对象的构造函数中调用父对象的构造函数,实现真正的继承。
  • Q:什么时候使用 Set,什么时候使用 Map?

    • A: 当需要存储无重复值时使用 Set,当需要存储键值对且允许重复键时使用 Map。
  • Q:如何判断一个元素是否在 Set 中?

    • A: 使用 has() 方法。
  • Q:如何遍历 Map 中的键值对?

    • A: 使用 forEach() 方法或 for...of 循环。
  • Q:如何找到二叉树中的最深节点?

    • A: 使用递归进行深度优先搜索,记录最深节点的深度和节点本身。