Thuộc tính DataView.byteOffset trả về độ dịch (offset) tính bằng byte từ đầu ArrayBuffer gốc đến vị trí bắt đầu của DataView. Đây là thuộc tính chỉ đọc.
Cú pháp
dataView.byteOffset
Ví dụ cơ bản
const buffer = new ArrayBuffer(114);
const view = new DataView(buffer); // Không truyền offset -> 0
console.log(view.byteOffset); // 0
console.log(view.buffer.byteLength); // 114
Ví dụ với offset tùy chỉnh
const buffer = new ArrayBuffer(100);
const view1 = new DataView(buffer, 0); // Offset 0
const view2 = new DataView(buffer, 20); // Offset 20
const view3 = new DataView(buffer, 20, 30); // Offset 20, length 30
console.log(view1.byteOffset); // 0
console.log(view2.byteOffset); // 20
console.log(view3.byteOffset); // 20
Ứng dụng thực tế
1. Tính vị trí tuyệt đối trong buffer
function getAbsoluteOffset(view, relativeOffset) {
return view.byteOffset + relativeOffset;
}
2. Phân tích cấu trúc dữ liệu lồng nhau
// Cấu trúc: Header (16 bytes) + Payload (dynamic)
const buffer = new ArrayBuffer(100);
const headerView = new DataView(buffer, 0, 16);
const payloadView = new DataView(buffer, 16); // Bắt đầu sau header
console.log("Header offset:", headerView.byteOffset); // 0
console.log("Payload offset:", payloadView.byteOffset); // 16
3. Validation truy cập
function safeGetInt32(view, offset) {
const absoluteOffset = view.byteOffset + offset;
if (absoluteOffset + 4 > view.buffer.byteLength) {
throw new RangeError("Vượt quá giới hạn buffer");
}
return new DataView(view.buffer).getInt32(absoluteOffset);
}
Lưu ý
- Luôn là bội số của alignment yêu cầu (thường là 1 cho DataView)
- Không thay đổi được sau khi tạo DataView
- Kết hợp với
byteLengthđể xác định phạm vi view: [byteOffset,byteOffset + byteLength)