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 字节操作)决定。
相关推荐
子兮曰1 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰1 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万1 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝1 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋1 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁1 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄1 天前
JavaScript 隐式全局变量解析
javascript
汉堡大王95272 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大2 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师2 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端