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

问题描述 投票:3回答:3

我们假设我们有两个数组。

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

现在可以通过清空正常数组

normal.length = 0;

但是,在float32的情况下,我无法清空数组

float32.lenght = 0;

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

javascript arrays node.js
3个回答
3
投票

因为你的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);

3
投票

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

Float32ArrayTypedArraydocs

length属性是一个访问器属性,其set访问器函数未定义,这意味着您只能读取此属性。

因此,即使将length属性设置为0,其值仍然保持原样

var arr = new Float32Array([21,31]);
arr.length = 0;
console.log(arr.length) //2

0
投票

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

存在这种状态是因为类型化数组通常不适合JavaScript开发人员使用。它们可以使JavaScript成为emscripten等编译器更具吸引力的目标。

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

拥有类型化数组的重点是允许更快的计算昂贵的进程(例如3D图形),如果你必须检查每个访问的越界访问,它将太慢。

© www.soinside.com 2019 - 2024. All rights reserved.