Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
你如何向一个在Javascript之外没有编程经验的人解释Javascript类型的数组?_Javascript_Typed Arrays - Fatal编程技术网

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

你如何向一个在Javascript之外没有编程经验的人解释Javascript类型的数组?,javascript,typed-arrays,Javascript,Typed Arrays,最近我一直在玩弄画布,为基于网络的游戏开发一些想法。因此,我最近遇到了Javascript类型的数组。例如,我在大学里读过一些书,但我发现什么都不懂。似乎大多数情况下,当有人在解释类型化数组时,他们会使用一些我无法理解的与其他语言的类比 我在“编程”方面的经验,如果你可以这么说的话(不仅仅是前端脚本),几乎仅限于Javascript。不过,我确实觉得在这个实例之外,我对Javascript非常了解。我已经深入研究并使用了Javascript的Object.prototype结构,以及更微妙的因素

最近我一直在玩弄画布,为基于网络的游戏开发一些想法。因此,我最近遇到了Javascript类型的数组。例如,我在大学里读过一些书,但我发现什么都不懂。似乎大多数情况下,当有人在解释类型化数组时,他们会使用一些我无法理解的与其他语言的类比

我在“编程”方面的经验,如果你可以这么说的话(不仅仅是前端脚本),几乎仅限于Javascript。不过,我确实觉得在这个实例之外,我对Javascript非常了解。我已经深入研究并使用了Javascript的Object.prototype结构,以及更微妙的因素,比如变量引用和
this
的值,但是当我查看我找到的关于类型化数组的任何信息时,我就不知所措了


考虑到这个参考框架,您能否以一种简单、可用的方式描述类型化数组?对我来说,最有效的描述用例是画布图像数据。另外,如果评论得好,我将不胜感激。

这些天我把所有的时间都花在了javascript上,但我想尝试一下快速摘要,因为我在其他语言(如Java)中使用过类型化数组

对于类型化数组,我认为在比较中最接近的是性能比较。在我看来,类型化数组使编译器能够做出他们通常无法做出的假设。如果有人在像V8这样的javascript引擎的底层进行优化,那么这些假设就很有价值。如果您可以说,“数据的大小总是X”(或类似的),那么您可以,例如,更有效地分配内存,这可以让您(现在变得更专业)减少访问内存的次数,并且它不在CPU缓存中。我相信,访问CPU缓存要比访问RAM快得多。当大规模地做事情时,这些节省的时间加起来很快

如果我要做一个JSFIDLE(抱歉,没有时间),我会比较在类型化数组和非类型化数组上执行某些操作所需的时间。例如,我设想“添加100000项”是一个性能基准,我会尝试比较结构如何处理事情

我能做的就是将您链接到:


我所做的一切就是谷歌的“类型化数组javascript性能”,然后点击第一项(我也熟悉jsperf,所以这帮助我做出决定)。

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

对于
类型化数组
,情况正好相反

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

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

从:

例如,给出以下代码:

      // 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之后;v2=0xff; 然后v3[0]==-1(其中-1表示为0xffff)


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

我还想看看类型化数组如何与多维数组(如
array[x][y]
)相比较。最接近的数据结构(但没有那么灵活)应该是。没有时间的好答案!我想我看到了我理解这些的问题。jsperf中显示的函数对我来说完全是胡说八道,所以我假设问题在于我不理解底层的数据结构。示例:我知道函数正在遍历一个网格/图像类型的结构,具有宽度和高度(显然)。不过,通常情况下,我会将这样的东西存储为一个2d对象数组,比如
image[x][y].property
,因此我不明白如何使用
n
。是的,就jsperf而言,这肯定是一个很难理解的问题。很抱歉,我没有仔细检查。事实上,我会说我的答案也很糟糕。只要在谷歌上搜索一下,你就会找到比我所能提供的更多关于差异的解释。例如,这是谷歌的另一个热门话题(很多行话,但如果你涉水而过,你可能会发现至少有一些东西会粘住你):
      // 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: