ECMAScript 2025 的新特性
包含了:
- 正则表达式支持了
|来分割多个替代项,可以理解为或 - 正则表达式可以给模式子集添加标识(i、m 等等),
/^(?i:bearer) abc$/就表示 RegExp.escape()来处理正则表达式字符串的转义- bearer 忽略大小写
- 新增 Set 方法,包括
intersection、union、difference、symmetricDifference、isSubsetOf、isSupersetOf和isDisjointFrom - 支持导入 JSON,
with { type: "json" } - 迭代器支持
map()、filter()等等类似数组操作的方法 Promose.try()是一个同步、异步包装器Float16Array支持。
实时在线的 1000 * 1000 个国际象棋棋盘游戏是如何实现的
作者开发了一个大型多人在线实时的国际象棋游戏,界面上同时存在 1000*1000 个棋盘,非常的震撼,你可以想象,上千名玩家同时在这个巨大的棋盘中实时游玩,而游戏仅仅运行在世界某个角落的一块 CPU 中。
这里面带来了非常多的技术问题:带宽、单进程架构、高性能、低延迟,还有后端状态管理、数据分发、乐观回滚等等一系列技术问题。
该项目的架构核心是一种在内存、计算和带宽三者之间的精妙权衡。它选择多用内存(512MB 的密集数组)来换取更快的计算(缓存友好的连续读取),并通过更复杂的服务器端逻辑(Zone 管理、数据分发)和客户端逻辑(Rollback Netcode)来最大程度地节省带宽和优化用户体验。这体现了"针对特定访问模式进行深度优化"的设计思想。
这些技术思想可以运用在:多人在线协作工具、大型沙盒游戏等等场景中。
项目源码:https://github.com/nolenroyalty/one-million-chessboards 在线游玩:https://onemillionchessboards.com/
JavaScript 字符串 slice() 方法的弊端
String.prototype.slice() 方法在处理包含复杂 Unicode 字符(如 Emoji)的字符串时存在的严重隐患。
你可以尝试一下 '🇨🇳中国'.slice(0, 2) 得到的结果,并不是 🇨🇳中 ,而是 🇨
因为 🇨🇳 由 🇨 和 🇳 组成,而 🇨 和 🇳 分别由两个代码单元 (Code Unit) 组成。
这里有四个关键概念:
- 码点 (Code Point):Unicode 为每个字符分配的唯一编号,如 'a' 是
U+0061,'🙂' 是U+1F642。 - 代码单元 (Code Unit):JavaScript 字符串使用 UTF-16 编码,其基本存储单位是16位的代码单元。一些简单的字符(如 'a')用一个代码单元表示,而复杂的字符(如许多 Emoji)则需要两个代码单元(即"代理对")来表示。
- 代理对 (Surrogate Pair):UTF-16 中用于表示超出基本多文种平面(BMP)的码点的一种机制。它使用两个16位的代码单元来共同表示一个码点。许多 Emoji 和不常用字符都通过代理对实现。
- 字形簇 (Grapheme Cluster):用户眼中看到的一个完整字符,可能由多个码点组合而成(如
e + ´ = é)。
轻松学习 SVG
这大概是我见过最友好的学习 SVG 的文章了。大家肯定用的非常多,但是 SVG 上面的属性、数字代表什么含义却很难摸清。 这篇文章你能找到答案,而且还有动画的内容讲解。
你对 Date 类了解多少
Date 类的测试题,我一大半都没有答对,简直丧心病狂。
es-toolkit: lodash 的直接替代品
es-toolkit 其实已经出来有一段时间了,现在他 100% 兼容了 lodash 的 api,可以直接取代 lodash。 比 lodash 块 2-3倍,体积缩小 97%。