ArrayBuffer.byteLength คืออะไร
คุณสมบัติ byteLength ของ ArrayBuffer เป็นคุณสมบัติแบบอ่านอย่างเดียว (read-only) ที่คืนค่า ขนาดของ Array Buffer ในหน่วยไบต์ (bytes) เป็นจำนวนเต็มไม่มีเครื่องหมาย 32-bit (unsigned 32-bit integer)
ค่านี้ถูกกำหนดตอนสร้าง ArrayBuffer และ ไม่สามารถเปลี่ยนแปลงได้ ตลอดชีวิตของออบเจ็กต์
ไวยากรณ์ (Syntax)
arrayBuffer.byteLength
คืนค่า: จำนวนเต็มแทนขนาดในหน่วยไบต์
ตัวอย่างการใช้งาน
ตัวอย่างที่ 1: การสร้างและตรวจสอบขนาด
const buffer = new ArrayBuffer(8);
console.log(buffer.byteLength); // 8
const buffer2 = new ArrayBuffer(1024);
console.log(buffer2.byteLength); // 1024
ตัวอย่างที่ 2: การสร้างด้วยค่าที่ไม่ใช่ตัวเลข
// สร้างด้วย string - JavaScript จะแปลงเป็นตัวเลข (NaN -> 0)
const buffer = new ArrayBuffer("Hello");
console.log(buffer.byteLength); // 0
// สร้างด้วย object ที่มี valueOf
const obj = { valueOf: () => 100 };
const buffer2 = new ArrayBuffer(obj);
console.log(buffer2.byteLength); // 100
ตัวอย่างที่ 3: การใช้งานกับ Typed Arrays และ DataView
const buffer = new ArrayBuffer(100);
const int32 = new Int32Array(buffer);
const dataView = new DataView(buffer, 20, 30);
console.log('ArrayBuffer:', buffer.byteLength); // 100
console.log('Int32Array:', int32.byteLength); // 100
console.log('DataView:', dataView.byteLength); // 30 (เฉพาะส่วนที่ view มองเห็น)
ข้อจำกัดและข้อผิดพลาด (Constraints & Errors)
1. ค่าติดลบ (Negative values)
try {
new ArrayBuffer(-72);
} catch (e) {
console.log(e.name); // RangeError
console.log(e.message); // Invalid array buffer length
}
2. ค่าที่ใหญ่เกินไป (Exceeds maximum size)
ขนาดสูงสุดคือ 2^53 - 1 ไบต์ (ประมาณ 8 PB - petabytes)
try {
new ArrayBuffer(9007199254740995); // 2^53 + 3
} catch (e) {
console.log(e.name); // RangeError
console.log(e.message); // Array buffer allocation failed
}
3. ค่าที่ไม่ใช่จำนวนเต็ม (Non-integer values)
// Float - จะถูก truncate
const buffer1 = new ArrayBuffer(10.9);
console.log(buffer1.byteLength); // 10
// Complex number - Syntax Error (ไม่ใช่ valid JavaScript)
// new ArrayBuffer(2+3i); // SyntaxError: Invalid or unexpected token
4. NaN และ Infinity
console.log(new ArrayBuffer(NaN).byteLength); // 0
console.log(new ArrayBuffer(Infinity).byteLength); // 0 (RangeError ในบาง engine)
ความสัมพันธ์กับ Views
เมื่อสร้าง View (TypedArray หรือ DataView) จาก ArrayBuffer:
view.byteLength≤buffer.byteLengthview.byteOffset+view.byteLength≤buffer.byteLength
กรณีการใช้งานทั่วไป
- Validation: ตรวจสอบขนาด buffer ก่อนประมวลผล
- Memory management: ติดตามการใช้หน่วยความจำ
- Protocol parsing: ตรวจสอบว่า buffer มีขนาดพอสำหรับ header/body
- Bounds checking: คำนวณ offset และ length สำหรับ views
สรุป
| คุณสมบัติ | รายละเอียด |
|---|---|
| ชนิด | Read-only property |
| ชนิดข้อมูล | Unsigned 32-bit integer |
| ค่าสูงสุด | 2^53 - 1 bytes (~8 PB) |
| ค่าต่ำสุด | 0 bytes |
| กำหนดเมื่อ | ตอนสร้าง (constructor) |
| เปลี่ยนแปลงได้ | ไม่ได้ |