可以用arrayBuffer创建二进制对象

const arrayBuffer = new ArrayBuffer(16); //创建16字节长度的二进制对象

console.log(arrayBuffer);
/**
 * ArrayBuffer {
  [Uint8Contents]: <00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00>,
  byteLength: 16
}
 */

要访问arrayBuffer对象需要用到view,view有多种类型比如Uint8Array,Uint16Array,其中的数字代表bit

这种view对象统称为TypeArray,有数组的特征,但不能splice和concat

TypeArray有两个特殊的方法

arr.set(fromArr,[offset]),从offset(默认为0),把fromArr所有元素复制到arr

arr.subArray([begin,end]),创建一个从begin到end(不包括)的视图,有点类似slice,但创建的视图不复制元素

TypeArray可以接受不同的参数

arr(buffer),在二进制对象上创建视图

arr(object),创建一个相同长度的类型化数组,并复制其内容。

arr(typeArray),复制一个类型化数组

arr(number),创建一个长度为number的类型化数组

const arrayBuffer = new ArrayBuffer(16);

const view = new Uint8Array(arrayBuffer);
console.log(view.length); //16
console.log(view.BYTES_PER_ELEMENT); //1
for (let i = 0; i < view.length; i++) {
  view[i] = i;
}
for (const item of view) {
  console.log(item); // 0 1 2 3 ... 15
}
const view2 = new Uint8Array([100, 150, 200]);

view.set(view2);
for (const item of view) {
  console.log(item); // 100 150 200 3 ... 15
}

dataView类型

dataView可以用更灵活的方式访问typeArray

new DataView(buffer)

dataView.getTypeArray(offset)

dataView.setTypeArray(offset)

const view = new Uint8Array([255, 255, 255, 255]);
const dataView = new DataView(view.buffer);
dataView.setUint16(0); //把前16位设为0
for (let i = 0; i < view.length; i++) {
  console.log(dataView.getUint8(i)); //0 0 255 255
}