å¨ Web å¼åä¸ï¼å½æä»¬å¤çæä»¶æ¶ï¼å建ï¼ä¸ä¼ ï¼ä¸è½½ï¼ï¼ç»å¸¸ä¼éå°äºè¿å¶æ°æ®ãå¦ä¸ä¸ªå ¸åçåºç¨åºæ¯æ¯å¾åå¤çã
è¿äºé½å¯ä»¥éè¿ JavaScript è¿è¡å¤çï¼èä¸äºè¿å¶æä½æ§è½æ´é«ã
ä¸è¿ï¼å¨ JavaScript 䏿å¾å¤ç§äºè¿å¶æ°æ®æ ¼å¼ï¼ä¼æç¹å®¹ææ··æ·ãä» ä¸¾å 个ä¾åï¼
ArrayBufferï¼Uint8Arrayï¼DataViewï¼Blobï¼Fileåå ¶ä»ã
ä¸å ¶ä»è¯è¨ç¸æ¯ï¼JavaScript ä¸çäºè¿å¶æ°æ®æ¯ä»¥éæ åæ¹å¼å®ç°çã使¯ï¼å½æä»¬çæ¸ æ¥ä»¥åï¼ä¸åå°±ä¼åå¾ç¸å½ç®åäºã
åºæ¬çäºè¿å¶å¯¹è±¡æ¯ ArrayBuffer ââ 对åºå®é¿åº¦çè¿ç»å
å空é´çå¼ç¨ã
æä»¬è¿æ ·å建å®ï¼
let buffer = new ArrayBuffer(16); // å建ä¸ä¸ªé¿åº¦ä¸º 16 ç buffer
alert(buffer.byteLength); // 16
å®ä¼åé ä¸ä¸ª 16 åèçè¿ç»å å空é´ï¼å¹¶ç¨ 0 è¿è¡é¢å¡«å ã
ArrayBuffer 䏿¯æç§ä¸è¥¿çæ°ç»è®©æä»¬å
æ¾æ¸
ä¸ä¸ªå¯è½ç误åºãArrayBuffer ä¸ Array 没æä»»ä½å
±åä¹å¤ï¼
- å®çé¿åº¦æ¯åºå®çï¼æä»¬æ æ³å¢å æåå°å®çé¿åº¦ã
- 宿£å¥½å ç¨äºå åä¸çé£ä¹å¤ç©ºé´ã
- è¦è®¿é®å个åèï¼éè¦å¦ä¸ä¸ªâè§å¾â对象ï¼è䏿¯
buffer[index]ã
ArrayBuffer æ¯ä¸ä¸ªå
ååºåãå®éé¢åå¨äºä»ä¹ï¼æ ä»å¤æãåªæ¯ä¸ä¸ªåå§çåèåºåã
å¦è¦æä½ ArrayBufferï¼æä»¬éè¦ä½¿ç¨âè§å¾â对象ã
è§å¾å¯¹è±¡æ¬èº«å¹¶ä¸åå¨ä»»ä½ä¸è¥¿ã宿¯ä¸å¯âç¼éâï¼éè¿å®æ¥è§£éåå¨å¨ ArrayBuffer ä¸çåèã
ä¾å¦ï¼
Uint8Arrayââ å°ArrayBufferä¸çæ¯ä¸ªåèè§ä¸º 0 å° 255 ä¹é´çå个æ°åï¼æ¯ä¸ªåèæ¯ 8 ä½ï¼å æ¤åªè½å®¹çº³é£ä¹å¤ï¼ãè¿ç§°ä¸º â8 使 ç¬¦å·æ´æ°âãUint16Arrayââ å°æ¯ 2 个åèè§ä¸ºä¸ä¸ª 0 å° 65535 ä¹é´çæ´æ°ãè¿ç§°ä¸º â16 使 ç¬¦å·æ´æ°âãUint32Arrayââ å°æ¯ 4 个åèè§ä¸ºä¸ä¸ª 0 å° 4294967295 ä¹é´çæ´æ°ãè¿ç§°ä¸º â32 使 ç¬¦å·æ´æ°âãFloat64Arrayââ å°æ¯ 8 个åèè§ä¸ºä¸ä¸ª5.0x10-324å°1.8x10308ä¹é´çæµ®ç¹æ°ã
å æ¤ï¼ä¸ä¸ª 16 åè ArrayBuffer ä¸çäºè¿å¶æ°æ®å¯ä»¥è§£é为 16 个âå°æ°åâï¼æ 8 个æ´å¤§çæ°åï¼æ¯ä¸ªæ°å 2 个åèï¼ï¼æ 4 个æ´å¤§çæ°åï¼æ¯ä¸ªæ°å 4 个åèï¼ï¼æ 2 个é«ç²¾åº¦çæµ®ç¹æ°ï¼æ¯ä¸ªæ°å 8 个åèï¼ã
ArrayBuffer æ¯æ ¸å¿å¯¹è±¡ï¼æ¯ææçåºç¡ï¼æ¯åå§çäºè¿å¶æ°æ®ã
使¯ï¼å¦ææä»¬è¦åå ¥å¼æéåå®ï¼åºæ¬ä¸å 乿ææä½ ââ æä»¬å¿ é¡»ä½¿ç¨è§å¾ï¼viewï¼ï¼ä¾å¦ï¼
let buffer = new ArrayBuffer(16); // å建ä¸ä¸ªé¿åº¦ä¸º 16 ç buffer
let view = new Uint32Array(buffer); // å° buffer è§ä¸ºä¸ä¸ª 32 使´æ°çåºå
alert(Uint32Array.BYTES_PER_ELEMENT); // æ¯ä¸ªæ´æ° 4 个åè
alert(view.length); // 4ï¼å®åå¨äº 4 ä¸ªæ´æ°
alert(view.byteLength); // 16ï¼åèä¸ç大å°
// 让æä»¬åå
¥ä¸ä¸ªå¼
view[0] = 123456;
// éåå¼
for(let num of view) {
alert(num); // 123456ï¼ç¶å 0ï¼0ï¼0ï¼ä¸å
± 4 个å¼ï¼
}
TypedArray
ææè¿äºè§å¾ï¼Uint8Arrayï¼Uint32Array çï¼çéç¨æ¯è¯æ¯ TypedArrayãå®ä»¬å
±äº«å䏿¹æ³å屿§éã
请注æï¼æ²¡æå为 TypedArray çæé å¨ï¼å®åªæ¯è¡¨ç¤º ArrayBuffer ä¸çè§å¾ä¹ä¸çéç¨æ»ç§°æ¯è¯ï¼Int8Arrayï¼Uint8Array åå
¶ä»ï¼å¾å¿«å°±ä¼æå®æ´å表ã
å½ä½ çå° new TypedArray ä¹ç±»çå
容æ¶ï¼å®è¡¨ç¤º new Int8Arrayãnew Uint8Array åå
¶ä»ä¸ä¹ä¸ã
ç±»ååæ°ç»çè¡ä¸ºç±»ä¼¼äºå¸¸è§æ°ç»ï¼å ·æç´¢å¼ï¼å¹¶ä¸æ¯å¯è¿ä»£çã
ä¸ä¸ªç±»ååæ°ç»çæé å¨ï¼æ è®ºæ¯ Int8Array æ Float64Arrayï¼é½æ å
³ç´§è¦ï¼ï¼å
¶è¡ä¸ºåä¸ç¸åï¼å¹¶ä¸åå³äºåæ°ç±»åã
åæ°æ 5 ç§åä½ï¼
new TypedArray(buffer, [byteOffset], [length]);
new TypedArray(object);
new TypedArray(typedArray);
new TypedArray(length);
new TypedArray();
-
妿ç»å®çæ¯
ArrayBufferåæ°ï¼åä¼å¨å ¶ä¸å建è§å¾ãæä»¬å·²ç»ç¨è¿è¯¥è¯æ³äºãå¯éï¼æä»¬å¯ä»¥ç»å®èµ·å§ä½ç½®
byteOffsetï¼é»è®¤ä¸º 0ï¼ä»¥ålengthï¼é»è®¤è³ buffer çæ«å°¾ï¼ï¼è¿æ ·è§å¾å°ä» æ¶µçbufferçä¸é¨åã -
妿ç»å®çæ¯
Arrayï¼æä»»ä½ç±»æ°ç»å¯¹è±¡ï¼åä¼å建ä¸ä¸ªç¸åé¿åº¦çç±»ååæ°ç»ï¼å¹¶å¤å¶å ¶å 容ãæä»¬å¯ä»¥ä½¿ç¨å®æ¥é¢å¡«å æ°ç»çæ°æ®ï¼
let arr = new Uint8Array([0, 1, 2, 3]); alert( arr.length ); // 4ï¼å建äºç¸åé¿åº¦çäºè¿å¶æ°ç» alert( arr[1] ); // 1ï¼ç¨ç»å®å¼å¡«å äº 4 个åèï¼æ ç¬¦å· 8 使´æ°ï¼ -
妿ç»å®çæ¯å¦ä¸ä¸ª
TypedArrayï¼ä¹æ¯å¦æ¤ï¼å建ä¸ä¸ªç¸åé¿åº¦çç±»ååæ°ç»ï¼å¹¶å¤å¶å ¶å 容ã妿éè¦çè¯ï¼æ°æ®å¨æ¤è¿ç¨ä¸ä¼è¢«è½¬æ¢ä¸ºæ°çç±»åãlet arr16 = new Uint16Array([1, 1000]); let arr8 = new Uint8Array(arr16); alert( arr8[0] ); // 1 alert( arr8[1] ); // 232ï¼è¯å¾å¤å¶ 1000ï¼ä½æ æ³å° 1000 æ¾è¿ 8 ä½åèä¸ï¼è¯¦è¿°è§ä¸æï¼ã -
å¯¹äºæ°ååæ°
lengthââ å建类ååæ°ç»ä»¥å å«è¿ä¹å¤å ç´ ãå®çåèé¿åº¦å°æ¯lengthä¹ä»¥å个TypedArray.BYTES_PER_ELEMENTä¸çåèæ°ï¼let arr = new Uint16Array(4); // 为 4 ä¸ªæ´æ°å建类ååæ°ç» alert( Uint16Array.BYTES_PER_ELEMENT ); // æ¯ä¸ªæ´æ° 2 个åè alert( arr.byteLength ); // 8ï¼åèä¸ç大å°ï¼ -
ä¸å¸¦åæ°çæ åµä¸ï¼å建é¿åº¦ä¸ºé¶çç±»ååæ°ç»ã
æä»¬å¯ä»¥ç´æ¥å建ä¸ä¸ª TypedArrayï¼èæ éæå ArrayBufferã使¯ï¼è§å¾ç¦»ä¸å¼åºå±ç ArrayBufferï¼å æ¤ï¼é¤ç¬¬ä¸ç§æ
åµï¼å·²æä¾ ArrayBufferï¼å¤ï¼å
¶ä»æææ
åµé½ä¼èªå¨å建 ArrayBufferã
å¦è¦è®¿é®åºå±ç ArrayBufferï¼é£ä¹å¨ TypedArray 䏿å¦ä¸ç屿§ï¼
arr.bufferââ å¼ç¨ArrayBufferãarr.byteLengthââArrayBufferçé¿åº¦ã
å æ¤ï¼æä»¬æ»æ¯å¯ä»¥ä»ä¸ä¸ªè§å¾è½¬å°å¦ä¸ä¸ªè§å¾ï¼
let arr8 = new Uint8Array([0, 1, 2, 3]);
// å䏿°æ®çå¦ä¸ä¸ªè§å¾
let arr16 = new Uint16Array(arr8.buffer);
ä¸é¢æ¯ç±»ååæ°ç»çå表ï¼
Uint8Arrayï¼Uint16Arrayï¼Uint32Arrayââ ç¨äº 8ã16 å 32 ä½çæ´æ°ãUint8ClampedArrayââ ç¨äº 8 使´æ°ï¼å¨èµå¼æ¶ä¾¿âåºå®âå ¶å¼ï¼è§ä¸æï¼ã
Int8Arrayï¼Int16Arrayï¼Int32Arrayââ ç¨äºæç¬¦å·æ´æ°ï¼å¯ä»¥ä¸ºè´æ°ï¼ãFloat32Arrayï¼Float64Arrayââ ç¨äº 32 ä½å 64 ä½çæç¬¦å·æµ®ç¹æ°ã
int8 æç±»ä¼¼çåå¼ç±»å请注æï¼å°½ç®¡æç±»ä¼¼ Int8Array è¿æ ·çåç§°ï¼ä½ JavaScript ä¸å¹¶æ²¡æå intï¼æ int8 è¿æ ·çåå¼ç±»åã
è¿æ¯åä¹é»è¾çï¼å 为 Int8Array 䏿¯è¿äºåå¼çæ°ç»ï¼èæ¯ ArrayBuffer ä¸çè§å¾ã
è¶çè¡ä¸º
妿æä»¬å°è¯å°è¶çå¼åå ¥ç±»ååæ°ç»ä¼åºç°ä»ä¹æ åµï¼ä¸ä¼æ¥éã使¯å¤ä½çä½è¢«åé¤ã
ä¾å¦ï¼æä»¬å°è¯å° 256 æ¾å
¥ Uint8Arrayã256 çäºè¿å¶æ ¼å¼æ¯ 100000000ï¼9 ä½ï¼ï¼ä½ Uint8Array æ¯ä¸ªå¼åªæ 8 ä½ï¼å æ¤å¯ç¨èå´ä¸º 0 å° 255ã
å¯¹äºæ´å¤§çæ°åï¼ä» å卿å³è¾¹çï¼ä½ä½ææï¼8 ä½ï¼å ¶ä½é¨å被åé¤ï¼
å æ¤ç»ææ¯ 0ã
257 çäºè¿å¶æ ¼å¼æ¯ 100000001ï¼9 ä½ï¼ï¼æå³è¾¹ç 8 ä½ä¼è¢«åå¨ï¼å æ¤æ°ç»ä¸ä¼æ 1ï¼
æ¢å¥è¯è¯´ï¼è¯¥æ°å对 28 忍¡çç»æè¢«ä¿åäºä¸æ¥ã
示ä¾å¦ä¸ï¼
let uint8array = new Uint8Array(16);
let num = 256;
alert(num.toString(2)); // 100000000ï¼äºè¿å¶è¡¨ç¤ºï¼
uint8array[0] = 256;
uint8array[1] = 257;
alert(uint8array[0]); // 0
alert(uint8array[1]); // 1
Uint8ClampedArray å¨è¿æ¹é¢æ¯è¾ç¹æ®ï¼å®ç表ç°ä¸å¤ªä¸æ ·ã对äºå¤§äº 255 ç任使°åï¼å®å°ä¿å为 255ï¼å¯¹äºä»»ä½è´æ°ï¼å®å°ä¿å为 0ãæ¤è¡ä¸ºå¯¹äºå¾åå¤ç徿ç¨ã
TypedArray æ¹æ³
TypedArray å
·æå¸¸è§ç Array æ¹æ³ï¼ä½æä¸ªææ¾çä¾å¤ã
æä»¬å¯ä»¥éåï¼iterateï¼ï¼mapï¼sliceï¼find å reduce çã
使å ä»¶äºæä»¬åä¸äºï¼
- 没æ
spliceââ æä»¬æ æ³âå é¤âä¸ä¸ªå¼ï¼å 为类ååæ°ç»æ¯ç¼å²åºï¼bufferï¼ä¸çè§å¾ï¼å¹¶ä¸ç¼å²åºï¼bufferï¼æ¯åºå®çãè¿ç»çå ååºåãæä»¬æè½åçå°±æ¯åé ä¸ä¸ªé¶å¼ã - æ
concatæ¹æ³ã
è¿æä¸¤ç§å ¶ä»æ¹æ³ï¼
arr.set(fromArr, [offset])ä»offsetï¼é»è®¤ä¸º 0ï¼å¼å§ï¼å°fromArrä¸çææå ç´ å¤å¶å°arrãarr.subarray([begin, end])å建ä¸ä¸ªä»beginå°endï¼ä¸å æ¬ï¼ç¸åç±»åçæ°è§å¾ãè¿ç±»ä¼¼äºsliceæ¹æ³ï¼åæ ·ä¹æ¯æï¼ï¼ä½ä¸å¤å¶ä»»ä½å 容 ââ åªæ¯å建ä¸ä¸ªæ°è§å¾ï¼ä»¥å¯¹ç»å®çæ®µçæ°æ®è¿è¡æä½ã
æäºè¿äºæ¹æ³ï¼æä»¬å¯ä»¥å¤å¶ãæ··åç±»ååæ°ç»ï¼ä»ç°ææ°ç»åå»ºæ°æ°ç»çã
DataView
DataView æ¯å¨ ArrayBuffer ä¸çä¸ç§ç¹æ®çè¶
çµæ´»âæªç±»ååâè§å¾ãå®å
è®¸ä»¥ä»»ä½æ ¼å¼è®¿é®ä»»ä½åç§»éï¼offsetï¼çæ°æ®ã
- 对äºç±»ååçæ°ç»ï¼æé å¨å³å®äºå
¶æ ¼å¼ãæ´ä¸ªæ°ç»åºè¯¥æ¯ç»ä¸çã第 i 个æ°åæ¯
arr[i]ã - éè¿
DataViewï¼æä»¬å¯ä»¥ä½¿ç¨.getUint8(i)æ.getUint16(i)ä¹ç±»çæ¹æ³è®¿é®æ°æ®ãæä»¬å¨è°ç¨æ¹æ³æ¶éæ©æ ¼å¼ï¼è䏿¯å¨æé çæ¶åã
è¯æ³ï¼
new DataView(buffer, [byteOffset], [byteLength])
bufferââ åºå±çArrayBufferãä¸ç±»ååæ°ç»ä¸åï¼DataViewä¸ä¼èªè¡å建ç¼å²åºï¼bufferï¼ãæä»¬éè¦äºå åå¤å¥½ãbyteOffsetââ è§å¾çèµ·å§åèä½ç½®ï¼é»è®¤ä¸º 0ï¼ãbyteLengthââ è§å¾çåèé¿åº¦ï¼é»è®¤è³bufferçæ«å°¾ï¼ã
ä¾å¦ï¼è¿éæä»¬ä»åä¸ä¸ª buffer 䏿åä¸åæ ¼å¼çæ°åï¼
// 4 个åèçäºè¿å¶æ°ç»ï¼æ¯ä¸ªé½æ¯æå¤§å¼ 255
let buffer = new Uint8Array([255, 255, 255, 255]).buffer;
let dataView = new DataView(buffer);
// å¨åç§»é为 0 å¤è·å 8 使°å
alert( dataView.getUint8(0) ); // 255
// ç°å¨å¨åç§»é为 0 å¤è·å 16 使°åï¼å®ç± 2 个åèç»æï¼ä¸èµ·è§£æä¸º 65535
alert( dataView.getUint16(0) ); // 65535ï¼æå¤§ç 16 使 ç¬¦å·æ´æ°ï¼
// å¨åç§»é为 0 å¤è·å 32 使°å
alert( dataView.getUint32(0) ); // 4294967295ï¼æå¤§ç 32 使 ç¬¦å·æ´æ°ï¼
dataView.setUint32(0, 0); // å° 4 个åèçæ°å设为 0ï¼å³å°ææåèé½è®¾ä¸º 0
彿们尿··åæ ¼å¼çæ°æ®åå¨å¨åä¸ç¼å²åºï¼bufferï¼ä¸æ¶ï¼DataView é常æç¨ãä¾å¦ï¼å½æä»¬åå¨ä¸ä¸ªæå¯¹åºåï¼16 使´æ°ï¼32 使µ®ç¹æ°ï¼æ¶ï¼ç¨ DataView å¯ä»¥è½»æ¾è®¿é®å®ä»¬ã
æ»ç»
ArrayBuffer æ¯æ ¸å¿å¯¹è±¡ï¼æ¯å¯¹åºå®é¿åº¦çè¿ç»å
ååºåçå¼ç¨ã
å ä¹ä»»ä½å¯¹ ArrayBuffer çæä½ï¼é½éè¦ä¸ä¸ªè§å¾ã
- å®å¯ä»¥æ¯
TypedArrayï¼Uint8Arrayï¼Uint16Arrayï¼Uint32Arrayââ ç¨äº 8 ä½ã16 ä½å 32 使 ç¬¦å·æ´æ°ãUint8ClampedArrayââ ç¨äº 8 使´æ°ï¼å¨èµå¼æ¶ä¾¿âåºå®âå ¶å¼ãInt8Arrayï¼Int16Arrayï¼Int32Arrayââ ç¨äºæç¬¦å·æ´æ°ï¼å¯ä»¥ä¸ºè´æ°ï¼ãFloat32Arrayï¼Float64Arrayââ ç¨äº 32 ä½å 64 ä½çæç¬¦å·æµ®ç¹æ°ã
- æ
DataViewââ ä½¿ç¨æ¹æ³æ¥æå®æ ¼å¼çè§å¾ï¼ä¾å¦ï¼getUint8(offset)ã
å¨å¤§å¤æ°æ
åµä¸ï¼æä»¬ç´æ¥å¯¹ç±»ååæ°ç»è¿è¡å建åæä½ï¼èå° ArrayBuffer ä½ä¸ºâå
±åä¹å¤ï¼common denominatorï¼âéèèµ·æ¥ãæä»¬å¯ä»¥éè¿ .buffer æ¥è®¿é®å®ï¼å¹¶å¨éè¦æ¶å建å¦ä¸ä¸ªè§å¾ã
è¿æå¦å¤ä¸¤ä¸ªæ¯è¯ï¼ç¨äºå¯¹äºè¿å¶æ°æ®è¿è¡æä½çæ¹æ³çæè¿°ï¼
ArrayBufferViewæ¯ææè¿äºè§å¾çæ»ç§°ãBufferSourceæ¯ArrayBufferæArrayBufferViewçæ»ç§°ã
æä»¬å°å¨ä¸ä¸ç« ä¸å¦ä¹ è¿äºæ¯è¯ãBufferSource æ¯æå¸¸ç¨çæ¯è¯ä¹ä¸ï¼å 为å®çæææ¯âä»»ä½ç±»åçäºè¿å¶æ°æ®â ââ ArrayBuffer æå
¶ä¸çè§å¾ã
è¿æ¯ä¸ä»½å¤å¿åï¼
è¯è®º
<code>æ ç¾æå ¥åªæå 个è¯ç代ç ï¼æå ¥å¤è¡ä»£ç å¯ä»¥ä½¿ç¨<pre>æ ç¾ï¼å¯¹äºè¶ è¿ 10 è¡ç代ç ï¼å»ºè®®ä½ ä½¿ç¨æ²ç®±ï¼plnkrï¼JSBinï¼codepenâ¦ï¼