JavaScript ç±»ååæ°ç»
JavaScript ç±»ååæ°ç»æ¯ä¸ç§ç±»ä¼¼æ°ç»ç对象ï¼å¹¶æä¾äºä¸ç§ç¨äºå¨å åç¼å²ä¸è®¿é®åå§äºè¿å¶æ°æ®çæºå¶ã
å¼å ¥ç±»ååæ°ç»å¹¶éæ¯ä¸ºäºå代 JavaScript 䏿°ç»çä»»ä½ä¸ç§åè½ãç¸åï¼å®ä¸ºå¼åè æä¾äºä¸ä¸ªæä½äºè¿å¶æ°æ®çæ¥å£ãè¿å¨æä½ä¸å¹³å°ç¸å ³çç¹æ§æ¶ä¼å¾æç¨ï¼ä¾å¦ï¼é³é¢è§é¢ç¼è¾åè®¿é® WebSocket åå§æ°æ®çãJavaScript ç±»ååæ°ç»ä¸çæ¯ä¸ä¸ªå ç´ é½æ¯ä»¥æç§æ ¼å¼è¡¨ç¤ºçåå§äºè¿å¶å¼ï¼JavaScript æ¯æä» 8 使´æ°å° 64 使µ®ç¹æ°çå¤ç§äºè¿å¶æ ¼å¼ã
ç±»ååæ°ç»æ¥æè®¸å¤ä¸æ°ç»ç¸åçæ¹æ³ï¼è¯ä¹ä¹ç¸ä¼¼ã使¯ï¼ç±»ååæ°ç»å¹¶ä¸æ¯æ®éæ°ç»ï¼å 为å¨ç±»ååæ°ç»ä¸è°ç¨ Array.isArray() ä¼è¿å falseãæ¤å¤ï¼å¹¶ä¸æ¯ææå¯ç¨äºæ®éæ°ç»çæ¹æ³é½è½è¢«ç±»ååæ°ç»ææ¯æï¼å¦ push å popï¼ã
ä¸ºäºæå¤§ç¨åº¦ççµæ´»æ§åæçï¼JavaScript å°ç±»ååæ°ç»çå®ç°æå为ç¼å²åè§å¾ä¸¤é¨åãç¼å²æ¯ä¸ç§è¡¨ç¤ºäºæ°æ®åç对象ï¼å®æ²¡ææ ¼å¼å¯è¨ï¼ä¹æ²¡ææä¾è®¿é®å ¶å å®¹çæºå¶ã为äºè®¿é®ç¼å²ä¸çå åï¼ä½ éè¦ä½¿ç¨è§å¾ãè§å¾æä¾äºä¸ä¸æââ峿°æ®ç±»åãèµ·å§åç§»éåå ç´ æ°éã

