【问题标题】:Understanding the concept of typed arrays in JavaScript了解 JavaScript 中类型化数组的概念
【发布时间】:2013-10-04 09:14:48
【问题描述】:

我想知道什么是 JavaScript 中的类型化数组(例如 Int16Array、Uint32Array、Uint8ClampedArray 等)。我是这个字节级概念的新手,因为我真的不明白所说的内容。例如,如果你看这篇文章,当它谈到 32 位操作时,我会迷失方向......
https://hacks.mozilla.org/2011/12/faster-canvas-pixel-manipulation-with-typed-arrays/

我知道一个字符在 JavaScript 中是两个字节,我知道类型化数组只是一个存储字节的缓冲区(?),然后数据视图(例如上面这三个)用于以某种方式读取/修改字节信息,具体取决于它们类型。但是,我无法理解如何使用它们或它们比“普通”数组有什么好处。有人能解释一下类型化数组的用例和好处吗?

【问题讨论】:

  • 那是 uint32,就像在 Unsigned INTeger 中一样,不是吗?
  • 这还不是 JavaScript 的一部分
  • @Mohsen:不在 ECMAScript 规范本身中,但一些浏览器提供了确实是这样的宿主对象 - 请参阅 developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays 了解更多详细信息。
  • @Qantas94Heavy 我知道。 DOM 本身并不是 ECMAScript 的一部分。

标签: javascript arraybuffer typed-arrays


【解决方案1】:

类型数组通常在与外部世界交互时使用,其中数据以特定的非 JavaScript 形式出现,并且您希望通过 JavaScript 访问该数据。类型数组用于创建数据缓冲区的特定视图。缓冲区是原始数据,视图是读取/解释/访问该数据的方法。

如果您不与外部世界交互并且不尝试处理在 javascript 之外创建的数据或发送到 javascript 之外的代理,那么通常只使用普通的 javascript 数组而不使用缓冲区和类型化数组。

这就是您询问的类型:

Int16Array: An array of 16-bit integers (signed) - 2 bytes per entry
Uint8Array: An array of 8-bit unsigned integers - 1 byte per entry
Uint32Array: An array of 32-bit unsigned integers - 4 bytes per entry

您可以在此处查看所有类型化数组的列表:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays

当变量为typed 时,这意味着该变量具有非常特定的类型并且只有该类型。类型可能是字符串、16 位有符号整数、浮点数等……在 javascript 中,变量可以保存任何类型的数据,因此它没有具体类型。在其他语言(如 C)中,变量通常预先声明为具有特定类型,并且(不使用特定覆盖)您不能将不同类型的数据分配给该变量。

不打算就各种语言特性的可取性展开争论,通常认为用类型语言编程更安全,并且执行引擎可能可以更快地处理数据,但无类型或弱类型语言有时可能更灵活- 让做一些事情变得更简单或更干净。

【讨论】:

  • 所以 JavaScript 中类型数组的唯一优势是速度,对吗?
  • 不,我根本不是这么说的。请再读一遍我的第一段。
  • 那么为什么不能将原始数据放入线性数组中。就像在画布中 imageData.data 是线性数组但 imageData.data.buffer 是类型数组
  • @MuhammadUmer - 我不知道你在评论中要问什么。也许你应该开始一个新的 StackOverflow 问题。
  • @MuhammadUmer - 也许读到这个:stackoverflow.com/questions/23305551/…。我会说主要用途(尽管还有其他用途)是 Javascript 可以处理来自外部来源的二进制数据。通过在二进制缓冲区顶部创建视图,您可以将特定的二进制数据从缓冲区读取到 Javascript 变量中,而无需将整个二进制流转换为 Javascript 格式的数据。例如,您可能想从声音文件中读取标题。
猜你喜欢
  • 2014-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多