Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> JavaScript

คุณสมบัติ DataView.buffer ใน JavaScript

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)