您如何向没有 Javascript 之外的编程经验的人解释 Javascript 类型数组?

2024-01-22

最近我经常使用 Canvas,开发一些关于网络游戏的想法。因此,我最近遇到了 Javascript 类型数组。我已经读过一些书,例如MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays我就是无法理解我发现的任何东西。似乎最常见的是,当有人解释类型化数组时,他们使用与其他语言的类比,这有点超出了我的理解。

我的“编程”经验(如果你可以这样称呼它的话)(而不仅仅是前端脚本)几乎仅限于 Javascript。然而,我确实觉得我在这个实例之外对 JavaScript 理解得很好。我深入研究并使用了Javascript的Object.prototype结构,以及变量引用和值等更微妙的因素this,但是当我查看我找到的有关类型化数组的任何信息时,我迷失了。

考虑到这个参考框架,您能以一种简单、可用的方式描述类型化数组吗?对我来说,最有效的描述用例与 Canvas 图像数据有关。还有一个好评如潮的Fiddle http://jsfiddle.net/将不胜感激。


在类型化编程语言(JavaScript 属于这种语言)中,我们通常有固定声明类型的变量,可以动态赋值。

With Typed Arrays事实恰恰相反。

您有固定的数据块(由ArrayBuffer)您不能直接访问。相反,该数据是通过以下方式访问的:views。视图是在运行时创建的,它们有效地将缓冲区的某些部分声明为某种类型。这些视图是以下视图的子类ArrayBufferView。视图将该数据块的特定连续部分定义为特定类型的数组的元素。一旦声明类型,浏览器就知道每个元素的长度和内容,以及此类元素的数量。有了这些知识,浏览器就可以更有效地访问各个元素。

因此,我们动态地将类型分配给实际上只是缓冲区的一部分。我们可以将多个视图分配给同一个缓冲区。

来自Specs https://www.khronos.org/registry/typedarray/specs/latest/:

Multiple typed array views can refer to the same ArrayBuffer, of different types,
lengths, and offsets. 

This allows for complex data structures to be built up in the ArrayBuffer.

例如,给出以下代码:

      // create an 8-byte ArrayBuffer
      var b = new ArrayBuffer(8);

      // create a view v1 referring to b, of type Int32, starting at
      // the default byte index (0) and extending until the end of the buffer
      var v1 = new Int32Array(b);

      // create a view v2 referring to b, of type Uint8, starting at
      // byte index 2 and extending until the end of the buffer
      var v2 = new Uint8Array(b, 2);

      // create a view v3 referring to b, of type Int16, starting at
      // byte index 2 and having a length of 2
      var v3 = new Int16Array(b, 2, 2);

The following buffer and view layout is created:

这定义了一个 8 字节缓冲区 b,以及该缓冲区的三个视图 v1、 v2 和 v3。每个视图都引用相同的缓冲区——所以 v1[0] 指字节 0..3 作为有符号 32 位整数,v2[0] 指字节 2 作为无符号 8 位整数,v3[0] 将字节 2..3 引用为 有符号 16 位整数。对一个视图的任何修改都会立即生效 其他可见:例如v2[0] = 0xff之后; v21 https://www.khronos.org/registry/typedarray/specs/latest/= 0xff; 那么 v3[0] == -1 (其中 -1 表示为 0xffff)。

因此,我们不是声明数据结构并用数据填充它们,而是获取数据并用不同的数据类型覆盖它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

您如何向没有 Javascript 之外的编程经验的人解释 Javascript 类型数组? 的相关文章

随机推荐