å¯è½¬ç§»ç对象ï¼Transferable objectï¼æ¯æ¥æå±äºèªå·±çèµæºç对象ï¼è¿äºèµæºå¯ä»¥ä»ä¸ä¸ªä¸ä¸æè½¬ç§»å°å¦ä¸ä¸ªï¼ç¡®ä¿èµæºä¸æ¬¡ä» å¨ä¸ä¸ªä¸ä¸æå¯ç¨ãä¼ è¾åï¼åå§å¯¹è±¡ä¸åå¯ç¨ï¼å®ä¸åæå转移åçèµæºï¼å¹¶ä¸ä»»ä½è¯»åæè åå ¥è¯¥å¯¹è±¡çå°è¯é½å°æåºå¼å¸¸ã
å¯è½¬ç§»å¯¹è±¡é常ç¨äºå
±äº«èµæºï¼è¯¥èµæºä¸æ¬¡ä»
è½å®å
¨å°æ´é²å¨ä¸ä¸ª JavaScript 线ç¨ä¸ãä¾å¦ï¼ArrayBuffer
æ¯ä¸ä¸ªæ¥æå
ååçå¯è½¬ç§»å¯¹è±¡ã彿¤ç±»ç¼å²åºï¼bufferï¼å¨çº¿ç¨ä¹é´ä¼ è¾æ¶ï¼ç¸å
³èçå
åèµæºå°ä»åå§çç¼å²åºåç¦»åºæ¥ï¼å¹¶ä¸éå å°æ°çº¿ç¨å建çç¼å²åºå¯¹è±¡ä¸ãåå§çº¿ç¨ä¸çç¼å²åºå¯¹è±¡ä¸åå¯ç¨ï¼å 为å®ä¸åæ¥æå±äºèªå·±çå
åèµæºäºã
ä½¿ç¨ structuredClone()
åå»ºå¯¹è±¡çæ·±å±æ·è´æ¶ï¼ä¹å¯ä»¥ä½¿ç¨è½¬ç§»ãå
éæä½åï¼ä¼ è¾çèµæºå°è¢«ç§»å¨å°å
éç对象ï¼è䏿¯å¤å¶ã
使ç¨è½¬ç§»å¯¹è±¡èµæºçæºå¶åå³äºå¯¹è±¡èªèº«ãä¾å¦ï¼å½ ArrayBuffer
å¨çº¿ç¨ä¹é´è½¬ç§»æ¶ï¼å®æåçå
åèµæºå®é
ä¸ä»¥å¿«éä¸é«æçé¶æ·è´æä½å¨ä¸ä¸æä¹é´ç§»å¨ãå
¶ä»å¯¹è±¡å¯ä»¥éè¿æ·è´å
³èçèµæºï¼ç¶åå°å®ä»æ§çä¸ä¸æä¸å 餿¥è½¬ç§»å®ã
并䏿¯ææçå¯¹è±¡é½æ¯å¯è½¬ç§»çãä¸é¢æä¾äºå¯è½¬ç§»å¯¹è±¡çå表ã
å¨çº¿ç¨ä¹é´ä¼ è¾å¯¹è±¡ä»¥ä¸ä»£ç æ¼ç¤ºäºå½æ¶æ¯ä»ä¸»çº¿ç¨åéå° web worker çº¿ç¨æ¶ï¼ä¼ è¾æ¯å¦ä½å·¥ä½çãUint8Array
å¨å
¶ç¼å²åºè¢«è½¬ç§»æ¶ï¼è¢«æ·è´å° worker ä¸ãä¼ è¾åï¼ä»»ä½å°è¯ä»ä¸»çº¿ç¨è¯»æè
å uInt8Array
é½å°æåºé误ï¼ä½æ¯ä½ ä»ç¶å¯ä»¥æ£æ¥ byteLength
以确å®å®ç°å¨æ¯ 0ã
// Create an 8MB "file" and fill it. 8MB = 1024 * 1024 * 8 B
const uInt8Array = new Uint8Array(1024 * 1024 * 8).map((v, i) => i);
console.log(uInt8Array.byteLength); // 8388608
// Transfer the underlying buffer to a worker
worker.postMessage(uInt8Array, [uInt8Array.buffer]);
console.log(uInt8Array.byteLength); // 0
夿³¨ï¼ å Int32Array
å Uint8Array
çç±»ååæ°ç»æ¯å¯åºååçï¼ä½æ¯ä¸è½è½¬ç§»ãç¶èï¼å®ä»¬çåºå±ç¼å²åºæ¯ä¸ä¸ª ArrayBuffer
ï¼å®æ¯ä¸ä¸ªå¯è½¬ç§»å¯¹è±¡ãæä»¬å¯ä»¥å¨æ°æ®åæ°ä¸åé uInt8Array.buffer
ï¼ä½æ¯ä¸è½å¨ä¼ è¾æ°ç»ä¸åé uInt8Array
ã
以ä¸ä»£ç å±ç¤ºäº structuredClone()
æä½ï¼å°åºå±ç¼å²åºä»åå§å¯¹è±¡å¤å¶å°å
é对象ï¼clone
ï¼ã
const original = new Uint8Array(1024);
const clone = structuredClone(original);
console.log(original.byteLength); // 1024
console.log(clone.byteLength); // 1024
original[0] = 1;
console.log(clone[0]); // 0
// Transferring the Uint8Array would throw an exception as it is not a transferable object
// const transferred = structuredClone(original, {transfer: [original]});
// We can transfer Uint8Array.buffer.
const transferred = structuredClone(original, { transfer: [original.buffer] });
console.log(transferred.byteLength); // 1024
console.log(transferred[0]); // 1
// After transferring Uint8Array.buffer cannot be used.
console.log(original.byteLength); // 0
æ¯æç对象
以䏿¯å¯ä»¥è¢«è½¬ç§»çä¸åè§èç对象ï¼
ArrayBuffer
MessagePort
ReadableStream
WritableStream
TransformStream
AudioData
ImageBitmap
VideoFrame
OffscreenCanvas
RTCDataChannel
å¨åèªå¯¹è±¡çå
¼å®¹æ§ä¿¡æ¯ä¸ï¼å¦ææ¥æ transferable
åç¹æ§ï¼æµè§å¨çæ¯æåºè¯¥è¢«å±ç¤ºï¼ç¤ºä¾è¯·åé
RTCDataChannel
ï¼ã卿°åæ¬ææ¶ï¼å¹¶éææå¯è½¬ç§»å¯¹è±¡é½å·²æ´æ°æ¤ä¿¡æ¯ã
夿³¨ï¼ å¯è½¬ç§»çå¯¹è±¡å¨ Web IDL æä»¶ä¸ç¨å±æ§ [Transferable]
æ è®°ã
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4