TypedArray
因为JavaScript
中数字是64位浮点数,例如canvas
中获取图片像素值的getImageData
方法,其实一个像素值是8位,却要浪费64位存储,现在可用8位的ArrayBuffer
:
// 创建一个8-byte的ArrayBuffer
var b = new ArrayBuffer(8);
// 创建一个b的引用,类型是Int32,起始位置在0,结束位置为缓冲区尾部
var v1 = new Int32Array(b);
// 创建一个b的引用,类型是Uint8,起始位置在2,结束位置为缓冲区尾部
var v2 = new Uint8Array(b, 2);
// 创建一个b的引用,类型是Int16,起始位置在2,总长度为2
var v3 = new Int16Array(b, 2, 2);
则缓冲和创建的引用布局为:
变量 | 索引 | |||||||
---|---|---|---|---|---|---|---|---|
字节数 | ||||||||
b = | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
索引数 | ||||||||
v1 = | 0 | 1 | ||||||
v2 = | 0 | 1 | 2 | 3 | 4 | 5 | ||
v3 = | 0 | 1 |
Buffer
- 大小固定,V8堆外分配内存,所以其大小在创建时固定后不能改变
- 处理文件流或者二进制流
- 全局变量,无需使用
require('buffer')
- 类似于
JavaScript
中的TypedArray
,Buffer
实例也是Uint8Array
实例
Buffer.from
const buf1 = Buffer.from([15,16,17]);//数组里是16进制表示形式。
console.log(buf1);//<Buffer 0f 10 11>
const arr = new Uint16Array([15,16,17,18]);//数组里是16进制表示形式。
const buf2 = Buffer.from(arr.buffer);//参数为ArrayBuffer或TypedArray.buffer属性
console.log(buf2);//<Buffer 0f 00 10 00 11 00 12 00>//Uint16Array用2个字节存储一个数据
const buf3 = Buffer.from(arr.buffer,2,4);//2表示开始截取的字节索引,4表示截取的字节长度
console.log(buf3);//<Buffer 10 00 11 00>
arr[0] = 3000;
console.log(buf3);//<Buffer 01 00 11 00>,buf2和arr共享内存
const buf4 = Buffer.from('abc');
const buf5 = Buffer.from(buf4);
buf4[0] = 0x41;//10进制65A
console.log(buf4.toString());//Abc
console.log(buf5.toString());//abc
Buffer.alloc(size,fill,encoding)
size
个字节,用encoding
编码的fill
填充,用到Buffer.fill()
Buffer.allocUnsafe(size)
以这种方式创建的 Buffer
实例的底层内存是未初始化的。 新创建的 Buffer
的内容是未知的,且可能包含敏感数据。 可以使用 buf.fill(0)
初始化 Buffer
实例为0
。
若size
不大于Buffer.poolSize
的一半,使用Buffer.allocUnsafe
和废弃的new Buffer
构造器时,Buffer
会预分配Buffer.poolSize
的内部Buffer
实例作为快速分配池,而Buffer.alloc
是不会被分配分配Buffer.poolSize
的。