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 | ตำแหน่งเริ่มต้นใน buffer | 20 |
| view.byteLength | ขนาดของ view นี้ | 30 |