假設我們有兩個數組。爲什麼我們不能通過指定等於零的長度來清空Float32Array()數組,就像其他普通數組一樣?在Javascript中
var normal = new Array(1,2,3,4);
var float32 = new Float32Array(4);
現在,它可以通過
normal.length = 0;
清空正常陣列,但在FLOAT32的情況下,我不能空數組由
float32.lenght = 0;
陣列保持不變。爲什麼??
假設我們有兩個數組。爲什麼我們不能通過指定等於零的長度來清空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只是一個基於[ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer)的* view *。 (但你仍然可以清空它,即使沒有用例) – Kaiido
@Kaiido我以另一種方式讀取問題,基本上我回答了* Array保持不變。爲什麼??* – gurvinder372