DataView

Baseline Widely available *

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

* Some parts of this feature may have varying levels of support.

Представление DataView предоставляет низко-уровневый интерфейс для чтения и записи различных числовых типов в бинарном ArrayBuffer, независимо от порядка байтов платформы.

Описание

Порядок байтов

Многобайтовые числовые форматы представляются в памяти по-разному в зависимости от архитектуры машины (смотрите Endianness для объяснения). Методы доступа DataView предоставляют явный способ обращения к данным вне зависимости от порядка байтов платформы.

js
const littleEndian = (() => {
  const buffer = new ArrayBuffer(2);
  new DataView(buffer).setInt16(0, 256, true /* littleEndian */);

  // Int16Array использует порядок байтов платформы.
  return new Int16Array(buffer)[0] === 256;
})();

console.log(littleEndian); // true или false

64-битные целые числа

Некоторые браузеры не поддерживают DataView.prototype.setBigInt64() и DataView.prototype.setBigUint64(). Поэтому для использования 64-битных операций, которые будут работать в любом браузере, можно реализовать собственную функцию getUint64() для получения значений с точностью до Number.MAX_SAFE_INTEGER, чего достаточно в большинстве случаев.

js
function getUint64(dataview, byteOffset, littleEndian) {
  // разбиваем 64-битное число на две 32-битных (по 4 байта) части
  const left = dataview.getUint32(byteOffset, littleEndian);
  const right = dataview.getUint32(byteOffset + 4, littleEndian);

  // объединяем два 32-битных значения
  const combined = littleEndian
    ? left + 2 ** 32 * right
    : 2 ** 32 * left + right;

  if (!Number.isSafeInteger(combined))
    console.warn(
      combined,
      "превышает MAX_SAFE_INTEGER. Точность может быть потеряна",
    );

  return combined;
}

В случае если вам всё же нужен полный 64-битный диапазон, можно создать BigInt. Хотя работа со встроенными значениями BigInt намного быстрее, чем с эквивалентами из самостоятельных реализаций, использование значений BigInt всегда будет намного медленнее, чем 32-битных целых чисел, из-за характера их переменного размера в JavaScript.

js
const BigInt = window.BigInt,
  bigThirtyTwo = BigInt(32),
  bigZero = BigInt(0);
function getUint64BigInt(dataview, byteOffset, littleEndian) {
  // разбиваем 64-битное число на две 32-битных (по 4 байта) части
  const left = BigInt(dataview.getUint32(byteOffset | 0, !!littleEndian) >>> 0);
  const right = BigInt(
    dataview.getUint32(((byteOffset | 0) + 4) | 0, !!littleEndian) >>> 0,
  );

  // объединяем два 32-битных значения и возвращаем
  return littleEndian
    ? (right << bigThirtyTwo) | left
    : (left << bigThirtyTwo) | right;
}

Конструктор

DataView()

Создаёт новый объект DataView.

Свойства экземпляра

Эти свойства определены в DataView.prototype и есть у всех экземпляров DataView.

DataView.prototype.buffer

ArrayBuffer, связанный с представлением. Устанавливается в момент создания и доступно только для чтения.

DataView.prototype.byteLength

Размер представления в байтах. Устанавливается в момент создания и доступно только для чтения.

DataView.prototype.byteOffset

Смещение представления в байтах от начала его ArrayBuffer. Устанавливается в момент создания и доступно только для чтения.

DataView.prototype.constructor

Функция-конструктор, создающая экземпляр объекта. Для экземпляров DataView начальным значением является конструктор DataView.

DataView.prototype[@@toStringTag]

Начальным значением свойства @@toStringTag является строка "DataView". Это свойство используется в Object.prototype.toString().

Методы экземпляра

DataView.prototype.getBigInt64()

Читает 8 байтов начиная с указанного смещения этого DataView и интерпретирует их как 64-битное знаковое целое число.

DataView.prototype.getBigUint64()

Читает 8 байтов начиная с указанного смещения этого DataView и интерпретирует их как 64-битное беззнаковое целое число.

DataView.prototype.getFloat32()

Читает 4 байта начиная с указанного смещения этого DataView и интерпретирует их как 32-битное число с плавающей точкой.

DataView.prototype.getFloat64()

Читает 8 байтов начиная с указанного смещения этого DataView и интерпретирует их как 64-битное число с плавающей точкой.

DataView.prototype.getInt16()

Читает 2 байта начиная с указанного смещения этого DataView и интерпретирует их как 16-битное знаковое целое число.

DataView.prototype.getInt32()

Читает 4 байта начиная с указанного смещения этого DataView и интерпретирует их как 32-битное знаковое целое число.

DataView.prototype.getInt8()

Читает 1 байт начиная с указанного смещения этого DataView и интерпретирует его как 8-битное знаковое целое число.

DataView.prototype.getUint16()

Читает 2 байта начиная с указанного смещения этого DataView и интерпретирует их как 16-битное беззнаковое целое число.

DataView.prototype.getUint32()

Читает 4 байта начиная с указанного смещения этого DataView и интерпретирует их как 32-битное беззнаковое целое число.

DataView.prototype.getUint8()

Читает 1 байт начиная с указанного смещения этого DataView и интерпретирует его как 8-битное беззнаковое целое число.

DataView.prototype.setBigInt64()

Принимает BigInt и сохраняет его как 64-битное знаковое целое число в 8 байтах начиная с указанного смещения этого DataView.

DataView.prototype.setBigUint64()

Принимает BigInt и сохраняет его как 64-битное беззнаковое целое число в 8 байтах начиная с указанного смещения этого DataView.

DataView.prototype.setFloat32()

Принимает число и сохраняет его как 32-битное число с плавающей точкой в 4 байтах начиная с указанного смещения этого DataView.

DataView.prototype.setFloat64()

Принимает число и сохраняет его как 64-битное число с плавающей точкой в 8 байтах начиная с указанного смещения этого DataView.

DataView.prototype.setInt16()

Принимает число и сохраняет его как 16-битное знаковое целое число в 2 байтах по указанному смещению этого DataView.

DataView.prototype.setInt32()

Принимает число и сохраняет его как 32-битное знаковое целое число в 4 байтах по указанному смещению этого DataView.

DataView.prototype.setInt8()

Принимает число и сохраняет его как 8-битное знаковое целое число в байте по указанному смещению этого DataView.

DataView.prototype.setUint16()

Принимает число и сохраняет его как 16-битное беззнаковое целое число в 2 байтах по указанному смещению этого DataView.

DataView.prototype.setUint32()

Принимает число и сохраняет его как 32-битное беззнаковое целое число в 4 байтах по указанному смещению этого DataView.

DataView.prototype.setUint8()

Принимает число и сохраняет его как 8-битное беззнаковое целое число в байте по указанному смещению этого DataView.

Примеры

Использование DataView

js
const buffer = new ArrayBuffer(16);
const view = new DataView(buffer, 0);

view.setInt16(1, 42);
view.getInt16(1); // 42

Спецификации

Specification
ECMAScript® 2025 Language Specification
# sec-dataview-objects

Совместимость с браузерами

Report problems with this compatibility data on GitHub
desktopmobileserver
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
Deno
Node.js
DataView
DataView() constructor
SharedArrayBuffer accepted as buffer
buffer
byteLength
byteOffset
getBigInt64
getBigUint64
getFloat16
getFloat32
getFloat64
getInt16
getInt32
getInt8
getUint16
getUint32
getUint8
setBigInt64
setBigUint64
setFloat16
setFloat32
setFloat64
setInt16
setInt32
setInt8
setUint16
setUint32
setUint8

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support
No support
No support

Смотрите также