返回
前端深度解密之掌握面试高频题目,一飞冲天
前端
2023-08-20 11:38:36
深入解析前端面试高频题目,助你提升技能,轻松征服面试
在前端开发者求职面试中,不可避免地会遇到一些高频题目,这些题目旨在考察应聘者的基础知识和解决问题的能力。深入掌握这些题目,将为你脱颖而出加分不少。
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()
方法。
- A: 使用
-
Q:如何遍历 Map 中的键值对?
- A: 使用
forEach()
方法或for...of
循环。
- A: 使用
-
Q:如何找到二叉树中的最深节点?
- A: 使用递归进行深度优先搜索,记录最深节点的深度和节点本身。