一、背景
1、产生
ArrayBuffer对象、TypeArray视图和DataView视图是JavaScript操作二进制数据的一个接口。这些对象早就存在,属于独立的规格(2011年2月发布),ES6将它们纳入了ECMAScript规格,并且增加了新的方法。它们都以数组的语法处理二进制数据,所以统称为二进制数组。
这个接口的原始设计目的与WebGL项目有关,所谓WebGL,就是浏览器与显卡之间的通信接口,为了满足JavaScipt与显卡之间大量、实时的数据交换,它们之间的数据通信必须是二进制的,而不能是文本格式。文本格式传递一个32位整数,两端的JavaScript脚本与显卡都要进行格式化,将非常耗时。这时要是存在一种机制,可以像C语言那样直接操作字节,将4个字节的32位整数以二进制形式原封不动地送入显卡,脚本的性能就会大幅提升。
二进制数组就是在这种背景下诞生,它很像C语言的数组,允许开发者以数组下标的形式直接操作内存,大大增强了JavaScript处理二进制数据的能力,使开发者有可能通过JavaScript与操作系统的原生接口进行二进制通信。
2、概述
二进制数组由3类对象组成:
- ArrayBuffer对象:代表内存中的一段二进制数据,可以通过“视图”进行操作。“视图”部署了数组接口,这意味着,可以用数组的方法操作内存。
- TypeArray视图:共包括9种类型的视图,比如Uint8Array(无符号8位整数)数组视图、Int16Array(16位整数)数组视图、Float32Array(32位浮点数)数组视图等。
- DataView视图:可以自定义复合格式的视图,比如第一个字节是Uint8、第二和第三个字节是Int16、第四个字节开始是Float32等,此外还可以自定义字节序。
简而言之,ArrayBuffer对象代表原始的二进制数据,TypeArray视图用于读/写简单类型的二进制数据,DataView视图用于读/写复杂类型的二进制数据。
TypeArray视图支持的数据类型一共有9种(DataView视图支持除Uint8C以外的其他8种),如下表所示
数据类型 | 字节长度 | 含义 | 对应的C语言类型 |
Int8 | 1 | 8位带符号整数 | signed char |
Uint8 | 1 | 8位不带符号整数 | unsigned char |
Uint8C | 1 | 8位不带符号整数(自动过滤溢出) | unsigned char |
Int16 | 2 | 16位带符号整数 | short |
Uint16 | 2 | 16位不带符号整数 | unsigned short |
Int32 | 4 | 32位带符 |