ArrayBuffer什么是ArrayBuffer对象,用于表示原始二进制数据的通用固定长度缓冲区。它是一个字节数组,在其他语言中通常称为“字节数组”。不能直接操作ArrayBuffer的内容,只能通过类型化的数组对象或者DataView对象来操作,这些对象会将缓冲区中的数据表示为特定的格式,通过这些格式来读写缓冲区的内容.简单用法constbuffer=newArrayBuffer(8);console.log(buffer.byteLength);//如果8length大于Number.MAX_SAFE_INTEGER(>=253)或负数,将抛出RangeError异常。**作用是从XHR、FileAPI、Canvas、WebGL等各个地方读取一大串字节流,如果在JS中使用Array来存储,既浪费又低效,所以为了配合这些新的API增强有了JS的二进制处理能力,就有了ArrayBuffer。创建ArrayBuffer时,相当于申请了一块内存。不能(也不方便)直接使用,于是就有了TypedArray,比如Uint32Array、Int16Array、Int8Array、Float32Array等,这些都是用来操作TypedArray的具体实现。TypeArray类型化数组(TypedArray)对象描述了一个底层二进制数据缓冲区(binarydatabuffer)的类数组视图(view)。事实上,不存在名为TypedArray的全局属性,也不存在名为TypedArray的构造函数。相反,有许多不同的全局属性,其值是特定元素类型的类型化数组构造函数,如下所示//下面的代码是语法格式的,不能直接运行,//TypedArray关键字需要替换为列在底部构造函数中的那个。新类型数组();//NewTypedArray(length);newTypedArray(typedArray);newTypedArray(object);newTypedArray(buffer[,byteOffset[,length]]);//TypedArray在ES2017中指的是以下其中之一:Int8Array();Uint8Array();Uint8ClampedArray();Int16Array();Uint16Array();Int32Array();Uint32Array();Float32Array();Float64Array();Unit8Array的意思每个ArrayBuffer一个字节(8位)被视为单个无符号整数(0-255)Unit16Array被表示为一个数字,使用16位(2字节)来表示一个无符号整数(0~2^16-1)数组Int8Array表示用8位表示一个有符号整数(-128~127)Float32Array表示用32位表示一个浮点数。Unit7ClampedArray和Unit8Array一样,范围是0到255,超出范围的处理不同,和图像处理相关(一般像素范围也是0到255)使用场景:文件转换:arrayBuffer可以转换为一个Blob对象:constblob=newBlob([arrayBuffer],{type:"xxx/xxx"});Blob转换为arrayBuffer:constfileReader:FileReader=newFileReader();fileReader.addEventListener("load",(event)=>{constarrayBuffer=event.target.result;//...})fileReader.readAsArrayBuffer(file);或者:constarrayBuffer=awaitfile.arrayBuffer();从ajax获取:varxhr=newXMLHttpRequest();xhr.open('GET','xxxxx');xhr.responseType='arraybuffer';xhr.onload=function(e){if(this.status==200){constarrayBuffer=xhr.response;}};xhr.发送();例1某音频播放方法constaudioContext=newAudioContext();constbuffer=awaitfile.arrayBuffer();常量auidoBuffer=等待audioContext。解码音频数据(缓冲区);constsource=audioContext.createBufferSource();source.buffer=auidoBuffer;source.connect(audioContext.destination);来源.开始();例2读取二进制文件//HTML代码如下//
