Float32Array上的.push()

时间:2014-06-25 13:43:38

标签: javascript

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

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

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

3 个答案:

答案 0 :(得分:6)

基本上Float32Array只是ArrayBuffer对象的视图(与JS中的所有类型数组一样)。此ArrayBuffer具有固定长度,而Float32Array继承。{/ p>

总而言之:您无法动态更改Float32Array的大小。唯一的可能性是:

  1. 创建一个新数组,其长度为旧数组+ 1
  2. 将旧阵列的所有项目复制到新阵列。
  3. 将新项目作为新数组中的最后一项插入。
  4. 用新数组替换旧数组的所有实例。
  5. 如果您想多次添加多个值,我强烈建议不要这样做。这完全否定了使用类型化数组可能获得的任何性能优势!

答案 1 :(得分:1)

类型化数组是involved system的一部分,用于处理原始"机器级"数据。如果您只想要一个简单的32位浮点数组,可以使用固定长度创建它,并像普通数组一样使用它

var f32 = new Float32Array(10);
f32[0] = 100;
alert(f32[0]); // 100

答案 2 :(得分:1)

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

在这里,我们已经分配了内存(底层的ArrayBuffer)和已使用的内存(类型化数组中的已分配项目),在原始环境中不必是同一回事记忆。

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

(myarray = new Float32Array(myarray.length+1)).set([...myarray, appendix])

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

要使内存有效,您可以共享一个底层的ArrayBuffer(请参见示例here),只需记住Float32Array中的每个项在ArrayBuffer中都占用4个字节即可。

如果您不想为此而烦恼,并且只想随时随地进行推送,那就呆在旧的通用阵列上。