标签: JavaScript开发 2026-02-28 次
最近真是忙得脚不沾地,上周刚接了个老项目重构,这周又帮朋友调Node服务的内存泄漏,手头还攒着三篇技术博客草稿。但每周更新这事儿我没敢断,毕竟码农的碎碎念也算精神食粮😄
所以今儿咱不整虚的,聊聊ES这几年的新活儿。我19年在深圳meet.js峰会上吹过《ES6之后那些没人提但贼好用的玩意儿》,台下坐个大佬散场还拉我聊了半小时模块,现在想想那演讲标题我都记不全了,反正好多特性后来都落地了。
挑几个我用着顺手的唠,不列全,就图个实在。
顶层await这事儿,我当年可栽过跟头。19年那会儿写初始化配置,非得包个async函数,代码跟裹粽子似的:
async function init() {
const config = await fetchConfig();
startApp(config);
}
init();后来看到提案通过,当场把这坨代码删了,直接写:
const config = await fetchConfig(); startApp(config);
爽!以前像穿雨衣打伞,现在直接淋雨(不是),就是少点多余动作。
私有字段#,治好了我的“_privateVarPTSD”。以前大家用下划线假装私有,跟贴“别碰我”标签似的,其实谁都能摸。有次同事手滑改了我代码里的_userId,线上崩了半小时,查日志才发现。现在用class User { #id },类外访问直接报错,跟门上挂了“内有恶犬”似的,踏实。
Error.cause这玩意儿,救过我一次命。上个月排查接口超时,抛出的错跟原始错误八竿子打不着,我对着日志猜了两小时。现在这么写:
throw new Error("加载数据失败", { cause: originalError });错误链跟串糖葫芦似的,一眼看到底,再也不用当侦探了。
Object.hasOwn,专治“手滑党”。以前检查对象属性,得写Object.prototype.hasOwnProperty.call(obj, 'key'),长得跟咒语似的。我老记不住,有次写成obj.hasOwnProperty('key'),结果原型上有个同名方法,直接翻车。现在Object.hasOwn(obj, 'key'),跟喊名字似的,直接明了。
arr.at(-1)取最后一个元素,面试再也不用背绕口令了。以前新人写arr[arr.length - 1],跟说“倒数第一个但得算一下”似的。现在负号一加,arr.at(-1),跟说“倒数第一”一样顺口。我上周教实习生,他眼睛都亮了:“早该这样了!”
ES2023那几个“toX”方法,专治“手贱改原数组”。Array.sort()是个坑王,有次我忘了它会改原数组,排序完发现源数据没了,差点把测试环境搞乱。后来学乖了,每次先克隆再排:[...arr].sort(),跟裹保鲜膜似的。现在arr.toSorted()直接返回副本,省得我多写那一下。
toReversed()、toSpliced()也一样,都是“只动副本不动原主”。上次同事用reverse()把共享数组改了,我俩吵了一架,现在用toReversed(),各玩各的,再也不打架。
findLast()找最后一个匹配元素,不用再倒着走路了。以前得[...arr].reverse().find(fn),跟倒着找钥匙似的别扭。现在arr.findLast(fn),直接说“从后往前瞅”,清楚。
Object.groupBy(),去年帮我少写半页代码。做用户管理按角色分组,用reduce写了半页,还得处理空数组,烦得要死。后来发现Object.groupBy(users, u => u.role),一行搞定,当时激动得差点把咖啡洒键盘上。
Promise.withResolvers(),异步队列神器。以前创建promise还得用闭包存resolve,跟藏私房钱似的麻烦。现在直接解构:
const { promise, resolve, reject } = Promise.withResolvers();跟开盲盒似的,想要啥拿啥。我做消息队列时用这特性,代码少了一半。
可调整大小的ArrayBuffer,搞WebGL的福音。以前处理纹理数据,缓冲区大小固定,动态加载时老出问题,跟穿小鞋跑步似的。现在new ArrayBuffer(8, {maxByteLength:16}),能伸缩,舒服多了。
迭代器助手,大数据集省内存神器。以前map、filter连着用,中间数组堆一堆,内存蹭蹭涨。现在用iterator链式调用:
iterator.map(x => x*2).filter(x=>x>5).take(3).toArray()
懒执行,用到才算,省内存。我处理百万级数据时试过,比数组链快不少。
Set的新方法,求交集终于不用绕远路了。以前[...a].filter(x=>b.has(x)),跟绕远路似的。现在a.intersection(b),跟说“取共同部分”一样清楚。上周重构权限判断,代码少了一半。
RegExp.escape(),防注入救星。有次从用户输入拼正则,没转义特殊字符,直接被注入攻击,线上报警,吓出一身冷汗。现在RegExp.escape(userInput),内置转义,不用自己写那堆replace,安全多了。
Promise.try(),同步异步一把梭。处理可能抛错的函数,以前得分开写try/catch,跟分左右脚穿鞋似的。现在await Promise.try(() => mightThrow()),不管同步异步,统一用Promise管,省心。
Float16Array,机器学习传输快一倍。搞模型部署到浏览器,数据量太大传不动,Float32Array还是占地方。现在16位浮点数,体积小一半,GPU算起来也爽。
回头看看这些年JS的更新,没搞啥大新闻,全是这些小修补。就像家里修水管,不是换整套,而是把漏的地方堵上,慢慢就舒服了。
我现在写代码,越来越觉得“少即是多”——少点裹脚布,多点直球。这些特性看着不起眼,但真能让你每天少敲几行废代码,挺好。