20 道 JavaScript 基础面试题及标准答案


✅ JavaScript 基础面试题(题目 + 答案)


🔹 一、基础语法与数据类型


1. ===== 的区别?

  • == 是宽松比较,会进行类型转换后再比较值。
  • === 是严格比较,值和类型都必须相等

2. JavaScript 有哪些数据类型?基本类型和引用类型的区别?

  • 基本类型(Primitive):numberstringbooleanundefinednullbigintsymbol
  • 引用类型(Reference):object(包括 ArrayFunctionDate 等)
  • 区别:基本类型按值存储,引用类型按地址存储,比较时引用类型是比较内存地址。

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. bindcallapply 的区别?

  • 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 微任务区别?

  • 宏任务:setTimeoutsetInterval、DOM 事件
  • 微任务:Promise.thenqueueMicrotask
  • 微任务执行优先,执行完同步后立即清空微任务队列。

13. async/await 是如何工作的?

  • async 函数默认返回 Promise
  • await 会等待 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 字符串 → 对象

搞懂Symbol类型

文明人的定义和标准

评 论
请登录后再评论