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