ArrayBuffer
ArrayBuffer 对象用来表示通用的、固定长度的原始二进制数据缓冲区。
它是一个字节数组,通常在其他语言中称为“byte array”。你不能直接操作 ArrayBuffer 中的内容;而是要通过类型化数组对象或 DataView 对象来操作,它们会将缓冲区中的数据表示为特定的格式,并通过这些格式来读写缓冲区的内容。
静态方法
ArrayBuffer.isView()
如果 arg 是 ArrayBuffer 视图之一,则返回 true,例如类型化数组对象或者DataView。否则返回 false。
实例属性
ArrayBuffer.prototype[@@toStringTag]
@@toStringTag 属性的初始值是 "ArrayBuffer" 字符串。用于判断ArrayBuffer的类型、类型化数组对象和DataView上也有此属性
ArrayBuffer.prototype.byteLength
返回一个新的 ArrayBuffer,它的内容是该 ArrayBuffer 从 begin(包括)到 end(不包括)字节的拷贝。如果 begin 或 end 是负数,它则指的是从数组末尾开始的索引,而不是从头开始的索引。
示例
var buf = new ArrayBuffer(8);
var buf1 = new Int8Array(buf);
var buf2 = new DataView(buf);
console.log(ArrayBuffer.isView(buf)); // false
console.log(ArrayBuffer.isView(buf1)); //true
console.log(ArrayBuffer.isView(buf2)); //true
console.log(buf[Symbol.toStringTag]); // ArrayBuffer
console.log(buf1[Symbol.toStringTag]);// Int8Array
console.log(buf2[Symbol.toStringTag]);// DataView
console.log(buf.byteLength); // 8
console.log(buf1.byteLength); // 8
console.log(buf2.byteLength); // 8
var buf3 = buf.slice(1, 3); // begin end
var buf4 = new Int8Array([4,5,6])
console.log('buf4', buf4);
console.log('buf4.buffer', buf4.buffer);
TypedArray
一个 TypedArray 对象描述了底层二进制数据缓冲区的类数组视图。没有称为 TypedArray 的全局属性,也没有直接可用的 TypedArray 构造函数。但是,有很多不同的全局属性,其值是指定元素类型的类型化数组构造函数
| 类型 | 值范围 | 字节大小 | 描述 | Web IDL 类型 | 等价的 C 类型 |
|---|---|---|---|---|---|
Int8Array | -128 到 127 | 1 | 8 位有符号整型(补码) | byte | int8_t |
Uint8Array | 0 到 255 | 1 | 8 位无符号整型 | octet | uint8_t |
Uint8ClampedArray | 0 到 255 | 1 | 8 位无符号整型(一定在 0 到 255 之间) | octet | uint8_t |
Int16Array (en-US) | -32768 到 32767 | 2 | 16 位有符号整型(补码) | short | int16_t |
Uint16Array | 0 到 65535 | 2 | 16 位无符号整型 | unsigned short | uint16_t |
Int32Array | -2147483648 到 2147483647 | 4 | 32 位有符号整型(补码) | long | int32_t |
Uint32Array | 0 到 4294967295 | 4 | 32 位无符号整型 | unsigned long | uint32_t |
Float32Array | -3.4E38 到 3.4E38 并且 1.2E-38 是最小的正数 | 4 | 32 位 IEEE 浮点数(7 位有效数字,例如 1.234567) | unrestricted float | float |
Float64Array | -1.8E308 到 1.8E308 并且 5E-324 是最小的正数 | 8 | 64 位 IEEE 浮点数(16 位有效数字,例如 1.23456789012345) | unrestricted double | double |
BigInt64Array | -263 到 263 - 1 | 8 | 64 位有符号整型(补码) | bigint | int64_t (signed long long) |
BigUint64Array (en-US) | 0 到 264 - 1 | 8 | 64 位无符号整型 | bigint | uint64_t (unsigned long long) |
补充知识:
一字节(byte=8位2进制);(1Byte=8Bit)
8位有符号整型:最大值: 01111111 = 1+2+4+8+16+32+64 = 127;
8位无符号位整型:最大值: 011111111 = 1+2+4+8+16+32+64+128 = 255;\
对字符串进行编码解码
const unicodeString = "hello,world,你好世界";
// 对字符串进行unicode编码
function encodeByUnicode(str){
const unicodeArray = [];
for(let i = 0; i < str.length; i++) {
unicodeArray.push(str.charCodeAt(i))
}
return unicodeArray;
}
// 解析
function parse(buffer, begin, length) {
const buf = new Uint16Array(buffer.slice(begin, length));
return String.fromCharCode(...buf);
}
const unicodeArray = encodeByUnicode(unicodeString);
console.log('encodeByUnicode', unicodeArray);
console.log('encodeByUnicode.length', unicodeArray.length);
const unit16ArrayBuffer = new Uint16Array(unicodeArray);
console.log(parse(unit16ArrayBuffer, 0, 1)); // h
console.log(parse(unit16ArrayBuffer, 1, 2)); // e
console.log(parse(unit16ArrayBuffer, 2, 3)); // l
console.log(parse(unit16ArrayBuffer, 3, 4)); // l
console.log(parse(unit16ArrayBuffer, 4, 5)); // o
console.log(parse(unit16ArrayBuffer, 5, 6)); // ,
console.log(parse(unit16ArrayBuffer, 6, 7)); // w
console.log(parse(unit16ArrayBuffer, 7, 8)); // o
console.log(parse(unit16ArrayBuffer, 8, 9)); // r
console.log(parse(unit16ArrayBuffer, 9, 10)); // l
console.log(parse(unit16ArrayBuffer, 10, 11)); // d
console.log(parse(unit16ArrayBuffer, 11, 12)); // ,
console.log(parse(unit16ArrayBuffer, 12, 13)); // 你
console.log(parse(unit16ArrayBuffer, 13, 14)); // 好
console.log(parse(unit16ArrayBuffer, 14, 15)); // 世
console.log(parse(unit16ArrayBuffer, 15, 16)); // 界
console.log('全部解码:', String.fromCharCode(...unicodeArray));