Matriz de búfer
ArrayBuffer
Los objetos son una interfaz para JavaScript para manipular datos binarios. Como especificaciones separadas (publicadas en febrero de 2011), ES6 las incorporó a la especificación ECMAScript. Maneja datos binarios en la sintaxis de una matriz, por lo que se denomina matriz binaria.
Es en este contexto que nacieron las matrices binarias. Permite a los desarrolladores manipular directamente la memoria en forma de subíndices de matriz, lo que mejora en gran medida la capacidad de JavaScript para procesar datos binarios.
Una matriz binaria consta de tres tipos de objetos ArrayBuffer
. TypedArray
En DataView
resumen, los ArrayBuffer
objetos representan datos binarios primitivos, las TypedArray
vistas se usan para leer y escribir tipos simples de datos binarios y DataView
las vistas se usan para leer y escribir tipos complejos de datos binarios.
objeto ArrayBuffer
ArrayBuffer
Un objeto representa una parte de la memoria que almacena datos binarios. No se puede leer ni escribir directamente, solo se puede leer y escribir a través de vistas ( TypedArray
vistas y DataView
vistas). La función de las vistas es interpretar datos binarios en un formato específico.
ArrayBuffer
También es un constructor que asigna un área de memoria contigua donde se pueden almacenar datos. En un área de memoria de 32 bytes, el valor de cada byte es 0 por defecto. Como puede ver, ArrayBuffer
el parámetro del constructor es la memoria requerida (bytes).
const buf = new ArrayBuffer(32);
复制代码
DataView
Para crear una vista, debe proporcionar una ArrayBuffer
instancia de objeto como parámetro. Cree una DataView
vista, luego lea datos binarios de 8 bits desde el principio en formato de entero de 8 bits sin signo, y el resultado es 0, porque el ArrayBuffer
objeto de la memoria sin formato, todos los bits son 0 de forma predeterminada.
const buf = new ArrayBuffer(32);
const dataView = new DataView(buf);
dataView.getUint8(0)
复制代码
TypedArray
Una vista, que DataView
es diferente de una vista, representa un formato de datos diferente, no es un constructor, sino un conjunto de constructores. Entero con signo de 32 bits ( Int32Array
constructor) y entero sin signo de 8 bits ( Uint8Array
constructor). Dado que las dos vistas corresponden al mismo segmento de memoria, si una vista modifica la memoria subyacente, afectará a la otra vista.
const buffer = new ArrayBuffer(12);
const x1 = new Int32Array(buffer);
x1[0] = 1;
const x2 = new Uint8Array(buffer);
x2[0] = 2;
x1[0]
复制代码
ArrayBuffer.isView()
ArrayBuffer
有一个静态方法isView
,返回一个布尔值,表示参数是否为ArrayBuffer
的视图实例。这个方法大致相当于判断参数,是否为TypedArray
实例或DataView
实例。
const buffer = new Int32Array(buffer);
ArrayBuffer.isView(buffer)
复制代码
ArrayBuffer.prototype.slice()
ArrayBuffer
实例有一个slice
方法,允许将内存区域的一部分,拷贝生成一个新的ArrayBuffer
对象。
const buffer = new ArrayBuffer(8);
const newBuffer = buffer.slice(0, 3);
复制代码
slice
方法接受两个参数,第一个参数表示拷贝开始的字节序号(含该字节),第二个参数表示拷贝截止的字节序号(不含该字节)。如果省略第二个参数,则默认到原ArrayBuffer
对象的结尾。
除了slice
方法,ArrayBuffer
对象不提供任何直接读写内存的方法,只允许在其上方建立视图,然后通过视图读写。
ArrayBuffer.prototype.byteLength
ArrayBuffer
实例的byteLength
属性,返回所分配的内存区域的字节长度。
const buffer = new ArrayBuffer(32);
buffer.byteLength
// 32
复制代码
如果要分配的内存区域很大,有可能分配失败(因为没有那么多的连续空余内存),所以有必要检查是否分配成功。