为什么要对Buffer使用JSON.parse(JSON.stringify())?有什么更优实现?
问题原因分析
JSON.parse(JSON.stringify(data)) 对Buffer实例来说完全不是无操作,具体行为如下:
- Node.js 对Buffer类型内置了JSON序列化逻辑,当
data是Buffer实例时,JSON.stringify(data)会输出固定结构的字符串:{"type":"Buffer","data":[字节十进制值组成的数组]} - 再经过
JSON.parse解析后,得到的是一个纯普通JavaScript对象,不再是Buffer实例,仅保留了Buffer的字节内容和标识字段 - 你直接赋值
let dataObject = data时,dataObject还是原Buffer实例,你的后续代码逻辑显然是按普通对象做的处理,类型不匹配就会运行失败。
关于你排查得到data.constructor.name为Object的情况,原生Node.js环境下Buffer实例的constructor.name固定为Buffer,该结果大概率是运行环境的Buffer polyfill、上层封装逻辑修改了构造函数名称导致的。
更清晰的实现方式
根据你的业务场景选择对应方案即可:
- 如果你就是要得到和
JSON.parse(JSON.stringify(data))完全一致的普通对象结构,推荐直接手动构造,性能和可读性都远高于JSON序列化反序列化:let dataObject = { type: 'Buffer', data: Array.from(data) } - 如果你只是需要使用Buffer的内容,直接调用Buffer原生API即可,不需要做额外的类型转换:
- 转UTF-8字符串:
data.toString('utf8') - 转Base64编码:
data.toString('base64') - 直接获取字节数组:
Array.from(data)
- 转UTF-8字符串:
内容的提问来源于stack exchange,提问作者mikemaccana
相关产品推荐
相关产品推荐

