2017-12-18 103 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圖形)進行更快的計算,並且如果您必須檢查每個訪問是否超出邊界訪問,它將會太慢。

相關問題