记录下V8的数据结构。

ArrayBuffer

用于表示通用的原始二进制数据缓冲区。其为字节数组(bytearray)。不能直接操作ArrayBuffer内容,而是要通过类型化数组对象或DataView对象来操作,它们会将缓冲区中的数据表示为特定的格式,并通过这些格式来读写缓冲区内容。

创建ArrayBuffer

1
2
3
// 创建8字节缓冲区,并使用Int32Array视图引用
const buffer = new ArrayBuffer(8);
const view = new Int32Array(buffer);

操作ArrayBuffer

要操作ArrayBuffer内容,需要使用视图对象。视图对象不存储任何数据,它只是对ArrayBuffer中字节的解释。例如Uint8Array将每个字节视为独立的数字。

1
2
3
4
5
6
let buffer = new ArrayBuffer(16);
let view = new Uint32Array(buffer);
view[0] = 123456;
for(let num of view) {
console.log(num); // output: 123456, 0, 0, 0
}

DataView

DataView是一个特殊的“无类型”视图,其允许在任何偏移量以任何格式访问数据。与类型化数组不同,DataView的构造函数不指定格式,而是在方法调用时指定。

1
2
3
4
5
let buffer = new Uint8Array([255, 255, 255, 255]).buffer;
let dataView = new DataView(buffer);
console.log(dataView.getUint8(0)); // 255
console.log(dataView.getUint16(0)); // 65535
console.log(dataView.getUint32(0)); // 42...

DataView非常适合在同一缓冲区中存储混合格式数据。

JSArray

JSArray对象的结构如下:

1
2
3
4
5
6
struct JSArray {
map: Map,
properties_or_hash: Object,
elements: Object,
length: Number,
}

map可以看作JSArray对象的vtable(JS Prototype)。