You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中不同Buffer作为JS对象键被判定相等的原因及解决方法

现象产生原因

JavaScript普通对象的键仅支持字符串和Symbol两种类型,当你传入其他类型的值作为键时,JS引擎会隐式调用该值的toString()方法,将返回的字符串作为实际存储的键名。

Buffer实例默认的toString()方法会按照UTF-8编码将二进制内容转成字符串,你给出的两个Buffer中存在不符合UTF-8编码规则的字节序列,这些无效字节在转换时会被统一替换为Unicode替换字符(U+FFFD,显示为�),最终两个内容不同的Buffer转换后得到的字符串完全一致,因此被判定为同一个键,才会出现给buf2赋值、通过buf1也能读到值的现象。
你可以自行执行console.log(buf1.toString() === buf2.toString())验证,返回结果为true。

让不同Buffer作为独立键的实现方案
  • 优先使用ES6原生的Map结构存储键值对。Map的键支持任意JavaScript数据类型,键的相等判定采用SameValueZero规则,不同的Buffer实例哪怕内容接近,只要不是同一个对象引用,就会被识别为独立的键,不需要额外转换。参考代码:
const map = new Map();
map.set(buf2, "jon");
console.log(map.get(buf1)); // 输出undefined,仅map.get(buf2)会返回"jon"
  • 如果必须使用普通对象存储,可以先将Buffer转换为无碰撞的唯一字符串作为键,比如转成十六进制字符串、Base64字符串,不同内容的Buffer转换后得到的字符串一定唯一,不会出现键冲突。参考代码:
const obj = {};
// 转十六进制字符串作为键
obj[buf2.toString('hex')] = "jon";
console.log(obj[buf1.toString('hex')]); // 输出undefined,不会出现串值
  • 如果你需要将内容相同的不同Buffer实例判定为同一个键,直接使用上面提到的转十六进制/Base64字符串的方案即可,相同二进制内容的Buffer转换出的字符串完全一致。

内容的提问来源于stack exchange,提问作者packetie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 05:39:39