一、JS
🌟JS 数据类型
number、boolean,string、null、undefind、bigint、symbol
🌟判断类型
- 快速判断基本类型 - typeof (typeof null = undefind)
- 适用所有类型 - object.prototype.tostring()
- 引用类型 - instanceof
Array.isArray()用于数组
🌟类型转换、== 与 ===
- 显式转换:
Number()/String()/Boolean()/parseInt() - 隐式转换:
+ - * / == if判断触发👉 ** falsy 值(6 个)**:0 '' false null undefined NaN
- == 与 === 核心区别
==:先类型转换,再比较值===:不转换类型,类型 + 值都相同才返回 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、循环引用-
- 什么时候用深拷贝? 对象嵌套层级深、需要完全独立修改、避免污染原数据时用深拷贝,比如表单数据、列表数据重置。
-
- JSON 深拷贝有什么缺点?无法拷贝函数、undefined、Symbol,也处理不了循环引用,复杂对象会丢失内容。
🌟防抖 & 节流 (必背)
- 防抖 (debounce): 频繁触发只执行最后一次。场景:搜索输入、窗口 resize、按钮防重复提交。
- 节流 (throttle): 一定时间内只执行一次。场景:滚动加载、拖拽、高频点击。
🌟高频常用方法
- 遍历:
forEachmapfilterreducefindsomeevery - 修改原数组:
pushpopshiftunshiftsplicesortreverse - 不修改:
sliceconcatjoinindexOf