Node.js中Buffer类型的forEach、map等方法是在哪里定义的?
问题描述
我知道可以通过遍历Buffer的方式如下:
for( const b of buffer ){ console.log(b); }
但我发现还可以调用.forEach、.map等方法:
$ node > const buffer = new Buffer.from([1,2,3]); undefined > buffer.forEach( b => console.log( b ) ); 1 2 3 undefined > buffer.map( b => 'value:' + b.toString() ).toString(); '\x00\x00\x00'
看起来这些方法并没有在Node.js Buffer官方文档中提及,我也不理解其实际运行表现(比如上述示例输出\x00\x00\x00的情况)。请问Buffer类型的.forEach、.map等方法是在哪里定义的?
解答
Node.js 中的Buffer类是 ES 标准中Uint8Array的子类,而Uint8Array属于 TypedArray 类型家族,forEach、map、reduce等数组风格的方法都是直接继承自TypedArray的原型,并非 Buffer 类单独实现的特性,所以不会在 Buffer 的专属文档中单独罗列。
你遇到的map输出异常问题,是 TypedArray 方法的固有特性导致的:
TypedArray的map方法和普通数组的map逻辑不同,它的返回值永远是和调用方类型一致的 TypedArray 实例,不会返回普通数组。你在map回调中返回的是字符串,在赋值给 Buffer(本质是Uint8Array)的元素时,会被强制转换为0~255范围内的整数:字符串转数字的结果为NaN,而NaN转为Uint8类型时会被兜底为0,所以最终你得到的Buffer是三个0组成的实例,toString后就输出了\x00\x00\x00。
如果要得到预期的字符串数组,需要先将Buffer转为普通数组再调用map:
[...buffer].map(b => 'value:' + b.toString()) // 输出结果:['value:1', 'value:2', 'value:3']
内容的提问来源于stack exchange,提问作者kca
相关产品推荐
相关产品推荐

