satgo1546’s ocean

Any sufficiently primitive magic is indistinguishable from technology.

慢报:Uint8Array.{from,prototype.{to,setFrom}}{Hex,Base64}将于Chrome 140实装

继Firefox和Safari去年年底实装此功能后,Uint8Array to/from base64 and hex提案即将在所有主流浏览器中可用。

在此之前,JavaScript中编解码Base64一直没有高效的方法。原生的atob和btoa操作对象为[\0-ÿ]字符串,与Uint8Array之间转换的开销甚至可能超过Base64编解码本身。

滥用data URL相关的平台功能更快——无论是运行速度还是代码长度:

// 编码
(await new Promise(r => Object.assign(new FileReader, {onload: r}).readAsDataURL(new Blob([new Uint8Array(1)])))).target.result.slice(37)
// 解码
new Uint8Array(await (await fetch('data:;base64,AA==')).arrayBuffer())

可惜这种方式编解码都要求异步。

结果,对于短小的数据,最高效的方法还是抛弃平台功能,手写编解码器。

新加的Base64方法还支持URL字符集(-代替+_代替/的那套,不支持自定义字符集),也支持省略尾缀等号。只是选项语法实在啰嗦,到头来也没省几个字。

.toBase64().replace(/-/g, '+').replace(/_/g, '/').replace(/=/g, '')
.toBase64({ alphabet: 'base64url', omitPadding: true })

这种其他语言内置不知道多少年的功能,怎么到了JS就成了最新最热草案呢?

在GitHub上查看和发表评论