ArrayBuffer、Blob 和 DataView

211 阅读2分钟

一直对ArrayBuffer、DataView和Blob这三个对象有着不明所以的理解,模模糊糊,不清不楚的。所以这次稍微来整理一下他们的概念。

ArrayBuffer
  • 对象用来表示通用的、固定长度的原始二进制数据缓冲区。
  • ArrayBuffer 不能直接操作,而是要通过类型数组对象或 DataView 对象来操作,它们会将缓冲区中的数据表示为特定的格式,并通过这些格式来读写缓冲区的内容。
Blob
  • Blob 对象表示一个不可变、原始数据的类文件对象。
  • Blob 表示的不一定是JavaScript原生格式的数据。
  • File 接口基于Blob,继承了 blob 的功能并将其扩展使其支持用户系统上的文件。
DataView

视图是一个可以从 二进制ArrayBuffer 对象中读写多种数值类型的底层接口,使用它时,不用考虑不同平台的字节序问题。

Demo
var buffer = new ArrayBuffer(8);
console.log(buffer.byteLength);

// int32数组对象读取
var view   = new Int32Array(buffer);

// DataView对象读取
var dataView   = new DataView(buffer);
ArrayBuffer与Blob互转
//ArrayBuffer转Blob
var buffer = new ArrayBuffer(16);
var blob = new Blob([buffer]);

// Blob转ArrayBuffer
var blob = new Blob([1,2,3,4,5]); 
var reader = new FileReader(); 
reader.onload = function() { console.log(this.result); } 
reader.readAsArrayBuffer(blob);
Blob 与 ArrayBuffer 的关系
  • 相同点Blob和ArrayBuffer都是二进制的容器;
  • ArrayBufferArrayBuffer更底层,就是一段纯粹的内存上的二进制数据,我们可以对其任何一个字节进行单独的修改,也可以根据我们的需要以我们指定的形式读取指定范围的数据
  • Blob:Blob就是将一段二进制数据做了一个封装,我们拿到的就是一个整体,可以看到它的整体属性大小、类型;可以对其分割,但不能了解到它的细节
  • 联系:Blob可以接受一个ArrayBuffer作为参数生成一个Blob对象,此行为就相当于对ArrayBuffer数据做一个封装,之后就是以整体的形式展现了
  • 应用上的区别:由于ArrayBuffer和Blob的特性,Blob作为一个整体文件,适合用于传输;而只有需要关注细节(比如要修改某一段数据时),才需要用到ArrayBuffer
参考来源

二进制学习——Blob,ArrayBuffer、File、FileReader和FormData的区别