慢报: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就成了最新最热草案呢?