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

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

DataView.byteLength คืออะไร

คุณสมบัติ DataView.prototype.byteLength เป็นคุณสมบัติแบบอ่านอย่างเดียว (read-only) ที่คืนค่า ขนาดของ DataView ในหน่วยไบต์ นี่คือขนาดของ "มุมมอง" (view) ที่ DataView นี้มองเห็น ซึ่งอาจน้อยกว่าหรือเท่ากับขนาดของ ArrayBuffer ต้นฉบับ

หมายเหตุ: เอกสารต้นฉบับเขียนว่า dataView.byteLength() พร้อมวงเล็บ ซึ่ง ไม่ถูกต้อง - byteLength เป็น property (คุณสมบัติ) ไม่ใช่ method จึงเรียกใช้ โดยไม่ต้องมีวงเล็บ

ไวยากรณ์ (Syntax)

dataView.byteLength

คืนค่า: จำนวนเต็มไม่มีเครื่องหมาย แทนขนาดของ view ในหน่วยไบต์

ตัวอย่างการใช้งาน

ตัวอย่างที่ 1: DataView ครอบคลุม Buffer ทั้งหมด

const buffer = new ArrayBuffer(8);
const view = new DataView(buffer);

console.log(view.byteLength);       // 8
console.log(view.buffer.byteLength); // 8
console.log(view.byteOffset);       // 0

ตัวอย่างที่ 2: DataView ครอบคลุมบางส่วน (Partial View)

const buffer = new ArrayBuffer(100);
const view = new DataView(buffer, 20, 30); // offset=20, length=30

console.log(view.byteLength);       // 30 (ขนาดของ view นี้)
console.log(view.buffer.byteLength); // 100 (ขนาด buffer ต้นฉบับ)
console.log(view.byteOffset);       // 20

ตัวอย่างที่ 3: การสร้าง View โดยไม่ระบุ Length

const buffer = new ArrayBuffer(100);
const view = new DataView(buffer, 20); // ไม่ระบุ byteLength

console.log(view.byteLength); // 80 (จาก offset 20 ถึงท้าย buffer)

ความสัมพันธ์ของสามคุณสมบัติ

สำหรับ DataView ทุกตัว สมการต่อไปนี้เป็นจริงเสมอ:

view.byteOffset + view.byteLength === view.buffer.byteLength
// หรือ <= หาก view ไม่ครอบคลุมถึงท้าย buffer

กรณีการใช้งานทั่วไป

  • Bounds checking: ตรวจสอบก่อนอ่าน/เขียนว่าไม่เกินขอบเขต view
  • Loop iteration: วนลูปอ่านข้อมูลใน view
  • Serialization: รู้ขนาดข้อมูลที่จะ serialize
  • Memory management: ติดตามขนาด view สำหรับ memory profiling
  • Protocol parsing: ตรวจสอบว่า payload มีขนาดพอ

ตัวอย่าง: Bounds Checking Helper

function safeGetUint32(view, offset) {
  if (offset < 0 || offset + 4 > view.byteLength) {
    throw new RangeError(`Offset ${offset} out of bounds for view of length ${view.byteLength}`);
  }
  return view.getUint32(offset);
}

function safeSetUint32(view, offset, value) {
  if (offset < 0 || offset + 4 > view.byteLength) {
    throw new RangeError(`Offset ${offset} out of bounds for view of length ${view.byteLength}`);
  }
  view.setUint32(offset, value);
}

// การใช้งาน
const buffer = new ArrayBuffer(16);
const view = new DataView(buffer, 4, 8); // เฉพาะ bytes 4-11

safeSetUint32(view, 0, 0x12345678); // OK (offset 0 ใน view = offset 4 ใน buffer)
safeSetUint32(view, 4, 0x9ABCDEF0); // OK (offset 4 ใน view = offset 8 ใน buffer)
safeSetUint32(view, 8, 0x11223344); // RangeError! (offset 8 ใน view = offset 12 ใน buffer, เกิน view.byteLength=8)

ข้อควรระวัง

  • byteLength เป็น property ไม่ใช่ method - เรียก ไม่ต้องมีวงเล็บ
  • ค่า byteLength ถูกกำหนดตอนสร้าง DataView (หรือคำนวณจาก buffer.byteLength - byteOffset) และ ไม่สามารถเปลี่ยนได้
  • ต่างจาก view.buffer.byteLength ซึ่งเป็นขนาด buffer ทั้งหมด
  • หากไม่ระบุ byteLength ตอนสร้าง จะใช้ค่า buffer.byteLength - byteOffset อัตโนมัติ

สรุปความแตกต่าง

คุณสมบัติความหมายตัวอย่าง (buffer=100, offset=20, length=30)
view.buffer.byteLengthขนาด buffer ต้นฉบับ100
view.byteOffsetตำแหน่งเริ่มต้นใน buffer20
view.byteLengthขนาดของ view นี้30