90%前端面试必问的12个JS核心,搞懂这些直接起飞!

作者:良山有风来日期:2025/11/5

你是不是也遇到过这样的场景?面试官抛出一个闭包问题,你支支吾吾答不上来;团队代码review时,看到同事用的Promise链一脸懵逼;明明功能实现了,性能却总是差那么一点...

别慌!今天我整理了12个JavaScript核心概念,这些都是2024年各大厂面试的高频考点,也是日常开发中真正实用的硬核知识。搞懂它们,不仅能轻松应对面试,更能让你的代码质量提升一个档次!

变量与作用域

先来看个最常见的面试题:

1// 经典面试题:猜猜输出什么?
2for (var i = 0; i < 3; i++) {
3  setTimeout(() => {
4    console.log(i); // 输出:3 3 3
5  }, 100);
6}
7

为什么会这样?因为var声明的变量存在变量提升,而且没有块级作用域。换成let就正常了:

1// 使用let的正确写法
2for (let i = 0; i < 3; i++) {
3  setTimeout(() => {
4    console.log(i); // 输出:0 1 2
5  }, 100);
6}
7

这里涉及到两个关键概念:变量提升和块级作用域。let和const是ES6引入的,它们有块级作用域,不会出现var的那些奇怪问题。

闭包与内存管理

闭包可能是最让人头疼的概念了,但其实理解起来并不难:

1// 闭包的实际应用:计数器
2function createCounter() {
3  let count = 0; // 这个变量被"封闭"在函数内部
4  
5  return {
6    increment: () => ++count,
7    decrement: () => --count,
8    getValue: () => count
9  };
10}
11
12const counter = createCounter();
13console.log(counter.increment()); // 1
14console.log(counter.increment()); // 2
15

闭包就是函数能够记住并访问其词法作用域中的变量,即使函数在其作用域外执行。但要注意内存泄漏问题:

1// 潜在的内存泄漏
2function createHeavyObject() {
3  const largeObject = new Array(1000000); // 大对象
4  
5  return () => {
6    // 即使外部不再需要,largeObject仍然被引用
7    console.log('对象还在内存中');
8  };
9}
10

原型与继承

JavaScript的继承是基于原型的,这和传统的类继承很不一样:

