2017-12-18 144 views
3

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

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

现在,它可以通过

normal.length = 0; 

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

float32.lenght = 0; 

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

+0

因为你的Float32Array只是一个基于[ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer)的* view *。 (但你仍然可以清空它,即使没有用例) – Kaiido

+0

@Kaiido我以另一种方式读取问题,基本上我回答了* Array保持不变。为什么??* – gurvinder372

回答

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

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

Float32ArrayTypedArray并按照docs

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图形)进行更快的计算,并且如果您必须检查每个访问是否超出边界访问,它将会太慢。

相关问题