Buffer

阅读 1.7k

无论是在前端处理文件时,还是在Node.js中查阅相关API时,都会发现一个有趣的东西:Buffer,那么,到底什么是Buffer呢?

构造Buffer

简单说,Buffer就像一个存储字节的数组,主要用于操作字节,我们先来看看如何构造Buffer,一共有三种方法,先来看方法一

const buf1 = Buffer.alloc(10) // 10个字节的buffer, 默认值为0
const buf2 = Buffer.alloc(10, 254) // 10个字节的buffer, 每个值都填充为指定的fe(即254)
console.log(buf1)
console.log(buf2)
console.log(buf1.length)

控制台打印结果为:

<Buffer 00 00 00 00 00 00 00 00 00 00>
<Buffer fe fe fe fe fe fe fe fe fe fe>
10

因为一个字节为8位,用一个十六进制表示4位,所以,每个值在里面都用两个十六进制来表示,0表示为00,254表示为十六进制的fe。

再来看看第二种方式

const buf3 = Buffer.allocUnsafe(10)
buf3.fill(12)
console.log(buf3)

这种方式速度上比第一种方式要快一点,但请注意⚠️,这种方式创建的Buffer实例可能会包含旧数据,所以,在使用前记得用fill()write()方法来对它进行填充,否则,你可能会得到一些意想不到的数据。

既然说它像数组,那么其创建方式是否有一种和数组很像呢?没错,数组有from()方法,来看第三种方式

const buf4 = Buffer.from([11, 22, 33])
console.dir(buf4)

打印结果如下:

Buffer(3) [Uint8Array] [ 11, 22, 33 ]

注意,和前两种方式不同,这种方式的结果是以数组的方式打印出来的。

和ArrayBuffer的关系

从上面的第三种创建方式的打印结果来看,是不是有点眼熟?没错,其底层用的正是ArrayBuffer,且其内存分配大小为8k(由底层分配),通过上面方式创建出的Buffer对象,继承自Uint8Array,和用定型数组(如Int8Array、Int16Array等)创建的定型数组是非常相似的,所以,它的使用方式也和定型数组类似:

const buf4 = Buffer.from([11, 22, 33])
const buf5 = buf4.map((v) => v * 2)
console.dir(buf5)

因此,普通数组的很多方法,比如sort()、map()、filter()、find()、reverse()、indexof()、forEach()等方法,它也都可以使用。

参考

最后编辑于: 2022-06-25

评论(0条)

(必填)
复制成功