js今日理解 blob和arrayBuffer 二进制数据

Blob 和 ArrayBuffer 都是 JavaScript 中用于处理二进制数据的对象,但它们的用途、特性和使用场景有所不同。以下是它们的区别和相同点的详细分析:

相同点

  1. 二进制数据:Blob 和 ArrayBuffer 都用于表示二进制数据,可以处理诸如文件、图像、音频等非文本数据。
  2. Web API 相关:两者都是 Web 平台的一部分,常用于浏览器环境中,例如处理文件上传、下载或操作流数据。
  3. 不可直接操作 :它们本身不提供直接操作数据内容的方法,通常需要结合其他工具(如 FileReaderTextDecoderTypedArray)来读取或处理数据。

区别

特性 Blob ArrayBuffer
定义 Blob(Binary Large Object)表示不可变的二进制数据块,通常用于表示文件或类似文件的数据。 ArrayBuffer 是一个通用的、固定长度的二进制数据缓冲区,表示原始字节序列。
可变性 不可变(immutable),创建后无法直接修改其内容。 可变(mutable),可以通过 TypedArrayDataView 修改其内容。
用途 常用于处理文件(如上传、下载)、流数据,或需要整体传输的数据(如通过网络发送)。 常用于需要直接操作字节级数据的场景,如处理图像数据、音频处理或 WebGL 数据。
大小和内容 大小可以动态确定,内容可以是多种类型(如字符串、ArrayBuffer、其他 Blob)。 固定大小,创建时指定字节长度,内容是连续的字节序列。
操作方式 提供 slice() 方法来提取部分数据,需通过 FileReaderResponse 等转换为其他格式(如 ArrayBuffer 或文本)。 通过 TypedArray(如 Uint8Array)或 DataView 直接操作字节数据。
内存管理 更适合处理大型文件或流式数据,内存管理由浏览器优化。 更适合低级字节操作,内存分配固定,需手动管理。
典型场景 文件上传、下载、创建 URL(URL.createObjectURL)、处理流(如 ReadableStream)。 处理二进制协议、WebGL 缓冲区、音视频数据解码、加密算法等。

详细说明

  1. Blob

    • Blob 是更高层次的抽象,设计目的是处理类似文件的数据。它可以包含多种类型的数据(例如字符串、ArrayBuffer 或其他 Blob),并且可以与文件系统交互。

    • Blob 通常与 File 对象相关,FileBlob 的子类,增加了文件特有的元数据(如文件名、最后修改时间)。

    • 示例:

      ini 复制代码
      javascript
      const blob = new Blob(["Hello, world!"], { type: "text/plain" });
      const url = URL.createObjectURL(blob); // 创建可下载的 URL
  2. ArrayBuffer

    • ArrayBuffer 是低层次的二进制数据表示,提供了固定长度的字节数组。它本身只是一个内存块,无法直接读取或修改数据,必须通过 TypedArray(如 Uint8ArrayInt16Array)或 DataView 操作。

    • 示例:

      arduino 复制代码
      javascript
      const buffer = new ArrayBuffer(16); // 创建 16 字节的缓冲区
      const view = new Uint8Array(buffer); // 使用 Uint8Array 操作
      view[0] = 255; // 修改第一个字节
  3. 转换

    • Blob 可以转换为 ArrayBuffer,例如通过 FileReader

      ini 复制代码
      javascript
      const blob = new Blob(["test"]);
      const reader = new FileReader();
      reader.onload = () => {
        const arrayBuffer = reader.result; // ArrayBuffer
      };
      reader.readAsArrayBuffer(blob);
    • ArrayBuffer 也可以转换为 Blob:

      arduino 复制代码
      javascript
      const buffer = new ArrayBuffer(8);
      const blob = new Blob([buffer], { type: "application/octet-stream" });

总结

  • Blob 更适合处理文件或大数据块,强调不可变性和整体性,适合文件操作或网络传输。
  • ArrayBuffer 更适合需要直接操作字节的场景,强调灵活性和低级控制,适合数据处理和计算。
  • 它们确实都表示二进制数据,但设计目标和使用场景不同,选择时应根据具体需求(如文件处理 vs 字节操作)决定。
相关推荐
棒棒的唐几秒前
vue2 elementUI 登录页面实现回车提交登录的方法
前端·javascript·elementui
前端小万3 分钟前
一次紧急的现场性能问题排查
前端·性能优化
excel19 分钟前
为什么相同卷积代码在不同层学到的特征完全不同——基于 tfjs-node 猫图像识别示例的逐层解析
前端
知识分享小能手19 分钟前
React学习教程,从入门到精通,React 使用属性(Props)创建组件语法知识点与案例详解(15)
前端·javascript·vue.js·学习·react.js·前端框架·vue
用户214118326360222 分钟前
dify案例分享-免费玩转即梦 4.0 多图生成!Dify 工作流从搭建到使用全攻略,附案例效果
前端
CodeSheep22 分钟前
稚晖君又开始摇人了,有点猛啊!
前端·后端·程序员
JarvanMo24 分钟前
Flutter Web vs Mobile:主要区别以及如何调整你的UI
前端
IT_陈寒44 分钟前
Java性能优化:从这8个关键指标开始,让你的应用提速50%
前端·人工智能·后端
天生我材必有用_吴用1 小时前
Vue3+Node.js 实现大文件上传:断点续传、秒传、分片上传完整教程(含源码)
前端
摸鱼的春哥1 小时前
前端程序员最讨厌的10件事
前端·javascript·后端