Node.js API实例讲解——类型化数组
类型化数组
ArrayBuffer对象是HTML5标准,也就说明在浏览器和node.js都能使用。
表示二进制数据的原始缓冲区,该缓冲区用于存储各种类型化数组的数据。 无法直接读取或写入 ArrayBuffer,但可根据需要将其传递到类型化数组或 DataView 对象 来解释原始缓冲区。
创建ArrayBuffer对象
var buf = new ArrayBuffer(8);
不能像Buffer对象那样操作它,那么如何读与写呢?答案就是ArrayBuffer针对不同的类型定义了相关类,通过这些类实例化对象对其进行操作。这些个类型虽然名字和Buffer定义的读写方法名不完全一致,但仔细观察会发现,都是可以对号入座的。
类型化数组类型表示可编制索引和操纵的 ArrayBuffer 对象 的各种视图。这些个类包括:Int8Array 、Uint8Array 、Int16Array 、Uint16Array 、Int32Array 、Uint32Array 、Float32Array 、64Array
例1. 创建的buf内部有8个bytes,我们想让第二个字节储存12,代码如下。
var buf = new ArrayBuffer(8); console.log(buf);
打印结果是
{ '0': 0, '1': 0, '2': 0, '3': 0, '4': 0, '5': 0, '6': 0, '7': 0, slice: [Function: slice], byteLength: 8 }
用无符号8位整数类型数组包装ArrayBuffer对象。
// 用无符号8位整数类型数组包装ArrayBuffer对象 var arr = new Uint8Array(buf,1,1); // 设置arr视图的第一个byte,也就是buf的第二个byte为12 arr.set(0,12); console.log(buf);
打印结果是:
{ '0': 0, '1': 12, '2': 0, '3': 0, '4': 0, '5': 0, '6': 0, '7': 0, slice: [Function: slice], byteLength: 8 }
类型数组具有的构造方法
new XXXArray( length ); 参数length , 指定数组的长度。
例
var int8Array = new Int8Array(1); console.log(int8Array.byteLength); // 打印 1 ,表示占用1个byte。 var uint8Array = new Uint8Array(1); console.log(uint8Array.byteLength); // 打印 1 ,表示占用1个byte。 var int16Array = new Int16Array(1); console.log(int16Array.byteLength); // 打印 2 ,表示占用2个byte。 var uint16Array = new Uint16Array(1); console.log(uint16Array.byteLength); // 打印 2 ,表示占用2个byte。 var int32Array = new Int32Array(1); console.log(int32Array.byteLength); // 打印 4 ,表示占用4个byte。 var uint32Array = new Uint32Array(1); console.log(uint32Array.byteLength); // 打印 4 ,表示占用4个byte。 var float32Array = new Float32Array(1); console.log(float32Array.byteLength); // 打印 4 ,表示占用4个byte。 var float64Array = new Float64Array(1); console.log(float64Array.byteLength); // 打印 8 ,表示占用8个byte。
new XXXArray( array ); array ,该数组中包含的数组(或类型化数组)。 内容将初始化为给定数组或类型化数组的内容,且每个元素均转换为此类型。
例
var int8Array = new Int8Array([22,24]); console.log(int8Array.byteLength); // 打印 2 ,表示占用2个byte。 var uint8Array = new Uint8Array([22,24]); console.log(uint8Array.byteLength); // 打印 2 ,表示占用2个byte。 var int16Array = new Int16Array([22,24]); console.log(int16Array.byteLength); // 打印 4 ,表示占用4个byte。 var uint16Array = new Uint16Array([22,24]); console.log(uint16Array.byteLength); // 打印 4 ,表示占用4个byte。 var int32Array = new Int32Array([22,24]); console.log(int32Array.byteLength); // 打印 8 ,表示占用8个byte。 var uint32Array = new Uint32Array([22,24]); console.log(uint32Array.byteLength); // 打印 8 ,表示占用8个byte。 var float32Array = new Float32Array([22,24]); console.log(float32Array.byteLength); // 打印 8 ,表示占用8个byte。 var float64Array = new Float64Array([22,24]); console.log(float64Array.byteLength); // 打印 16 ,表示占用16个byte。
new XXXArray( buffer, byteOffset, length); buffer,此数组类型表示的 ArrayBuffer。byteOffset 可选,指定与 此类型数组将开始的缓冲区的开始处的偏移量(以字节为单位),根据测试这个参数除了Int8Array和Uint8Array可以正常使用,其余都必须设置为0,原因作者暂时也不得而知。length,数组的长度。
例
var ab = new ArrayBuffer(20); var int16Array = new Int16Array(ab,0,2); console.log(int16Array.length); // 2 表示数组长度。 console.log(int16Array.byteLength); // 4 表示占用4个byte。
类型数组具有的属性
buffer 属性 只读。 获取此数组引用的 ArrayBuffer。fuck
sexbyteLength 属性 只读。 此数组的从其 ArrayBuffer 开始的长度(以字节为单位)在构造时已固定。
byteOffset 属性 只读。 此数组的从其 ArrayBuffer 开始的偏移量(以字节为单位)在构造时已固定。
length 属性,数组的长度。 例
var arr = new Uint16Array(2); arr.set(0,12); arr.set(1,322);
console.log(arr.buffer); / 打印 { '0': 12, '1': 0, '2': 66, '3': 1, slice: [Function: slice], byteLength: 4 }/
godconsole.log(arr.byteLength); // 4 console.log(arr.byteOffset); // 0 console.log(arr.length); // 2
类型数组具有的方法
get(index) 方法,获取指定索引处的元素
set(index, value) 方法,设置索引位置的值。
set(array, offset) 方法,在指定offset位置写入类型化或非类型化数组。
subarray() 方法,为此数组获取 ArrayBuffer 存储的新视图。
var arr = new Uint16Array(4); arr.set(0,12); arr.set(1,35); arr.set(2,666); arr.set(3,980); console.log(arr.get(2)); // 666 console.log(arr.length); // 4 var subarr = arr.subarray(1, 3); console.log(subarr.length); // 2
常量
BYTES_PER_ELEMENT , 数组中的每个元素的大小(以字节为单位)。
var int8Array = new Uint8Array(10); var int32Array = new Uint32Array(2); console.log(int8Array.BYTES_PER_ELEMENT); console.log(Int32Array.BYTES_PER_ELEMENT);