ArrayBuffer.prototype.transfer()
Baseline 2024
Newly available
Since March 2024, this feature works across the latest devices and browser versions. This feature might not work in older devices or browsers.
ArrayBuffer
인스턴스의 transfer()
메서드는 이 버퍼와 동일한 바이트 내용을 가진 새 ArrayBuffer
를 생성한 다음 이 버퍼를 분리합니다.
구문
transfer()
transfer(newByteLength)
매개변수
newByteLength
Optional-
새
ArrayBuffer
의byteLength
입니다. 기본값은 이ArrayBuffer
의byteLength
입니다.newByteLength
가 이ArrayBuffer
의byteLength
보다 작으면 해당 버퍼에 담지 못해 "넘치는" 바이트는 삭제됩니다.newByteLength
가 이ArrayBuffer
의byteLength
보다 크다면 남는 바이트는 0으로 채워집니다.- 이
ArrayBuffer
의 크기를 조정할 수 있는 경우newByteLength
는 해당maxByteLength
보다 크지 않아야 합니다.
반환 값
새로운 ArrayBuffer
객체입니다. 해당 객체의 내용은 이 ArrayBuffer
의 내용으로 초기화되며, 여분의 바이트가 있으면 0으로 채워집니다. 새로운 ArrayBuffer
는 이 ArrayBuffer
가 크기 조정이 가능한 경우에만 크기를 조정할 수 있으며, 이 경우 새로운 객체의 maxByteLength
는 이 ArrayBuffer
의 것과 동일합니다. 원래의 ArrayBuffer
는 분리됩니다.
예외
RangeError
-
이
ArrayBuffer
가 크기 조절이 가능하고newByteLength
가 이ArrayBuffer
의maxByteLength
보다 크다면 발생합니다. TypeError
-
ArrayBuffer
가 이미 분리된 경우 발생합니다.
설명
transfer()
메서드는 구조화된 복제 알고리즘과 동일한 연산을 수행합니다. 이 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
명세서
Specification |
---|
ECMAScript Language Specification # sec-arraybuffer.prototype.transfer |
브라우저 호환성
BCD tables only load in the browser