面试JS

1 阅读3分钟

一、JS

🌟JS 数据类型

number、boolean,string、null、undefind、bigint、symbol

🌟判断类型
  1. 快速判断基本类型 - typeof (typeof null = undefind)
  2. 适用所有类型 - object.prototype.tostring()
  3. 引用类型 - instanceof
  4. Array.isArray() 用于数组
🌟类型转换、== 与 ===
  • 显式转换:Number() / String() / Boolean() / parseInt()
  • 隐式转换:+ - * / == if判断 触发👉 ** falsy 值(6 个)**:0 '' false null undefined NaN
  1. == 与 === 核心区别
  • ==先类型转换,再比较值
  • ===不转换类型,类型 + 值都相同才返回 true
  • 面试坑点:NaN == NaN → false,判断用 Number.isNaN()
🌟作用域
  • 全局作用域 / 函数作用域 / 块级作用域(let/const
  • 作用域链:内部函数可访问外部变量,逐级向上查找
🌟var、let、const区别

var 有变量提升、无块级作用域、可重复声明;let 有块级作用域、存在暂时性死区、不可重复声明;const 必须初始化,值不能重新赋值,但引用类型可改内部属性。

🌟闭包

函数嵌套函数,内部函数访问外部函数变量,形成闭包。

  • 作用: 缓存私有变量、避免全局污染、实现防抖节流、模块封装。
  • 缺点: 可能导致内存泄漏,需及时释放(置为 null)。
🌟this 指向
  • 普通函数调用 → window/undefined
  • 对象方法调用 → 对象本身。
  • 构造函数 → 实例。
  • call/apply/bind → 强制改变this指向(第一个参数)。
  • 箭头函数 → 继承外层作用域的 this,无自身 this项目应用: 箭头函数解决回调中 this 丢失问题。
🌟原型与原型链

每个对象都有 __proto__,指向其构造函数的 prototype。原型链是对象通过 __proto__ 向上查找属性 / 方法的链条,最终指向 Object.prototype,再往上是 null

🌟事件循环 (EventLoop)

JS 是单线程语言,为了实现异步,就有了事件循环机制。执行顺序是:先执行同步代码,再清空微任务队列,然后去执行一个宏任务,之后再检查并清空微任务,如此循环。 其中:

  • 微任务常见的有:Promise.then/catch /finally、await 后面的代码
  • 宏任务常见的有:setTimeout、setInterval、script 整体代码、UI 渲染

简单总结就是:同步优先 → 微任务其次 → 宏任务最后

🌟Promise & async/await

Promise 是 ES6 提供的异步处理方案,主要解决回调地狱问题。它有 pending、fulfilled、rejected 三种状态,通过 then 和 catch 处理结果。async/await 是基于 Promise 的语法糖,让异步代码写法更接近同步,可读性更强。async 用来声明异步函数,await 会暂停执行,等待 Promise 完成。实际开发中,我处理接口请求、异步流程基本都用 async/await,配合 try/catch 做错误处理,代码更简洁、更好维护。

🌟浅拷贝 vs 深拷贝
  • 浅拷贝只复制一层,深层引用共享;深拷贝完全复制所有层级,新旧对象互不影响。
  • 浅拷贝用 Object.assign 或展开语法,深拷贝用 JSON 方式或递归实现。
  • 常见浅拷贝:Object.assign、展开运算符 ...、数组的 slice/concat
  • 常见深拷贝:JSON.parse(JSON.stringify(obj))、递归深拷贝、第三方库如 lodash.cloneDeep
  • JSON 方式缺点:不能拷贝函数、undefined、Symbol、循环引用
    1. 什么时候用深拷贝? 对象嵌套层级深、需要完全独立修改、避免污染原数据时用深拷贝,比如表单数据、列表数据重置。
    1. JSON 深拷贝有什么缺点?无法拷贝函数、undefined、Symbol,也处理不了循环引用,复杂对象会丢失内容。
🌟防抖 & 节流 (必背)
  • 防抖 (debounce): 频繁触发只执行最后一次。场景:搜索输入、窗口 resize、按钮防重复提交。 image.png
  • 节流 (throttle): 一定时间内只执行一次。场景:滚动加载、拖拽、高频点击。

image.png

🌟高频常用方法

  • 遍历:forEach map filter reduce find some every
  • 修改原数组:push pop shift unshift splice sort reverse
  • 不修改:slice concat join indexOf