ArrayBuffer.prototype.transfer()
åºçº¿
2024
æè¿å¯ç¨
èª March 2024 èµ·ï¼æ¤ç¹æ§å·²å¨ææ°æµè§å¨ä¸å¾å°æ¯æãä½å¨è¾æ§çè®¾å¤ææµè§å¨ä¸å¯è½æ æ³è¿è¡ã
å®éªæ§: è¿æ¯ä¸é¡¹å®éªæ§ææ¯
å¨å°å
¶ç¨äºç产ä¹åï¼è¯·ä»ç»æ£æ¥æµè§å¨å
¼å®¹æ§è¡¨æ ¼ã
ArrayBuffer å®ä¾ç transfer() æ¹æ³å建ä¸ä¸ªå
容ä¸è¯¥ç¼å²åºç¸åçæ° ArrayBuffer å®ä¾ï¼ç¶åå°å½åç¼å²åºå离ã
è¯æ³
transfer()
transfer(newByteLength)
åæ°
newByteLengthå¯é-
æ°ç
ArrayBufferçbyteLengthãé»è®¤ä¸ºå½åArrayBufferçbyteLengthã- 妿
newByteLengthå°äºå½åArrayBufferçbyteLengthï¼â溢åºâçåèå°è¢«ä¸¢å¼ã - 妿
newByteLength大äºå½åArrayBufferçbyteLengthï¼å©ä¸çåèå°ç¨é¶å¡«å ã - 妿å½åç
ArrayBufferæ¯å¯è°æ´å¤§å°çï¼newByteLengthä¸å®ä¸è½å¤§äºå ¶maxByteLengthã
- 妿
è¿åå¼
ä¸ä¸ªæ°ç ArrayBuffer 对象ãå
¶å
容被åå§å为å½å ArrayBuffer çå
容ï¼å¦ææé¢å¤çåèãåå¡«å
为é¶ãå½ä¸ä»
å½å½å ArrayBuffer æ¯å¯è°æ´å¤§å°çï¼æ° ArrayBuffer ææ¯å¯è°æ´å¤§å°çï¼å¨è¿ç§æ
åµä¸ï¼å
¶ maxByteLength åå½å ArrayBuffer çç¸åãå½å ArrayBuffer å°è¢«å离ã
å¼å¸¸
RangeError-
妿å½å
ArrayBufferæ¯å¯è°æ´å¤§å°çå¹¶ä¸newByteLength大äºå½åArrayBufferçmaxByteLengthï¼åæåºæ¤é误ã TypeError-
妿å½å
ArrayBufferå·²ç»å离ï¼åæåºæ¤é误ã
æè¿°
transfer() æ¹æ³æ§è¡ä¸ç»æåå
éç®æ³ç¸åçæä½ãå®å°å½å ArrayBuffer çåèå¤å¶å°ä¸ä¸ªæ°ç ArrayBuffer 对象ä¸ï¼ç¶åå离å½å ArrayBuffer 对象ãæå
³æ´å¤ä¿¡æ¯ï¼è¯·åé
ä¼ è¾ ArrayBufferã
transfer() ä¿çäºå½å ArrayBuffer ç大å°å¯è°æ´æ§ãå¦æä½ å¸ææ°ç ArrayBuffer ä¸å¯è°æ´å¤§å°ï¼è¯·ä½¿ç¨ transferToFixedLength() 代æ¿ã没æåæ³éè¿ä¼ è¾ä½¿é¿åº¦åºå®çç¼å²åºå为å¯è°æ´å¤§å°çç¼å²åºã
transfer() æ¯é叏髿çï¼å 为ï¼å¼æï¼å®ç°å¯è½ä»¥é¶æ·è´ç§»å¨æ reallocââæ²¡æå®é
æ°æ®çå¤å¶ââæ¥å®ç°æ¤æ¹æ³ã
示ä¾
>ä¼ è¾ä¸ä¸ª ArrayBuffer
// å建ä¸ä¸ª ArrayBuffer å¹¶åå
¥ä¸äºåè
const buffer = new ArrayBuffer(8);
const view = new Uint8Array(buffer);
view[1] = 2;
view[7] = 4;
// å°ç¼å²åºå¤å¶å°å¦ä¸ä¸ªç¸å大å°çç¼å²åº
const buffer2 = buffer.transfer();
console.log(buffer.detached); // true
console.log(buffer2.byteLength); // 8
const view2 = new Uint8Array(buffer2);
console.log(view2[1]); // 2
console.log(view2[7]); // 4
// å°ç¼å²åºå¤å¶å°ä¸ä¸ªæ´å°çç¼å²åº
const buffer3 = buffer2.transfer(4);
console.log(buffer3.byteLength); // 4
const view3 = new Uint8Array(buffer3);
console.log(view3[1]); // 2
console.log(view3[7]); // undefined
// å°ç¼å²åºå¤å¶å°ä¸ä¸ªæ´å¤§çç¼å²åº
const buffer4 = buffer3.transfer(8);
console.log(buffer4.byteLength); // 8
const view4 = new Uint8Array(buffer4);
console.log(view4[1]); // 2
console.log(view4[7]); // 0
// å·²ç»åç¦»ï¼æåº TypeError
buffer.transfer(); // TypeError: Cannot perform ArrayBuffer.prototype.transfer on a detached ArrayBuffer
ä¼ è¾ä¸ä¸ªå¯è°æ´å¤§å°ç ArrayBuffer
const buffer = new ArrayBuffer(8, { maxByteLength: 16 });
const view = new Uint8Array(buffer);
view[1] = 2;
view[7] = 4;
// å°ç¼å²åºå¤å¶å°ä¸ä¸ªæ´å°çç¼å²åº
const buffer2 = buffer.transfer(4);
console.log(buffer2.byteLength); // 4
console.log(buffer2.maxByteLength); // 16
const view2 = new Uint8Array(buffer2);
console.log(view2[1]); // 2
console.log(view2[7]); // undefined
buffer2.resize(8);
console.log(view2[7]); // 0
// å°ç¼å²åºå¤å¶å°ä¸ä¸ªå¤§å°å¨ maxByteLength å
§ä½æ´å¤§çç¼å²åº
const buffer3 = buffer2.transfer(12);
console.log(buffer3.byteLength); // 12
// å°ç¼å²åºå¤å¶å°ä¸ä¸ªå¤§å°è¶
è¿ maxByteLength çæ´å¤§çç¼å²åº
buffer3.transfer(20); // RangeError: Invalid array buffer length
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # sec-arraybuffer.prototype.transfer> |