为什么我们不能通过指定等于零的长度来清空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);
回答:
数组保持不变。为什么??
Float32Array
是TypedArray
并按照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