ç¼å²
æä¸¤ç§ç±»åçç¼å²ï¼ArrayBuffer å SharedArrayBufferãå®ä»¬é½æ¯å
ååçä½çº§è¡¨ç¤ºãå®ä»¬ååä¸é½å«æâarrayâï¼ä½æ¯å®ä»¬ä¸æ°ç»å¹¶æ²¡æå¤ªå¤å
³ç³»ââä½ ä¸è½ç´æ¥è¯»åå®ä»¬ãç¸åï¼ç¼å²æ¯éç¨ç对象ï¼å®ä»¬åªå
å«åå§æ°æ®ã为äºè®¿é®ç¼å²æè¡¨ç¤ºçå
åï¼ä½ éè¦ä½¿ç¨è§å¾ã
ç¼å²æ¯æä»¥ä¸æä½ï¼
- åé
ï¼å建ä¸ä¸ªæ°çç¼å²æ¶ï¼ä¼åé
ä¸ä¸ªæ°çå
ååï¼å¹¶ä¸åå§å为
0ã - å¤å¶ï¼ä½¿ç¨
slice()æ¹æ³ï¼ä½ å¯ä»¥é«æå°å¤å¶ç¼å²ä¸çä¸é¨åæ°æ®ï¼èä¸éè¦å建è§å¾æ¥æå¨å¤å¶æ¯ä¸ä¸ªåèã - 转移ï¼ä½¿ç¨
transfer()åtransferToFixedLength()æ¹æ³ï¼å¯ä»¥å°å ååçæææè½¬ç§»ç»ä¸ä¸ªæ°çç¼å²å¯¹è±¡ãè¥ä½ æ³è¦å¨ä¸åçæ§è¡ä¸ä¸æé´è½¬ç§»æ°æ®ï¼å䏿³å¤å¶ï¼è¿äºæ¹æ³å°±å¾æç¨ã转移åï¼åå§ç¼å²å°ä¸åå¯ç¨ãSharedArrayBufferä¸è½è¢«è½¬ç§»ï¼å 为ç¼å²å·²ç»è¢«æææ§è¡ä¸ä¸æå ±äº«ï¼ã - è°æ´å¤§å°ï¼ä½¿ç¨
resize()æ¹æ³ï¼å¯ä»¥è°æ´å ååç大å°ï¼åªè¦ä¸è¶ è¿é¢è®¾çmaxByteLengthéå¶ï¼ãSharedArrayBufferåªè½å¢é¿ï¼ä¸è½ç¼©å°ã
ArrayBuffer ä¸ SharedArrayBuffer ä¹é´çåºå«æ¯ï¼åè
å¨å䏿¶å»åªè½æå±äºå个æ§è¡ä¸ä¸æãå¦æä½ å° ArrayBuffer ä¼ éç»å¦ä¸ä¸ªæ§è¡ä¸ä¸æï¼å®ä¼è¢«è½¬ç§»ï¼åå§ç ArrayBuffer å°ä¸åå¯ç¨ãè¿ç¡®ä¿äºå䏿¶å»åªæä¸ä¸ªæ§è¡ä¸ä¸æå¯ä»¥è®¿é®å
åãSharedArrayBuffer å¨ä¼ éç»å¦ä¸ä¸ªæ§è¡ä¸ä¸ææ¶ä¸ä¼è¢«è½¬ç§»ï¼å æ¤å¯ä»¥è¢«å¤ä¸ªæ§è¡ä¸ä¸æåæ¶è®¿é®ãå½å¤ä¸ªçº¿ç¨åæ¶è®¿é®åä¸å
ååæ¶ï¼å¯è½ä¼åºç°ç«äºæ¡ä»¶ï¼è¿æ¶å Atomics æ¹æ³å°±å¾æç¨äºã
è§å¾
ç®åä¸»è¦æä¸¤ç§è§å¾ï¼ç±»ååæ°ç»è§å¾å DataViewãç±»ååæ°ç»æä¾äºå®ç¨æ¹æ³ï¼å¯ä»¥æ¹ä¾¿å°è½¬æ¢äºè¿å¶æ°æ®ãDataView æ´åºå±ï¼å¯ä»¥ç²¾ç¡®æ§å¶æ°æ®çè®¿é®æ¹å¼ã使ç¨è¿ä¸¤ç§è§å¾è¯»åæ°æ®çæ¹å¼æ¯é常ä¸åçã
两ç§è§å¾é½ä¼ä½¿ ArrayBuffer.isView() è¿å trueãå®ä»¬é½æä»¥ä¸å±æ§ï¼
buffer-
è§å¾æå¼ç¨çåºå±ç¼å²ã
byteOffset-
è§å¾ç¸å¯¹äºç¼å²èµ·å§ä½ç½®çåç§»éï¼ä»¥åè为åä½ï¼ã
byteLength-
è§å¾çé¿åº¦ï¼ä»¥åè为åä½ï¼ã
两è
çæé 彿°é½æ¥åä¸è¿°ä¸ä¸ªå离çåæ°ãç±»ååæ°ç»æé 彿°è¿æ¥å length ä½ä¸ºå
ç´ æ°éï¼è䏿¯åèé¿åº¦ã
ç±»ååæ°ç»è§å¾
ç±»ååæ°ç»è§å¾æèªæè¿°çåç§°ï¼å¹¶ä¸æä¾äºææå¸¸è§æ°å¼ç±»åçè§å¾ï¼å¦ Int8ãUint32 å Float64 ççãè¿æä¸ç§ç¹æ®çç±»ååæ°ç»è§å¾ï¼Uint8ClampedArrayï¼å®ä¼å°å¼é³å¶ï¼clampï¼å° 0 å° 255 ä¹é´ï¼è¿å¨ Canvas æ°æ®å¤ççåºæ¯ä¸å¾æç¨ã
| ç±»å | å¼èå´ | åèæ° | æè¿° | 对åºç Web IDL ç±»å | çæç C ç±»å |
|---|---|---|---|---|---|
Int8Array |
-128~127 | 1 | 8 ä½æç¬¦å·æ´æ°ï¼è¡¥ç ï¼ | byte |
int8_t |
Uint8Array |
0~255 | 1 | 8 使 ç¬¦å·æ´æ° | octet |
uint8_t |
Uint8ClampedArray |
0~255 | 1 | 8 使 ç¬¦å·æ´æ°ï¼å¼ä¼è¢«è£åªï¼ | octet |
uint8_t |
Int16Array |
-32768~32767 | 2 | 16 ä½æç¬¦å·æ´æ°ï¼è¡¥ç ï¼ | short |
int16_t |
Uint16Array |
0~65535 | 2 | 16 使 ç¬¦å·æ´æ° | unsigned short |
uint16_t |
Int32Array |
-2147483648~2147483647 | 4 | 32 ä½æç¬¦å·æ´æ°ï¼è¡¥ç ï¼ | long |
int32_t |
Uint32Array |
0~4294967295 | 4 | 32 使 ç¬¦å·æ´æ° | unsigned long |
uint32_t |
Float32Array |
-3.4E38~3.4E38 以å 1.2E-38ï¼æå°æ£æ°ï¼ |
4 | 32 ä½ IEEE æµ®ç¹æ°ï¼7 ä½æææ°åï¼ä¾å¦ 1.123456ï¼ |
unrestricted float |
float |
Float64Array |
-1.8E308~1.8E308 以å 5E-324ï¼æå°æ£æ°ï¼ |
8 | 64 ä½ IEEE æµ®ç¹æ°ï¼16 ä½æææ°åï¼ä¾å¦ 1.123...15ï¼ |
unrestricted double |
double |
BigInt64Array |
-263~263 - 1 | 8 | 64 ä½æç¬¦å·æ´æ°ï¼è¡¥ç ï¼ | bigint |
int64_t (signed long long) |
BigUint64Array |
0~264 - 1 | 8 | 64 使 ç¬¦å·æ´æ° | bigint |
uint64_t (unsigned long long) |
ææç±»ååæ°ç»ç±»å齿ç¸åçæ¹æ³ä¸å±æ§ï¼è¿äºæ¹æ³ä¸å±æ§ç± TypedArray ç±»å®ä¹ãå®ä»¬çå¯ä¸åºå«å¨äºåºå±æ°æ®ç±»åååèæ°çä¸åãè¿å¨å¼ç¼ç 䏿 ååä¸æè¯¦ç»è®¨è®ºã
ç±»ååæ°ç»åå䏿¯åºå®é¿åº¦çï¼å æ¤å¹¶ä¸åå¨å¯ä»¥æ¹åæ°ç»é¿åº¦çæ¹æ³ï¼å¦ popãpushãshiftãsplice å unshiftãæ¤å¤ï¼flat ä¹ä¸å¯ç¨ï¼å 为类ååæ°ç»æ æ³åµå¥ï¼concat å flatMap 忝ç±äºåºç¨åºæ¯ä¸å¤§ï¼äº¦ä¸å¯ç¨ãç±äº splice ä¸å¯ç¨ï¼å æ¤ toSpliced ä¹ä¸å¯ç¨ãææå
¶ä»æ°ç»æ¹æ³é½æ¯ Array å TypedArray å
±äº«çã
å¦ä¸æ¹é¢ï¼ç±»ååæ°ç»æé¢å¤ç set å subarray æ¹æ³ï¼å¯ä»¥ç¨æ¥ä¼åâåç¼å²å¤è§å¾âçåºæ¯ãset() æ¹æ³å
è®¸ä½ ä½¿ç¨ä¸ä¸ªæ°ç»æç±»ååæ°ç»çæ°æ®ï¼æ¥å¯¹å¦ä¸ä¸ªç±»ååæ°ç»çå¤ä¸ªç´¢å¼åæ¶è¿è¡è®¾ç½®ãå¦æä¸¤ä¸ªç±»ååæ°ç»å
±äº«åä¸ä¸ªåºå±ç¼å²ï¼é£ä¹è¿ä¸ªæä½å¯è½ä¼æ´å 髿ï¼å ä¸ºè¿æ¯ä¸ä¸ªå¿«éçå
åç§»å¨ãsubarray() æ¹æ³å建ä¸ä¸ªæ°çç±»ååæ°ç»è§å¾ï¼å®å¼ç¨ä¸åå§ç±»ååæ°ç»ç¸åçç¼å²ï¼ä½æ¯èå´æ´çªã
å¨ä¸æ¹ååºå±ç¼å²çåæä¸ï¼æ æ³ç´æ¥æ¹åç±»ååæ°ç»çé¿åº¦ã使¯ï¼å½ç±»ååæ°ç»çåºå±æ¯å¯è°æ´å¤§å°çç¼å²ï¼ä¸æ²¡æåºå®ç byteLength æ¶ï¼å®å°±ä¼è·è¸ªé¿åº¦ï¼å³å®çé¿åº¦ä¼éçç¼å²ç大å°èèªå¨è°æ´ã详æ
请åé
åºå±ä¸ºå¯å大å°ç¼å²æ¶çè¡ä¸ºã
ç±»ä¼¼äºæ®éæ°ç»ï¼ä½ å¯ä»¥ä½¿ç¨æ¹æ¬å·è¡¨ç¤ºæ³æ¥è®¿é®ç±»ååæ°ç»çå ç´ ãåºå±ç¼å²ä¸å¯¹åºçåèä¼è¢«è§£æä¸ºä¸ä¸ªæ°åãä»»ä½ä½¿ç¨æ°åï¼ææ°åçå符串表示ï¼å 为æ°åæ»æ¯å¨è®¿é®å±æ§æ¶è¢«è½¬æ¢ä¸ºå符串ï¼ç屿§è®¿é®é½ä¼è¢«ç±»ååæ°ç»ä»£çââå®ä»¬æ°¸è¿ä¸ä¼ä¸å¯¹è±¡æ¬èº«äº¤äºãè¿æå³çï¼ä¾å¦ï¼
- è¶
è¶è¾¹çç´¢å¼çè®¿é®æ»æ¯è¿å
undefinedï¼èä¸ä¼å®é 访é®å¯¹è±¡ä¸ç屿§ã - ä»»ä½å°è¯åå ¥è¶ è¶è¾¹çç屿§çè¡ä¸ºé½ä¸ä¼çæï¼å®æ¢ä¸ä¼æåºé误ï¼ä¹ä¸ä¼æ¹åç¼å²æç±»ååæ°ç»ã
- ç±»ååæ°ç»çç´¢å¼çèµ·æ¥æ¯å¯é ç½®çåå¯åçï¼ä½æ¯ä»»ä½æ¹åå®ä»¬ç屿§çå°è¯é½ä¼å¤±è´¥ã
const uint8 = new Uint8Array([1, 2, 3]);
console.log(uint8[0]); // 1
// ä»
ç¨ä½ç¤ºä¾ãä¸è¦å¨ç产代ç ä¸ä½¿ç¨ã
uint8[-1] = 0;
uint8[2.5] = 0;
uint8[NaN] = 0;
console.log(Object.keys(uint8)); // ["0", "1", "2"]
console.log(uint8[NaN]); // undefined
// éæ°å访é®ä»ç¶ææ
uint8[true] = 0;
console.log(uint8[true]); // 0
Object.freeze(uint8); // TypeErrorï¼æ æ³å»ç»é空ç¼å²çè§å¾
DataView
DataView æ¯ä¸ç§åºå±æ¥å£ï¼å®æä¾å¯ä»¥æä½ç¼å²ä¸ä»»ææ°æ®ç getter/setter APIãè¿å¯¹æä½ä¸åç±»åæ°æ®çåºæ¯å¾æå¸®å©ï¼ä¾å¦ï¼ç±»ååæ°ç»è§å¾é½æ¯è¿è¡å¨æ¬å°åèåºæ¨¡å¼ï¼åèåèåºï¼ï¼å¯ä»¥éè¿ä½¿ç¨ DataView æ¥æ§å¶åèåºãé»è®¤æ¯å¤§ç«¯åèåºï¼big-endianï¼ï¼ä½å¯ä»¥è°ç¨ getter/setter æ¹æ³æ¹ä¸ºå°ç«¯åèåºï¼little-endianï¼ã
DataView ä¸éè¦å¯¹é½ï¼å¤åè读åå¯ä»¥ä»ä»»ææå®çåç§»éå¼å§ãsetter æ¹æ³ä¹æ¯å¦æ¤ã
ä¸é¢çä¾åä½¿ç¨ DataView æ¥è·åä»»ææ°åçäºè¿å¶è¡¨ç¤ºï¼
function toBinary(
x,
{ type = "Float64", littleEndian = false, separator = " ", radix = 16 } = {},
) {
const bytesNeeded = globalThis[`${type}Array`].BYTES_PER_ELEMENT;
const dv = new DataView(new ArrayBuffer(bytesNeeded));
dv[`set${type}`](0, x, littleEndian);
const bytes = Array.from({ length: bytesNeeded }, (_, i) =>
dv
.getUint8(i)
.toString(radix)
.padStart(8 / Math.log2(radix), "0"),
);
return bytes.join(separator);
}
console.log(toBinary(1.1)); // 3f f1 99 99 99 99 99 9a
console.log(toBinary(1.1, { littleEndian: true })); // 9a 99 99 99 99 99 f1 3f
console.log(toBinary(20, { type: "Int8", radix: 2 })); // 00010100
使ç¨ç±»ååæ°ç»ç Web API
ä¸é¢æ¯ä¸äºä½¿ç¨ç±»ååæ°ç»ç API 示ä¾ï¼å ¶å¹¶ä¸å®æ´ï¼æä»¬ä¼å¨æªæ¥æ·»å æ´å¤ç¤ºä¾ã
FileReader.prototype.readAsArrayBuffer()-
FileReader.prototype.readAsArrayBuffer()读å对åºçBlobæFileçå 容 XMLHttpRequest.prototype.send()-
XMLHttpRequestå®ä¾çsend()æ¹æ³ç°å¨æ¯æä½¿ç¨ç±»ååæ°ç»åArrayBuffer对象ä½ä¸ºåæ°ã ImageData.data-
æ¯ä¸ä¸ª
Uint8ClampedArray对象ï¼ç¨æ¥æè¿°å å«æç § RGBA åºåçé¢è²æ°æ®çä¸ç»´æ°ç»ï¼å ¶å¼çèå´å¨0å°255ä¹é´ã
示ä¾
>使ç¨è§å¾åç¼å²
é¦å ï¼æä»¬éè¦å建ä¸ä¸ª 16 åèåºå®é¿åº¦çç¼å²ï¼
const buffer = new ArrayBuffer(16);
ç°å¨æä»¬æäºä¸æ®µåå§å为 0 çå åï¼ç®åè¿åä¸äºä»ä¹å¤ªå¤æä½ã让æä»¬ç¡®è®¤ä¸ä¸æ°æ®çåèé¿åº¦ï¼
if (buffer.byteLength === 16) {
console.log("æ¯ 16 åèã");
} else {
console.log("大尿é®é¢ï¼");
}
å¨å®é å¼å§æä½è¿ä¸ªç¼å²ä¹åï¼è¿éè¦ä¸ä¸ªè§å¾ãç°å¨ï¼æä»¬å°±å建ä¸ä¸ªè§å¾ï¼è¯¥è§å¾å°æç¼å²å çæ°æ®è§ä¸ºä¸ä¸ª 32 ä½æç¬¦å·æ´æ°æ°ç»ï¼
const int32View = new Int32Array(buffer);
ç°å¨æä»¬å¯ä»¥åæ®éæ°ç»ä¸æ ·è®¿é®è¯¥æ°ç»ä¸çå ç´ ï¼
for (let i = 0; i < int32View.length; i++) {
int32View[i] = i * 2;
}
该代ç ä¼å°æ°ç»ä»¥ 0ã2ã4 å 6 å¡«å
ï¼ä¸å
± 4 个 4 åèå
ç´ ï¼æä»¥æ»é¿åº¦ä¸º 16 åèï¼ã
ç¸åæ°æ®ä¸çå¤ä¸ªè§å¾
æ´æææçæ¯ï¼ä½ å¯ä»¥å¨å䏿°æ®ä¸å建å¤ä¸ªè§å¾ãä¾å¦ï¼åºäºä¸æç代ç ï¼æä»¬å¯ä»¥åè¿æ ·ç»§ç»æä½ï¼
const int16View = new Int16Array(buffer);
for (let i = 0; i < int16View.length; i++) {
console.log(`ç´¢å¼ ${i}ï¼${int16View[i]}`);
}
è¿éæä»¬å建äºä¸ä¸ª 16 使´æ°è§å¾ï¼è¯¥è§å¾å
±äº«ä¸æç 32 使´æ°è§å¾çç¼å²ï¼ç¶å以 16 使´æ°æå°åºç¼å²éçæ°æ®ï¼è¿æ¬¡æä»¬ä¼å¾å° 0ã0ã2ã0ã4ã0ã6ã0 è¿æ ·çè¾åºï¼å设æ¯å°ç«¯åºç¼ç ï¼ã
Int16Array | 0 | 0 | 2 | 0 | 4 | 0 | 6 | 0 | Int32Array | 0 | 2 | 4 | 6 | ArrayBuffer | 00 00 00 00 | 02 00 00 00 | 04 00 00 00 | 06 00 00 00 |
è¿ä¸æ¥å°ï¼
int16View[0] = 32;
console.log(`32 使°ç»çç´¢å¼ 0 夿°æ®æ¯ï¼${int32View[0]}`);
è¿æ¬¡çè¾åºæ¯ "32 使°ç»çç´¢å¼ 0 夿°æ®æ¯ï¼32"ãä¹å°±æ¯ï¼è¿ 2 个æ°ç»é½æ¯å䏿°æ®ç以ä¸åæ ¼å¼å±ç¤ºåºæ¥çè§å¾ã
Int16Array | 32 | 0 | 2 | 0 | 4 | 0 | 6 | 0 | Int32Array | 32 | 2 | 4 | 6 | ArrayBuffer | 20 00 00 00 | 02 00 00 00 | 04 00 00 00 | 06 00 00 00 |
ä½ å¯ä»¥å¯¹ä»»æè§å¾ç±»åè¿è¡è¿æ ·çæä½ï¼å°½ç®¡å¦æä½ 设置ä¸ä¸ªæ´æ°ï¼ç¶åä»¥æµ®ç¹æ°çå½¢å¼è¯»åå®ï¼ä½ å¯è½ä¼å¾å°ä¸ä¸ªå¥æªçç»æï¼å 为ä½çè§£éæ¹å¼ä¸åã
const float32View = new Float32Array(buffer);
console.log(float32View[0]); // 4.484155085839415e-44
ä»ç¼å²è¯»åææ¬
ç¼å²å¹¶ä¸æ»æ¯è¡¨ç¤ºæ°åãä¾å¦ï¼è¯»åæä»¶å¯ä»¥ç»ä½ ä¸ä¸ªææ¬æ°æ®ç¼å²ãä½ å¯ä»¥ä½¿ç¨ç±»ååæ°ç»ä»ç¼å²ä¸è¯»åè¿äºæ°æ®ã
ä¸é¢ç代ç ä½¿ç¨ TextDecoder web API 读å UTF-8 ææ¬ï¼
const buffer = new ArrayBuffer(8);
const uint8 = new Uint8Array(buffer);
// æä»¬æå¨åå
¥æ°æ®ï¼åè£
å®å·²ç»å¨ç¼å²åºä¸äº
uint8.set([228, 189, 160, 229, 165, 189]);
const text = new TextDecoder().decode(uint8);
console.log(text); // "ä½ å¥½"
ä¸é¢ç代ç ä½¿ç¨ String.fromCharCode() æ¹æ³è¯»å UTF-16 ææ¬ï¼
const buffer = new ArrayBuffer(8);
const uint16 = new Uint16Array(buffer);
// æä»¬æå¨åå
¥æ°æ®ï¼åè£
å®å·²ç»å¨ç¼å²åºä¸äº
uint16.set([0x4f60, 0x597d]);
const text = String.fromCharCode(...uint16);
console.log(text); // "ä½ å¥½"
使ç¨å¤æçæ°æ®ç»æ
éè¿å°ç¼å²ä¸ä¸åç±»åè§å¾ç»åï¼ä»¥åä¿®æ¹å å访é®çåç§»éï¼ä½ å¯ä»¥æä½å 嫿´å¤æ´å¤ææ°æ®ç»æçæ°æ®ãä¾å¦ï¼ä½ å¯ä»¥æä½è¯¸å¦ WebGL ææ°æ®æä»¶è¿äºå¤æçæ°æ®ç»æã
请çå¦ä¸ç C è¯è¨ç»æä½ï¼
struct someStruct {
unsigned long id;
char username[16];
float amountDue;
};
ä½ å¯ä»¥éç¨å¦ä¸ä»£ç 访é®ä¸ä¸ªå 嫿¤ç±»ç»æä½çç¼å²ï¼
const buffer = new ArrayBuffer(24);
// â¦å°æ°æ®è¯»å
¥ç¼å²â¦
const idView = new Uint32Array(buffer, 0, 1);
const usernameView = new Uint8Array(buffer, 4, 16);
const amountDueView = new Float32Array(buffer, 20, 1);
è¿æ ·ä¸æ¥ï¼ä½ å°±å¾å°äºä¸ä¸ªç±»ä¼¼çæ°æ®ç»æï¼ä¾å¦ï¼amountDueView[0] 对åºäº C ç amountDue åæ®µã
夿³¨ï¼C è¯è¨ç»æä½çæ°æ®å¯¹é½ä¸å¹³å°ç¸å ³ãå æ¤éè¦é²èåèèä¸åå¹³å°åèå¡«å 对é½çå·®å¼ã
转æ¢ä¸ºæ®éæ°ç»
å¨å¤çå®ä¸ä¸ªç±»ååæ°ç»åï¼ææ¶éè¦æå®è½¬ä¸ºæ®éæ°ç»ï¼ä»¥ä¾¿å¯ä»¥ä» Array ååä¸åçãå¯ä»¥éè¿ä½¿ç¨ Array.from() å®ç°ï¼
const typedArray = new Uint8Array([1, 2, 3, 4]);
const normalArray = Array.from(typedArray);
ä¹å¯ä»¥ä½¿ç¨å±å¼è¯æ³ã
const typedArray = new Uint8Array([1, 2, 3, 4]);
const normalArray = [...typedArray];