为什么我们不能通过指定等于零的长度来清空Float32Array()数组,就像其他普通数组一样?在Javascript中

假设我们有两个数组。为什么我们不能通过指定等于零的长度来清空Float32Array()数组,就像其他普通数组一样?在Javascript中

var normal = new Array(1,2,3,4); 

var float32 = new Float32Array(4);

现在,它可以通过

normal.length = 0; 

清空正常阵列,但在FLOAT32的情况下,我不能空数组由

float32.lenght = 0; 

阵列保持不变。为什么??

回答:

因为你的Float32Array仅有一个潜在ArrayBuffer,这本身就是一个固定长度的原始二进制的图数据缓冲区

在简化一点的风险下,一旦ArrayBuffer被分配了内存插槽,它将停留在相同的插槽中,并且您将无法修改其byteLength *。


*其实,你可以其中保存的数据,通过其传输数据的对象,即使转让只是为了清空ArrayBuffer对象是没有意义的,因为你将无法改变其再次长度(不推):

var arr = new Float32Array(56);  

console.log('before transfer', arr.length);

postMessage(arr, '*', [arr.buffer]);

console.log('after transfer', arr.length);

回答:

数组保持不变。为什么??

Float32ArrayTypedArray并按照docs

length属性是访问器属性,它的set访问 功能是不确定的,这意味着你只能读取此属性。

因此甚至length属性设置为0后,其值保持原样

var arr = new Float32Array([21,31]); 

arr.length = 0;

console.log(arr.length) //2

回答:

这可能是有点争议,但...

这种状态的存在是因为类型化数组通常不用于JavaScript开发人员的使用。他们在那里让JavaScript成为像emscripten这样的编译器更具吸引力的目标。

C/C++中的数组是固定大小的(这就是为什么用JS创建它们时声明这些数组的字节大小),并且只能保存单个类型的元素,所以改变它们长度的想法没有任何意义,并会使C/C++编译器因此产生的很多假设无效。

键入数组的全部意义在于允许对昂贵的进程(例如3D图形)进行更快的计算,并且如果您必须检查每个访问是否超出边界访问,它将会太慢。

以上是 为什么我们不能通过指定等于零的长度来清空Float32Array()数组,就像其他普通数组一样?在Javascript中 的全部内容, 来源链接: utcz.com/qa/263531.html

回到顶部