ArrayBuffer存储了固定byte(字节)的raw binary data(原始二进制数据)。不能直接通过ArrayBuffer读取和修改数据。只能通过view(视图)来操作。其他编程语言里有相似的概念,一般叫做byte array(字节数组),可以直接操作,元素值的范围在[0,255]之间,类似于Uint8Array。个人觉得ByteArray比ArrayBuffer这个命名要好。同一ArrayBuffer可以用不同的视图,以不同的“视角”去读写。
TypedArray是类数组对象,TypedArray里元素值的类型都相同(Array元素值的类型可以不相同)。共有10种具体的TypedArray:
Uint8Array的常见使用场景:
Uint8ClampedArray的元素值被“裁切”限制在[0,255]之间。用它来存储颜色值是个不错的选择。
const u8a=new Uint8Array(3);
u8a.fill(256);//[0,0,0]
const u8ca=new Uint8ClampedArray(3);
u8ca.fill(256);//[255,255,255]
创建ArrayBuffer主要有两种方式:
//创建了8个字节长度的ArrayBuffer
var buffer=new ArrayBuffer(8);
比如读取本地文件再转换成ArrayBuffer。
var fileReader = new FileReader();
fileReader.readAsArrayBuffer(file);
MDN上有个稍微复杂的例子——
Working
with complex data structures。但这个例子太理论化了。我想做一个更实际的例子——通过ArrayBuffer检测文件的类型(示例只检测了图片类型,可以根据具体情况予以完善,file-type这个js库检测的类型很全面)。算法的核心流程大致如下:
使用ArrayBuffer做一个简易版的hex editor。可以参考Hex Fiend。