我不能在Float32Array上使用.push(),我收到错误,所以我试着像这样添加:
myarray = new Float32Array() ;
myarray.push = function()
{
for( var i in arguments )
{
this[this.length] = arguments[i] ;
}
} ;
但它不起作用。我没有得到错误,但我的数组的值都是0。 为什么?
答案 0 :(得分:6)
基本上Float32Array
只是ArrayBuffer
对象的视图(与JS中的所有类型数组一样)。此ArrayBuffer
具有固定长度,而Float32Array
继承。{/ p>
总而言之:您无法动态更改Float32Array
的大小。唯一的可能性是:
如果您想多次添加多个值,我强烈建议不要这样做。这完全否定了使用类型化数组可能获得的任何性能优势!
答案 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个字节即可。
如果您不想为此而烦恼,并且只想随时随地进行推送,那就呆在旧的通用阵列上。