Javascript ArrayBuffer和Blob之间有什么区别?

Javascript ArrayBuffer和Blob之间有什么区别?,javascript,html,Javascript,Html,我正在阅读并试图找出ArrayBuffer和Blob之间的区别 两个容器不是都由比特组成吗?因此,这两个容器不能以多种方式查看(如32位块、16位块等)?页面对此进行了解释 阵列缓冲器 ArrayBuffer是二进制数据的通用固定长度容器。如果您需要原始数据的通用缓冲区,它们非常方便,但是这些家伙背后的真正力量是您可以使用JavaScript类型的数组创建底层数据的“视图”。事实上,可以从单个ArrayBuffer源创建多个视图。例如,您可以创建一个8位整数数组,该数组与来自相同数据的现有32位

我正在阅读并试图找出
ArrayBuffer
Blob
之间的区别


两个容器不是都由比特组成吗?因此,这两个容器不能以多种方式查看(如32位块、16位块等)?

页面对此进行了解释

阵列缓冲器

ArrayBuffer是二进制数据的通用固定长度容器。如果您需要原始数据的通用缓冲区,它们非常方便,但是这些家伙背后的真正力量是您可以使用JavaScript类型的数组创建底层数据的“视图”。事实上,可以从单个ArrayBuffer源创建多个视图。例如,您可以创建一个8位整数数组,该数组与来自相同数据的现有32位整数数组共享相同的ArrayBuffer。底层数据保持不变,我们只是创建了它的不同表示

斑点

如果您想直接使用Blob和/或不需要操作文件的任何字节,请使用xhr.responseType='Blob':


摘要

除非您需要编写/编辑(使用
ArrayBuffer
)的能力,否则
Blob
格式可能是最好的

细节

我是从一个地方来问这个问题的,我发现这很有帮助,所以我想把他们提升到一个答案上来

我还发现查找特定于
ArrayBuffer
Blob
对象的资源很有帮助。我添加了重点,以重申我正在寻找的有用细节。总之:尽管强调
Blob
是不可变的,但“原始数据”Blob很容易处理

关于
ArrayBuffer
vs
Blob
的一些其他观点:

  • 易变性
    • 可以更改阵列缓冲区(例如,使用数据视图)
    • Blob是不可变的
  • 内存中的源/可用性
    • 引述:

    • 内存中有一个数组缓冲区,可用于操作
    • Blob可以位于磁盘、缓存内存和其他不易获得的位置
  • 接入层
    • ArrayBuffer需要一些访问层
    • Blob可以直接传递到其他函数中,如中的示例所示
    • 但是,您可能仍然需要与文件相关的API,如
      FileReader
      来处理Blob
  • 皈依
    • 可以将Blob转换为ArrayBuffer,反之亦然,这解决了OP的“两个容器不是都由位组成吗?”
    • 阵列缓冲区可以从Blob或生成(感谢@Darren G)
    • Blob可以从ArrayBuffer生成
      新Blob([new Uint8Array(data)],如中所示
      
  • 在其他图书馆使用
    • )
      (new JSZip()).loadAsync(…)
      接受
      ArrayBuffer
      Blob
      String/ArrayBuffer/Uint8Array/Buffer/Blob/Promise
  • 协议如何处理ArrayBuffer与Blob
    • Websocket(又名WS/WSS)
      • 使用(可能有值“arraybuffer”或“blob”)来“控制通过WebSocket连接接收的二进制数据的类型”
    • XmlHttpRequest(又名XHR)
      • 使用to“更改服务器的预期响应类型”(有效值包括“arraybuffer”、“blob”和其他值,如“document”、“json”和“text”)
      • response属性将根据responseType包含实体主体,如ArrayBuffer、Blob、Document、JSON或字符串

以下是帮助我的其他文档详细信息:

ArrayBuffer对象用于表示通用的固定长度 原始二进制数据缓冲区。您不能直接
操纵 一个排列的缓冲器;而是创建一个类型化数组对象或 以特定格式表示缓冲区的DataView对象, 并且使用它来读写缓冲区的内容

Blob对象表示原始数据为不可变的类文件对象。 Blob表示不一定在JavaScript本机中的数据 格式。文件接口基于Blob,继承Blob 功能,并将其扩展以支持用户系统上的文件


嗯,但是你不能以不同的方式来看待它们吗?因为它们本质上都是比特的容器?当然。。但我猜ArrayBuffer有现成的功能吗?BLOB可以是任何东西,ArrayBuffer是定义良好的结构。啊,好吧,所以ArrayBuffer只是公开了一个接口来实现这一点。老实说,仍然不清楚。你所说的“一团可以是任何东西”是什么意思。它不只是一个字节序列吗,就像ArrayBuffer一样?ArrayBuffer在内存中,可供操作。Blob可以位于磁盘、缓存内存和其他不可用的位置。但是Blob中的数据可以复制到ArrayBuffer中。正如我刚刚发现的,当我从websocket得到二进制响应时,你会在那里得到一个Blob,而Blob的缺点似乎是你甚至无法读取它。只是个把手。我需要从那个blob中获取一些字节。您需要创建一个
文件读取器
,请参见-它添加了另一个异步函数,然后才能从Blob访问任何内容。
arrayBuffer
可以转换为
Blob
,如下所述:
新建Blob([new Uint8Array(data)]我对它进行了测试,它适用于PNG图像。@Mörre您可以对一个blob进行切片,以返回一个只包含所需字节的新blob,然后读取它。如果您想要真正的性能,那么workers支持同步文件读取,您可以