20200429
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