首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >五个你必须知道的 JavaScript 现代编码技巧

五个你必须知道的 JavaScript 现代编码技巧

作者头像
佛系豪豪吖
发布2026-06-22 21:11:59
发布2026-06-22 21:11:59
1420
举报

## 五个你必须知道的 JavaScript 现代编码技巧

在日常前端开发中,JavaScript 新特性层出不穷。很多开发者用了多年 `if (obj.prop)` 和 `map.filter().reduce()`,却不知道 ES2024+ 已经悄悄带来了诸多提升开发体验的实用 API。今天我就来分享五个经得起实战检验的现代 JS 技巧。

### 1. `Promise.withResolvers()` — 不再需要手动存 reject 引用

过去,如果你需要在函数外部 resolve 一个 Promise,得这样写:

```javascript let resolve, reject const p = new Promise((res, rej) => { resolve = res reject = rej }) // 现在可以在外部调用 resolve/reject ```

ES2024 引入的 `Promise.withResolvers()` 彻底简化了这个模式:

```javascript const { promise, resolve, reject } = Promise.withResolvers()

// 在任意地方 resolve setTimeout(() => resolve('完成!'), 1000) // 直接 await,不用再纠结闭包 const result = await promise ```

这在事件驱动编程、「一次触发」锁、WebSocket 连接管理等场景中尤其好用。

### 2. `Object.groupBy()` 和 `Map.groupBy()` — 告别手动分组循环

后端返回的数据经常需要按某个字段分组。以前我们写:

```javascript const users = [ { role: 'admin', name: '张三' }, { role: 'user', name: '李四' }, { role: 'admin', name: '王五' }, ] const grouped = {} users.forEach(u => { ;(grouped[u.role] ??= []).push(u) }) ```

现在一个调用搞定:

```javascript const grouped = Object.groupBy(users, u => u.role) // { admin: [{…}, {…}], user: [{…}] } ```

如果需要 `Map` 结果(保留 key 类型),用 `Map.groupBy()`:

```javascript const map = Map.groupBy(users, u => u.role) ```

### 3. `structuredClone()` — 深拷贝不再依赖 JSON hack

`JSON.parse(JSON.stringify(obj))` 曾是深拷贝的「标准答案」,但它丢失 `undefined`、`Function`、`Date`、`RegExp`、循环引用… 坑非常多。

`structuredClone` 是浏览器原生支持的深拷贝 API:

```javascript const original = { name: '云宝', date: new Date(), nested: { arr: [1, 2, 3] }, // 甚至支持循环引用 } const clone = structuredClone(original) ```

它支持 `Map`、`Set`、`ArrayBuffer`、`TypedArray` 等几乎所有内置类型,是名副其实的「深度克隆终结者」。

### 4. 可选链 (`?.`) 与空值合并 (`??`) 的最佳实践

虽然这两个不算新了,但很多人还没用对它们的组合。

```javascript //

错误 const name = user && user.profile && user.profile.name || '匿名'

//

正确 const name = user?.profile?.name ?? '匿名' ```

区别很大:`||` 会把 `''`、`0`、`false` 都当作假值处理,而 `??` 只处理 `null` / `undefined`。高阶用法:

```javascript // 动态调用方法 const result = methods[type]?.call?.(this, args) ?? fallback ```

### 5. `at()` 方法 — 用负索引访问数组末尾

想取数组最后一个元素?以前:

```javascript const last = arr[arr.length - 1] ```

现在:

```javascript const last = arr.at(-1) // 倒数第一个 const secondLast = arr.at(-2) // 倒数第二个 ```

同样的语法也支持字符串:

```javascript '云宝'.at(-1) // '宝' ```

简洁、可读性强,尤其在处理栈或队列结构时非常顺手。

### 小结

以上五个技巧覆盖了 Promise 管理、数据处理、对象拷贝、安全访问和索引操作,每一个都能在日常编码中减少样板代码、规避隐蔽 bug。现代 JavaScript 正变得越来越「开发者友好」——别让这些好用的 API 只躺在 MDN 文档里吃灰。

*本文由云宝 AI 助手撰写,参考腾讯云开发者社区前端技术分享,实践于 [佛系豪豪吖 - 个人技术博客](https://blog.rmzdb.cloud)*

本文为作者原创,未经授权禁止转载、洗稿、搬运。如需引用请保留原文链接。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-06-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档