✅ JavaScript 基础面试题(题目 + 答案)
🔹 一、基础语法与数据类型
1. == 和 === 的区别?
==是宽松比较,会进行类型转换后再比较值。===是严格比较,值和类型都必须相等。
2. JavaScript 有哪些数据类型?基本类型和引用类型的区别?
- 基本类型(Primitive):
number、string、boolean、undefined、null、bigint、symbol - 引用类型(Reference):
object(包括Array、Function、Date等) - 区别:基本类型按值存储,引用类型按地址存储,比较时引用类型是比较内存地址。
3. typeof null 返回什么?为什么?
- 返回
"object" - 原因是 JavaScript 早期设计的 bug:null 被错误标识为对象类型。
4. var, let, const 有什么区别?
| 特性 | var | let | const |
|---|---|---|---|
| 作用域 | 函数作用域 | 块级作用域 | 块级作用域 |
| 提升行为 | 变量提升 | 不提升 | 不提升 |
| 重复声明 | 可以 | 不可以 | 不可以 |
| 是否可修改 | 可重新赋值 | 可重新赋值 | 不能重新赋值(引用内容可变) |
🔹 二、作用域与闭包
5. 什么是作用域?JS 有哪几种?
- 作用域:变量可访问的范围。
- 类型:全局作用域、函数作用域(var)、块级作用域(let/const)。
6. 什么是闭包?有哪些应用?
- 闭包是函数能“记住”其定义时的作用域变量。
- 应用:私有变量、缓存、函数工厂、事件绑定。
7. 输出什么?为什么?
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 100);
}
输出:
3
3
3
原因:var 没有块级作用域,循环结束时 i = 3,所有回调共享同一个变量。
🔹 三、函数与 this
8. 普通函数与箭头函数的 this 有何区别?
- 普通函数:
this取决于调用方式。 - 箭头函数:没有自己的
this,继承定义时的上下文。
9. bind、call、apply 的区别?
call:立即调用,参数逐个传入apply:立即调用,参数用数组传入bind:返回新函数,不立即执行
10. 输出什么?为什么?
const obj = {
name: "Logan",
sayHi() {
setTimeout(function () {
console.log(this.name);
}, 100);
}
};
obj.sayHi();
输出: undefined
原因:普通函数 this 指向 window,解决方法是用箭头函数或 .bind(this)。
🔹 四、异步与事件循环
11. 什么是事件循环?
- JS 是单线程的,事件循环机制保证:同步任务优先执行,异步任务排队等候。微任务优先于宏任务。
12. 宏任务 vs 微任务区别?
- 宏任务:
setTimeout、setInterval、DOM 事件 - 微任务:
Promise.then、queueMicrotask - 微任务执行优先,执行完同步后立即清空微任务队列。
13. async/await 是如何工作的?
async函数默认返回 Promiseawait会等待 Promise 执行完再继续当前函数的后续代码,不阻塞主线程。
🔹 五、数组与对象操作
14. 如何去重一个数组?
const arr = [1, 2, 2, 3];
const unique = [...new Set(arr)];
15. 一行代码数组扁平化:
[1, [2, [3]]].flat(Infinity)
16. 如何判断一个变量是数组?
Array.isArray(val) // 推荐
🔹 六、原型与继承
17. JS 中继承如何实现?什么是原型链?
- 每个对象都有
__proto__指向其构造函数的prototype,形成原型链。 - 子类可以通过
Object.create()或extends继承父类原型方法。
18. 判断结果:
function A() {}
const a = new A();
a.__proto__ === A.prototype // true
因为 new A() 创建实例时,实例的 __proto__ 自动指向 A.prototype。
🔹 七、其他重要概念
19. 什么是防抖与节流?有何区别?
- 防抖 debounce:n 秒内只触发最后一次,适合输入框搜索。
- 节流 throttle:n 秒内最多触发一次,适合滚动监听。
20. JSON 与 JS 对象的区别?JSON.stringify() / JSON.parse() 的作用?
- JSON 是字符串格式,JS 对象是内存结构
JSON.stringify():对象 → JSON 字符串JSON.parse():JSON 字符串 → 对象