javascript的类型数组(Typed Array)

在《javascript canvas图片像素》中提到了类型数组(Typed Array),javascript这是一种快速操作二进制数据的解决方案。

随着web发展和html5的推进,javascript来处理音视频、二进制文件和网络协议等都成为了可能,这时候原生的数组Array已经不能够满足需求,需要一种快速操作二进制流的东东产生,于是ArrayBuffer类型和Typed Array诞生了。

类型数组介绍

类型化数组类型表示可编制索引和操纵的ArrayBuffer对象的各种识图。所有数组类型的长度固定不变。如下表所示:

名称 大小(以字节为单位) 说明
Int8Array 1 8 位二补码有符号整数
Uint8Array 1 8 位无符号整数
Int16Array 2 16 位二补码有符号整数
Uint16Array 2 16 位无符号整数
Int32Array 4 32 位二补码有符号整数
Uint32Array 4 32 位无符号整数
Float32Array 4 32 位 IEEE 浮点数
Float64Array 8 64 位 IEEE 浮点数

多个类型的数组视图可以指向一个ArrayBuffer,例如下面的代码:

// 创建一个16字节的ArrayBuffer
var arrayBuffer = new ArrayBuffer(8);
//创建一个8位无符号整形类型数组
var u8 = new Uint8Array(arrayBuffer);
//16 位类型数组
var u16 = new Uint16Array(arrayBuffer);
//32为类型数组
var u32 = new Uint32Array(arrayBuffer);

所以 u8、u16 、u32 指向同一块 8 字节长度的内存,因此 u8 有8 个元素,u16 有4个元素,u32 则只有2个元素。

那么改变其中一个其他两个也跟着变(类似引用类型的数据,占用同一地址的内存):

[1,2,3,4,5,6,7,8].forEach(function(v,i){
    u8[i] = v;
})
console.log(u8,u16,u32);

需要注意的是,类型数组中每个值都是number类型的数据,是不允许出现字符串的。出现会采用隐性类型转换成0或者number,跟+号转换一样,但是要注意溢出问题!例如:8位数值范围为0~255(2^8),超出范围就溢出了

类型数组优点

优秀的性能

类型数组的提出就是来解决二进制数据访问操作的问题,所以类型数组比传统的数组要快很多,具有良好的性能。这是因为类型数组实际上是作为一个固定的内存块来进行访问,而传统的javascript数组使用的是hash查找方式。

二进制支持

我们知道html5有很多api是跟二进制密切相关的,例如音频视频、文件和websocket。而且XMLHttpRequest Level 2 已经可以指定文件responseType来制定arraybuffer等类型

类型数组的作用

这样我们可以做下面的事情:

  • javascript处理图片和音频
  • javascript读取二进制文件
  • javascript压缩二进制文件
  • javascript转换文件为二进制然后传输

这么来看js无敌了……

目前想到的,js可以通过FileReader读取文件,然后转换成二进制,最后再次上传。或者:FileReader读取图片,canvas进行图片压缩,使用toDataURL(或者imageData)进行图片压缩,然后上传,这样在手机端可以减少流量,提高速度。

另外在通信方面,可以实时转换成二进制进行socket通信。希望我说的这些都不是天方夜谭,但是实践中肯定会有很多问题

参考内容: