Float32Array上的.push()

Die*_*ego 7 javascript

我不能在Float32Array上使用.push(),我收到错误,所以我试着像这样添加它:

myarray = new Float32Array() ;
myarray.push = function()
{
    for( var i in arguments )
    {
        this[this.length] = arguments[i] ;
    }
} ;
Run Code Online (Sandbox Code Playgroud)

但它不起作用.我没有得到错误,但我的数组的值都是0.为什么?

Sir*_*rko 8

基本上a Float32Array只是一个ArrayBuffer对象的视图(与JS中的所有类型数组一样).这ArrayBuffer有一个固定的长度,这反过来Float32Array继承.

所以总结一下:你不能随意改变你的大小Float32Array.唯一的可能性是:

  1. 创建一个新数组,其长度为旧数组+ 1
  2. 将旧阵列的所有项目复制到新阵列.
  3. 插入新项目作为新数组中的最后一项.
  4. 用新数组替换旧数组的所有实例.

如果你想多次添加多个值,我强烈建议不要这样做.这完全否定了使用类型化数组可能获得的任何性能优势!


Jan*_*roň 5

像 Float32Array 这样的类型化数组被设计为较低级别的方法,如果您熟悉动态内存分配(例如 C 语言),那么这种方法会更有意义。

这里我们分配了内存(底层 ArrayBuffer)和使用了内存(类型化数组中分配的项),这在原始内存中不一定是相同的。

您可以像这样推送类型数组:

(myarray = new Float32Array(myarray.length+1)).set([...myarray, appendix])
Run Code Online (Sandbox Code Playgroud)

appendix您要推送的新项目在哪里。它不仅丑陋,而且非常低效:您应该预测数组将增长多少并分配更多额外空间,而不是仅仅分配+1(并记住还剩下多少空间)。

为了使其内存有效,您可以共享一个底层 ArrayBuffer(请参阅此处的示例),只需记住 Float32Array 中的每一项在 ArrayBuffer 中占用 4 个字节。

如果您不想为此烦恼并且只想随时推送,请继续使用旧的通用数组。