1// 原型链示例
2function Animal(name) {
3  this.name = name;
4}
5
6Animal.prototype.speak = function() {
7  console.log([`${this.name} makes a noise.`](https://xplanc.org/primers/document/zh/03.HTML/EX.HTML%20%E5%85%83%E7%B4%A0/EX.a.md));
8};
9
10function Dog(name) {
11  Animal.call(this, name); // 调用父类构造函数
12}
13
14// 设置原型链
15Dog.prototype = Object.create(Animal.prototype);
16Dog.prototype.constructor = Dog;
17
18Dog.prototype.speak = function() {
19  console.log(`${this.name} barks.`);
20};
21
22const dog = new Dog('Rex');
23dog.speak(); // Rex barks.
24

ES6的class语法让这变得更简单:

1class Animal {
2  constructor(name) {
3    this.name = name;
4  }
5  
6  speak() {
7    console.log([`${this.name} makes a noise.`](https://xplanc.org/primers/document/zh/03.HTML/EX.HTML%20%E5%85%83%E7%B4%A0/EX.a.md));
8  }
9}
10
11class Dog extends Animal {
12  speak() {
13    console.log(`${this.name} barks.`);
14  }
15}
16

异步编程演进

从回调地狱到async/await,异步编程经历了很大变化:

1// 1. 回调地狱
2function oldWay(callback) {
3  readFile('file1.txt', (err, data1) => {
4    if (err) return callback(err);
5    processData(data1, (err, result1) => {
6      if (err) return callback(err);
7      // 更多嵌套...
8    });
9  });
10}
11
12// 2. Promise链
13function promiseWay() {
14  return readFilePromise('file1.txt')
15    .then(processDataPromise)
16    .then(data => {
17      // 更清晰的流程
18    })
19    .catch(error => {
20      // 统一错误处理
21    });
22}
23
24// 3. async/await(推荐)
25async function modernWay() {
26  try {
27    const data = await readFilePromise('file1.txt');
28    const result = await processDataPromise(data);
29    return result;
30  } catch (error) {
31    console.error('处理失败:', error);
32  }
33}
34

Promise深度解析

Promise是现代JavaScript异步编程的基石:

1// 手写一个简易Promise
2class MyPromise {
3  constructor(executor) {
4    this.state = 'pending';
5    this.value = undefined;
6    this.onFulfilledCallbacks = [];
7    
8    const resolve = (value) => {
9      if (this.state === 'pending') {
10        this.state = 'fulfilled';
11        this.value = value;
12        this.onFulfilledCallbacks.forEach(cb => cb(value));
13      }
14    };
15    
16    executor(resolve);
17  }
18  
19  then(onFulfilled) {
20    return new MyPromise((resolve) => {
21      if (this.state === 'fulfilled') {
22        const result = onFulfilled(this.value);
23        resolve(result);
24      } else {
25        this.onFulfilledCallbacks.push((value) => {
26          const result = onFulfilled(value);
27          resolve(result);
28        });
29      }
30    });
31  }
32}
33

事件循环机制

这是JavaScript并发模型的核心:

1// 理解事件循环的执行顺序
2console.log('1. 同步任务开始');
3
4setTimeout(() => {
5  console.log('6. 宏任务执行');
6}, 0);
7
8Promise.resolve().then(() => {
9  console.log('4. 微任务执行');
10});
11
12console.log('2. 同步任务继续');
13
14Promise.resolve().then(() => {
15  console.log('5. 另一个微任务');
16});
17
18console.log('3. 同步任务结束');
19
20// 输出顺序:1 2 3 4 5 6
21

ES6+新特性实战

现代JavaScript提供了很多好用特性:

1// 解构赋值
2const user = { name: '小明', age: 25, city: '北京' };
3const { name, age } = user;
4
5// 扩展运算符
6const arr1 = [1, 2, 3];
7const arr2 = [...arr1, 4, 5]; // [1, 2, 3, 4, 5]
8
9// 可选链操作符
10const street = user?.address?.street; // 不会报错
11
12// 空值合并
13const displayName = user.nickname ?? '匿名用户'; // 只有null/undefined时使用默认值
14

函数式编程概念

JavaScript很适合函数式编程风格:

1// 高阶函数
2const users = [
3  { name: '小明', age: 25 },
4  { name: '小红', age: 30 },
5  { name: '小刚', age: 28 }
6];
7
8// 函数组合
9const getAdultNames = users
10  .filter(user => user.age >= 18)
11  .map(user => user.name)
12  .sort();
13
14// 柯里化
15const multiply = a => b => a * b;
16const double = multiply(2);
17console.log(double(5)); // 10
18

模块化系统

从IIFE到ES Modules的演进:

1// 现代ES Modules
2// math.js
3export const add = (a, b) => a + b;
4export const PI = 3.14159;
5
6// app.js
7import { add, PI } from './math.js';
8console.log(add(PI, 2)); // 5.14159
9
10// 动态导入
11const loadModule = async () => {
12  const module = await import('./math.js');
13  console.log(module.add(1, 2));
14};
15

类型系统与TypeScript

虽然JavaScript是动态类型,但类型检查很重要:

1// 类型检查工具函数
2const typeCheck = {
3  isString: value => typeof value === 'string',
4  isFunction: value => typeof value === 'function',
5  isObject: value => value !== null && typeof value === 'object'
6};
7
8// TypeScript带来的类型安全
9interface User {
10  name: string;
11  age: number;
12  email?: string;
13}
14
15function createUser(user: User): User {
16  // TypeScript会在编译时检查类型
17  return { ...user };
18}
19

性能优化技巧

写出高性能的JavaScript代码:

1// 防抖函数:避免频繁调用
2function debounce(func, wait) {
3  let timeout;
4  return function executedFunction(...args) {
5    const later = () => {
6      clearTimeout(timeout);
7      func(...args);
8    };
9    clearTimeout(timeout);
10    timeout = setTimeout(later, wait);
11  };
12}
13
14// 使用Web Worker处理密集型任务
15const worker = new Worker('heavy-task.js');
16worker.postMessage({ data: largeData });
17worker.onmessage = (event) => {
18  console.log('计算结果:', event.data);
19};
20

现代开发工具链

2024年的前端开发离不开这些工具:

1// Vite配置示例
2// vite.config.js
3export default {
4  plugins: [vue(), eslint()],
5  build: {
6    rollupOptions: {
7      output: {
8        manualChunks: {
9          vendor: ['vue', 'vue-router']
10        }
11      }
12    }
13  }
14};
15
16// 现代测试工具
17import { describe, it, expect } from 'vitest';
18
19describe('工具函数测试', () => {
20  it('应该正确计算加法', () => {
21    expect(add(1, 2)).toBe(3);
22  });
23});
24

这12个核心概念就像JavaScript的基石,理解它们不仅能让你在面试中游刃有余,更能写出更健壮、更易维护的代码。


90%前端面试必问的12个JS核心,搞懂这些直接起飞!》 是转载文章,点击查看原文


相关推荐


OpenAI Aardvark:当AI化身代码守护者
墨风如雪2025/10/31

想象一下,一个不知疲倦、聪明绝顶的数字侦探,夜以继日地巡视你的代码,在每一个新提交、每一行变更中嗅探潜在的危险。这不是科幻,而是OpenAI在2025年末悄然放出的重磅炸弹——Aardvark。这款以“土豚”命名的AI智能体,并非简单的代码扫描器,它标志着AI在网络安全领域,真正迈出了“自主思考”的第一步。 认识你的新安全伙伴 Aardvark,由OpenAI最先进的GPT-5模型驱动,被定位为一个“agentic security researcher”。你可以把它理解为一位全职的“白帽黑客


CoAlbum:多级缓存与性能对比
RealmElysia2025/10/29

目录 Target 1.多级缓存生效注解 2.缓存上下文 3.责任链 Hander接口 责任链初始化 5.切面Aop Coalbum项目 使用缓存 性能对比 Jmeter tips Target Caffeine+Redis构建多级缓存,采用责任链模式,使用aop+注解的方式增强目标方法。若缓存命中,返回命中值。若没命中,执行目标方法,将目标方法返回值依次存入缓存链。 1.多级缓存生效注解 /** * 多级缓存生效注解 */ @Target


为超过10亿条记录的订单表新增字段
Sam_Deep_Thinking2025/10/26

如何为 10 亿行 MySQL 大表安全新增字段? 之前在一家餐饮公司待过几年。由于这家公司已经营业了很多年,MySQL 5.6 的订单表数据早已超过 10 亿行。这就带来一个经典难题: 如何为这张大表新增字段? 当时的处理方式 假设业务需求的上线时间是 2025 年 10 月 23 日,我们会安排组内同事在 10 月 22 日或 23 日凌晨 提交数据库变更: ALTER TABLE order_items ADD COLUMN new_flag TINYINT DEFAULT 0; 变


C 语言标准库头文件 time.h
hubenchang05152025/10/23

#C 语言标准库头文件 time.h 请查看 C 语言标准库头文件列表 了解更多相关 API。 这个头文件提供 线程 相关的功能。例如线程控制、互斥量、条件变量、线程局部存储等。 #常量 宏标准说明CLOCKS_PER_SECC89处理器的每秒时钟数,POSIX 上定义为 1000000 而非实际的时钟数TIME_UTCC11表示时间基准为 UTC 时间 #类型 类型标准说明time_tC89日历时间的时间戳类型(自 1970 年 1 月 1 日 00:00:00.000 UTC 以来的秒数


Redis(77)Redis缓存的优点和缺点是什么?
Victor3562025/10/22

Redis作为一个高性能的分布式缓存系统,具有许多优点,但也有一些缺点。以下详细讲解Redis缓存的优点和缺点,并结合代码说明如何尽量发挥其优点和规避其缺点。 优点 1. 高性能 Redis以其卓越的读写性能著称,能够支持高吞吐量的读写操作。 示例代码: import redis.clients.jedis.Jedis; public class RedisPerformanceExample { public static void main(String[] args) {


FFmpeg 基本数据结构 AVFormatConext 分析
给大佬递杯卡布奇诺2025/10/21

1、FFmpeg 主要数据结构分层设计 1.1 IO抽象层 协议层与 I/O 抽象层 (Protocol & I/O Abstraction),这一层负责从最广泛的数据源读取或写入数据。 核心数据结构:AVIOContext 功能: 抽象了底层的 I/O 操作。通过它,FFmpeg 可以用统一的接口处理文件、网络流(HTTP, RTMP, TCP)、内存缓冲区等。 关键点: 它使得上层的格式层(解复用)无需关心数据是从哪里来的。这对于播放网络直播流或处理内存中的媒体数据至关重


SpringCloud微服务项目实战——系统实现篇
thginWalker2025/10/20

06 服务多不易管理如何破——服务注册与发现 经过上一篇系统性的介绍 Spring Cloud 及 Spring Cloud Alibaba 项目,相信你已经对这两个项目有个整体直观的感受,本篇开始正式进入本课程的第二部分,一起进入业务的开发阶段。 服务调用问题 在分析业务需求时,其中有个简单的功能点:会员可以开通月卡,开通月卡的同时,需要增加相应的积分。开通月卡功能在会员服务模块维护,但增加积分功能在积分服务模块维护,这就涉及到两个模块间的服务调用问题。 单实例情况:可以采用点对点的


linux系统jdk&&mysql配置
阑梦清川2025/10/18

使用ubuntu进行举例说明: 更新软件包 sudo apt update 安装JDK sudo apt install openjdk-17-jdk 关于mysql, #查找安装包 apt list |grep "mysql-server" #安装mysql sudo apt install mysql-server 查看数据库的状态: sudo systemctl status mysql 如果遇到问题,参考下面的这个: 这个主要是刷新权限表,然后修改我们的密码,否则会报错


【机器学习入门】8.1 降维的概念和意义:一文读懂降维的概念与意义 —— 从 “维度灾难” 到低维嵌入
做科研的周师兄2025/10/17

对于刚入门机器学习的同学来说,“高维数据” 是很容易遇到的痛点 —— 比如处理包含几十甚至上百个特征的数据集时,不仅训练速度变慢,模型还可能因为 “维度太多” 出现泛化能力下降的问题。而 “降维” 正是解决高维数据困境的核心技术。今天我们就从基础概念出发,拆解 “维度灾难” 的危害、降维的本质,以及经典的低维嵌入方法,帮你彻底理解降维为什么重要、到底在做什么。 一、先搞懂:什么是 “维度”?为什么会有 “维度灾难”? 在学习降维前,我们需要先明确 “维度” 的定义,以及高维数据会带来的核心问


【鸿蒙生态共建】鸿蒙6适配-API变化与兼容(2.UI交互与基础能力篇)--《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利
俩毛豆2025/10/15

HarmonyOS开发者版本6.0.0(API 20)Release(鸿蒙6) 在2005年9月25日正式发布。相对于HarmonyOS 5.0版本增加了多项新能力及对已有能力的优化。同时也有部分API进行了变更。 本篇内容是《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》这本书整体内容的延续,是咱这本书读者的福利,内容以本书的示例作为基础,适配鸿蒙6过程中,所需要完成的调整。并将这些调整记录分享给大家,本篇内容主要介绍与UI交互与基础能力的鸿蒙6兼容适配。 打

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0