Javascript .push()在浮点数组上

Javascript .push()在浮点数组上,javascript,arrays,Javascript,Arrays,我无法在Float32Array上使用.push(),我收到一个错误,因此我尝试按如下方式添加它: myarray = new Float32Array() ; myarray.push = function() { for( var i in arguments ) { this[this.length] = arguments[i] ; } } ; 但它不起作用。我没有得到错误,但是我的数组的值都是0。 为什么?类型化数组是处理原始“机器级”数据的一

我无法在Float32Array上使用.push(),我收到一个错误,因此我尝试按如下方式添加它:

myarray = new Float32Array() ;
myarray.push = function()
{
    for( var i in arguments )
    {
        this[this.length] = arguments[i] ;
    }
} ;
但它不起作用。我没有得到错误,但是我的数组的值都是0。
为什么?

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

var f32 = new Float32Array(10);
f32[0] = 100;
alert(f32[0]); // 100
基本上,a只是对象上的一个视图(JS中的所有类型化数组都是这样)。此
ArrayBuffer
具有固定的长度,而
Float32Array
又继承了该长度

因此得出结论:您不能动态更改
Float32Array
的大小。唯一的可能性是:

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

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

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

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

    您可以按如下方式推送到类型化数组:

    (myarray = new Float32Array(myarray.length+1)).set([...myarray, appendix])
    
    其中,
    附录
    是您要推送的新项目。它不仅难看,而且效率也很低:您应该预测阵列将增长多少,并分配更多的额外空间,而不仅仅是
    +1
    (记住还有多少空间)

    为了提高内存效率,您可以共享一个底层的ArrayBuffer(参见示例),只需记住Float32Array中的每个项在ArrayBuffer中占用4个字节


    如果您不想为此烦恼,只想随时推送,只需使用旧的泛型数组。

    float32数组是类型化数组,因此只有固定长度。“你就是不能动态地修改它们。”Sirko花了我三分钟的时间在浏览器控制台上摸索,让我明白了这一点XD@Sirko回答这个问题并链接到上面唯一的方法是
    get
    set
    如果你能解释一下你希望对数组做什么,那会有帮助。我明白了,因此,由于无法更改其长度,我编辑并尝试了myarray=newfloat32array(12);使用了一个变量myarray_length,因为它的实际长度总是12,但我仍然得到0。创建后我也不能更改它的值?