20200429

@xiaojingzhao

Plan

  • 你不知道的 js -- 下卷

Notes

Typed Array

大小端(Endianness) -- 字节顺序,端序或尾序

定义: 多字节数据的排列顺序是从左往右还是从右往左。

大端序: 以 8bit 为单位

地址增长方向 -- 从左往右

... 0x0A 0x0B 0x0C 0x0D ...

0x0A 是最高位字节, 存储在最低的内存地址处。下一个字节 0x0B 存在后面的地址处

小端序:

以 8bit 为单位。

地址增长方向 -- 从左往右

... 0x0D 0x0C 0x0B 0x0A ...

最低位字节是 0x0D 存储在最低的内存地址处。后面字节依次存在后面的地址处。

大小端 in JS

function litterEndian() {
  var buf = new ArrayBuffer(2);
  new DataView(buf).setInt16(0, 256, true);
  return new Int16Array(buffer)[0] === 256;
}

多视图

var buf = new ArrayBuffer(2);
var view8 = new Uint8Array(buf);
var view16 = new Uint16Array(buf);

view16[0] = 3085;
view8[0]; // 13 -- 00001101
view8[1]; // 12 -- 00001100

// 3085 -- 小端表示 0000110100001100

// 交换

[view8[0], view8[1]] = [view8[1], view8[0]];
view16[0]; // 3340

访问不同部分的 buffer

一个二进制 buffer, 由 2 个字节数字,两个 1 字节数字和 32 位浮点数组成:

var first = new Uint16Array(buf, 0, 2)[0];
var sec = new Uint8Array(buf, 2, 1)[0];
var third = new Uint8Array(buf, 3, 1)[0];
var fourth = new Float32Array(buf, 4, 4)[0];

这样可以分别访问这个 buffer 的不同部分。

带类数组构造器

支持:

  • [constructor](length) 新建长度为 length 的 buffer 上创建一个新视图
  • [constructor](typedArr) 创建新视图和 buffer,并把 typedArr 复制进去
  • [constructor](obj) 创建新的视图和 buffer,并在类数组或对象 obj 上迭代复制其内容

带类数组构造器:

  • Int8Array, Uint8Array -- 有符号/无符号 整型
  • Int16Array, Uint16Array
  • Int32Array, Uint32Array
  • Float32Array
  • Float64Array

More