字符串 · 数组 · 对象 · ES6+ 新特性
每个 API 都有:用法 · 场景 · 参数 · 输出 · 易错点
前端最高频用的字符串方法。模板字符串、replace、split、slice 是日常四大件。
booleanstring[]stringslice:支持负数索引,推荐,字符串数组都能用substring:不支持负数(负数变 0),会自动调换参数顺序substr(start, length):第二个参数是长度,已废弃不推荐string(返回新字符串,原串不变)(match, p1, p2, ..., offset, string) => 新值。p1/p2 是捕获组,用得最多。/g 返回所有匹配;不带返回第一个匹配+捕获组详情stringbooleannumber 索引;找不到返回 -1string数组方法是前端面试的绝对核心。map / filter / reduce 三件套必须形成肌肉记忆。
(item, index, array) => 新值新数组(长度和原数组相同,不修改原数组)(item, index, array) => boolean(true 保留)新数组(长度可能小于原数组).filter(Boolean) 去除所有假值,是去除 null/undefined/空串的常用简写。(累加器, 当前元素, 索引, 数组) => 新累加器;初始值单个值(类型取决于初始值){},转数组用 []。(item, index, array) => boolean(item, index, array) => booleanboolean(短路求值:some 遇到 true 就停,every 遇到 false 就停)[].every() 返回 true(空真),使用前要先判空。这是面试常考的坑。(item, index, array) => voidundefined(不能链式调用)Infinity 压到底Infinity 压到底arr.map(fn).flat(),但只遍历一次、性能更好(item, index, array) => 数组或值(返回数组会被拆开)| 方向 | 本质 | 用 flatMap? | 用什么 |
|---|---|---|---|
| 树 → 扁平列表(拍平) | 展开 / 拆嵌套 | ✅ 合适 | flatMap + 递归,或 flat |
| 扁平列表 → 树(建树) | 聚合 / 找爸爸挂上去 | ❌ 不行 | Map 建索引 O(n) |
| 场景 | 用 flat | 用 flatMap |
|---|---|---|
| 已经拿到嵌套数组,只想压平 | ✅ arr.flat(Infinity) | — |
| 一边 map 一边拍平 | — | ✅ arr.flatMap(fn) |
| 要压两层以上 | ✅ flat(n) | ❌ 只能一层 |
| map 回调返回多个值(一对多) | — | ✅ 最合适 |
Array.from({length:n}, (_, i) => i) 是生成 [0,1,...,n-1] 的标准写法,必记。(a, b) => 负数|0|正数。<0 a 前,>0 b 前,=0 不变[...arr].sort()。Object.keys/values/entries 三件套 + assign/fromEntries,是对象操作的核心。
[[k, v], ...] 或 Map、URLSearchParams新对象booleanin 会查原型链(包括继承);hasOwnProperty 只看自身。遍历对象时用 hasOwnProperty 更安全。ES6 最实用特性之一。函数参数、接口数据处理、配置读取全靠它。
const [a, b] = arr,配合默认值 [a, b=10]=arr 和 rest [first, ...rest]=arrundefinedconst {name, age} = obj;重命名 {name:userName};默认值 {age=18};rest {id, ...rest}undefined(有默认值时用默认){ data = [] } = res,能优雅地处理接口返回空值,避免 undefined 报错。现代异步编程基础。async/await 是 ES2017 引入的语法糖,但底层仍是 Promise。
| 方法 | 行为 | 全部成功 | 有一个失败 |
|---|---|---|---|
Promise.all | 全部成功才成功 | ✅ 返回结果数组 | ❌ 立即 reject |
Promise.allSettled | 等全部完成(无论成败) | ✅ 返回 [{status:'fulfilled', value}] | ✅ 返回 [{status:'rejected', reason}] |
Promise.race | 第一个完成(无论成败) | ✅ 返回第一个的结果 | ❌ 返回第一个的失败 |
Promise.any | 第一个成功 | ✅ 返回第一个成功结果 | ❌ 全失败才报 AggregateError |
async 标记函数(返回 Promise),await 暂停等待 Promise 完成let/const、箭头函数、Set/Map、Proxy、class 等。
| 特性 | var | let | const |
|---|---|---|---|
| 作用域 | 函数作用域 | 块级作用域 {} | 块级作用域 {} |
| 变量提升 | ✅ 提升且初始化为 undefined | ❌ 暂时性死区(TDZ) | ❌ 暂时性死区 |
| 重复声明 | ✅ 允许 | ❌ 报错 | ❌ 报错 |
| 可重新赋值 | ✅ | ✅ | ❌(引用不可变,属性可变) |
| 挂到 window | ✅(浏览器) | ❌ | ❌ |
const,需要重新赋值才用 let,永远不要用 var。(参数) => { 函数体 };单行可省略 return;单参数可省略括号;返回对象要 () => ({...})_(如 1_000_000);Number.isInteger/isFinite/isNaN 等静态方法现代前端项目高频使用的较新 API,面试加分项。
Cannot read property of undefineda && a.b && a.b.c 简化为 a?.b?.c。前端取后端数据几乎是必用的 API。n,或 BigInt(字符串)bigint 类型(不能与普通 Number 直接运算)stringJS 隐式类型转换是面试必考。核心规则:+ 拼接、== 比较、if 判断。
| 场景 | 规则 | 示例 |
|---|---|---|
| 转 Boolean | 6 个 falsy:false/0/''/null/undefined/NaN | Boolean('') → false |
| + 拼接 | 有字符串就全转字符串 | '1' + 2 → '12' |
| 数学运算 | - * / 都转数字 | '10' - 5 → 5 |
| == 比较 | 不同类型会转换后比较 | 1 == '1' → true |
| === 比较 | 不转换,类型不同直接 false | 1 === '1' → false |
| if 判断 | 转 Boolean | if (0) → false 分支 |
| 表达式 | 结果 | 原因 |
|---|---|---|
null == undefined | true | 规定相等(仅此一对) |
null == 0 | false | null 只和 undefined 相等 |
NaN == NaN | false | NaN 和谁都不等(包括自己) |
1 == '1' | true | 字符串转数字 |
0 == false | true | false 转 0 |
0 == '' | true | 空串转 0 |
'' == false | true | 都转 0 |
[] == false | true | [] 转空串再转 0 |
[] == ![] | true | JS 最经典坑题 |
x == null(能同时匹配两者)。这是社区共识。