DataView.buffer คืออะไร
คุณสมบัติ DataView.prototype.buffer เป็นคุณสมบัติแบบอ่านอย่างเดียว (read-only) ที่คืนค่า ArrayBuffer ที่ DataView นี้มอง (view) อยู่ นี่คือ buffer "ต้นฉบับ" ที่ DataView ถูกสร้างขึ้นมาจาก
ไวยากรณ์ (Syntax)
dataView.buffer
คืนค่า: ArrayBuffer ที่ DataView นี้ reference อยู่
ตัวอย่างการใช้งาน
ตัวอย่างที่ 1: การเข้าถึง buffer ต้นฉบับ
const buffer = new ArrayBuffer(156);
const view = new DataView(buffer);
console.log(view.buffer === buffer); // true
console.log(view.buffer.byteLength); // 156
ตัวอย่างที่ 2: DataView ที่มองเฉพาะส่วน (Partial View)
const buffer = new ArrayBuffer(100);
const view = new DataView(buffer, 20, 30); // offset=20, byteLength=30
console.log(view.buffer === buffer); // true (buffer ต้นฉบับยังคงเป็น 100 bytes)
console.log(view.buffer.byteLength); // 100
console.log(view.byteOffset); // 20
console.log(view.byteLength); // 30
ตัวอย่างที่ 3: การสร้าง View ใหม่จาก buffer เดิม
const buffer = new ArrayBuffer(64);
const view1 = new DataView(buffer, 0, 32);
const view2 = new DataView(buffer, 32, 32);
// ทั้งสอง view ใช้ buffer เดียวกัน
console.log(view1.buffer === view2.buffer); // true
// เขียนผ่าน view1 อ่านจาก view2 ได้
view1.setUint32(0, 0x12345678);
console.log(view2.getUint32(0)); // 0 (เพราะ view2 เริ่มที่ offset 32)
// แต่ถ้าอ่านจาก buffer ตรงๆ
const fullView = new DataView(buffer);
console.log(fullView.getUint32(0)); // 305419896 (0x12345678)
ความสัมพันธ์ระหว่าง buffer, byteOffset, byteLength
const buffer = new ArrayBuffer(100);
const view = new DataView(buffer, 20, 30);
// ความสัมพันธ์:
// view.buffer.byteLength === 100 (ขนาด buffer ทั้งหมด)
// view.byteOffset === 20 (ตำแหน่งเริ่มต้นใน buffer)
// view.byteLength === 30 (ขนาดของ view นี้)
// view.byteOffset + view.byteLength <= view.buffer.byteLength
// 20 + 30 = 50 <= 100 ✓
กรณีการใช้งานทั่วไป
- Access full buffer: เข้าถึงข้อมูลนอกเหนือจาก view ปัจจุบัน
- Create additional views: สร้าง view ใหม่จาก buffer เดิมเพื่อมองข้อมูลแบบต่างกัน
- Serialization: ส่ง buffer ต้นฉบับไปยัง Web Worker หรือเก็บลง IndexedDB
- Memory management: ตรวจสอบขนาด buffer จริงสำหรับ memory profiling
- Buffer sharing: ยืนยันว่า view หลายตัว share buffer เดียวกัน
ข้อควรระวัง
view.bufferคืนค่า buffer ต้นฉบับเสมอ ไม่ใช่แค่ส่วนที่ view มองเห็น- การแก้ไข buffer ผ่าน view หนึ่งจะส่งผลต่อ view อื่นที่ share buffer เดียวกัน
- DataView ไม่ถือครอบครอง (own) buffer - buffer มีชีวิตอยู่แยกต่างหาก
- ไม่สามารถ reassign
view.bufferได้ (read-only)