我们假设我们有两个数组。
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图形),如果你必须检查每个访问的越界访问,它将太慢。