From 8a197f879ee0f7cb65e2ec0c6e5731de6eb7f6fb Mon Sep 17 00:00:00 2001 From: Leonid Vinogradov Date: Tue, 19 Dec 2023 18:52:21 +0300 Subject: [PATCH] [ru] update `Web/JavaScript/Reference/Global_Objects/DataView` translation (#17552) [ru] update 'Web/JavaScript/Reference/Global_Objects/DataView' translation --- .../global_objects/dataview/index.md | 183 ++++++++++++------ 1 file changed, 124 insertions(+), 59 deletions(-) diff --git a/files/ru/web/javascript/reference/global_objects/dataview/index.md b/files/ru/web/javascript/reference/global_objects/dataview/index.md index c9d1275a1e6f54..84f0ecc8fd558d 100644 --- a/files/ru/web/javascript/reference/global_objects/dataview/index.md +++ b/files/ru/web/javascript/reference/global_objects/dataview/index.md @@ -1,97 +1,162 @@ --- title: DataView slug: Web/JavaScript/Reference/Global_Objects/DataView +l10n: + sourceCommit: 70f09675ddcfc75a3bb66d2dce4cf82738948a37 --- {{JSRef}} -Вид **`DataView`** предоставляет низко-уровневый интерфейс для чтения и записи многочисленных числовых типов в бинарном {{jsxref("ArrayBuffer")}}, независимо от порядка байтов платформы. - -{{EmbedInteractiveExample("pages/js/dataview-constructor.html")}} - -## Синтаксис - -``` -new DataView(buffer [, byteOffset [, byteLength]]) -``` - -### Параметры - -- `buffer` - - : Существующий {{jsxref("ArrayBuffer")}} или {{jsxref("SharedArrayBuffer")}} {{experimental_inline}} для использования как хранилище для нового объекта `DataView`. -- `byteOffset` {{optional_inline}} - - : Смещение в байтах к первому байту в заданном буфере. Если не определён, то вид буфера будет начинаться с первого байта. -- `byteLength` {{optional_inline}} - - : Количество элементов в массиве байтов. Если не определён, то длина вида будет соответствовать длине буфера. - -### Возвращаемое значение - -Новый объект `DataView` представляющий определённый буфер данных. - -### Исключения - -- `{{jsxref("RangeError")}}` - - : Выкидывается если `byteOffset` и `byteLength` заходит за пределы буфера. +Представление **`DataView`** предоставляет низко-уровневый интерфейс для чтения и записи различных числовых типов в бинарном {{jsxref("ArrayBuffer")}}, независимо от [порядка байтов](/ru/docs/Glossary/Endianness) платформы. ## Описание ### Порядок байтов -Многобайтовые числовые форматы представлены в памяти по разному в зависимости от архитектуры машины, см {{Glossary("Endianness")}} для объяснения. Аксессоры DataView предоставляют явный контроль над обращением к данным вне зависимости от порядка байтов архитектуры платформы. +Многобайтовые числовые форматы представляются в памяти по-разному в зависимости от архитектуры машины (смотрите {{Glossary("Endianness")}} для объяснения). Методы доступа `DataView` предоставляют явный способ обращения к данным вне зависимости от порядка байтов платформы. ```js -var littleEndian = (function () { - var buffer = new ArrayBuffer(2); +const littleEndian = (() => { + const buffer = new ArrayBuffer(2); new DataView(buffer).setInt16(0, 256, true /* littleEndian */); - // Int16Array uses the platform's endianness. + + // Int16Array использует порядок байтов платформы. return new Int16Array(buffer)[0] === 256; })(); -console.log(littleEndian); // true or false + +console.log(littleEndian); // true или false ``` -## Свойства +### 64-битные целые числа -All `DataView` instances inherit from {{jsxref("DataView.prototype")}} and allows the addition of properties to all DataView objects. +Некоторые браузеры не поддерживают {{jsxref("DataView.prototype.setBigInt64()")}} и {{jsxref("DataView.prototype.setBigUint64()")}}. Поэтому для использования 64-битных операций, которые будут работать в любом браузере, можно реализовать собственную функцию `getUint64()` для получения значений с точностью до {{jsxref("Number.MAX_SAFE_INTEGER")}}, чего достаточно в большинстве случаев. -{{page('en-US/Web/JavaScript/Reference/Global_Objects/DataView/prototype','Properties')}} +```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-битный диапазон, можно создать {{jsxref("BigInt")}}. Хотя работа со встроенными значениями BigInt намного быстрее, чем с эквивалентами из самостоятельных реализаций, использование значений BigInt всегда будет намного медленнее, чем 32-битных целых чисел, из-за характера их переменного размера в JavaScript. -{{page('en-US/Web/JavaScript/Reference/Global_Objects/DataView/prototype','Methods')}} +```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; +} +``` -## Пример +## Конструктор + +- {{jsxref("DataView/DataView", "DataView()")}} + - : Создаёт новый объект `DataView`. + +## Свойства экземпляра + +Эти свойства определены в `DataView.prototype` и есть у всех экземпляров `DataView`. + +- {{jsxref("DataView.prototype.buffer")}} + - : {{jsxref("ArrayBuffer")}}, связанный с представлением. Устанавливается в момент создания и **доступно только для чтения**. +- {{jsxref("DataView.prototype.byteLength")}} + - : Размер представления в байтах. Устанавливается в момент создания и **доступно только для чтения**. +- {{jsxref("DataView.prototype.byteOffset")}} + - : Смещение представления в байтах от начала его {{jsxref("ArrayBuffer")}}. Устанавливается в момент создания и **доступно только для чтения**. +- {{jsxref("Object/constructor", "DataView.prototype.constructor")}} + - : Функция-конструктор, создающая экземпляр объекта. Для экземпляров `DataView` начальным значением является конструктор {{jsxref("DataView/DataView", "DataView")}}. +- `DataView.prototype[@@toStringTag]` + - : Начальным значением свойства [`@@toStringTag`](/ru/docs/Web/JavaScript/Reference/Global_Objects/Symbol/toStringTag) является строка `"DataView"`. Это свойство используется в {{jsxref("Object.prototype.toString()")}}. + +## Методы экземпляра + +- {{jsxref("DataView.prototype.getBigInt64()")}} + - : Читает 8 байтов начиная с указанного смещения этого `DataView` и интерпретирует их как 64-битное знаковое целое число. +- {{jsxref("DataView.prototype.getBigUint64()")}} + - : Читает 8 байтов начиная с указанного смещения этого `DataView` и интерпретирует их как 64-битное беззнаковое целое число. +- {{jsxref("DataView.prototype.getFloat32()")}} + - : Читает 4 байта начиная с указанного смещения этого `DataView` и интерпретирует их как 32-битное число с плавающей точкой. +- {{jsxref("DataView.prototype.getFloat64()")}} + - : Читает 8 байтов начиная с указанного смещения этого `DataView` и интерпретирует их как 64-битное число с плавающей точкой. +- {{jsxref("DataView.prototype.getInt16()")}} + - : Читает 2 байта начиная с указанного смещения этого `DataView` и интерпретирует их как 16-битное знаковое целое число. +- {{jsxref("DataView.prototype.getInt32()")}} + - : Читает 4 байта начиная с указанного смещения этого `DataView` и интерпретирует их как 32-битное знаковое целое число. +- {{jsxref("DataView.prototype.getInt8()")}} + - : Читает 1 байт начиная с указанного смещения этого `DataView` и интерпретирует его как 8-битное знаковое целое число. +- {{jsxref("DataView.prototype.getUint16()")}} + - : Читает 2 байта начиная с указанного смещения этого `DataView` и интерпретирует их как 16-битное беззнаковое целое число. +- {{jsxref("DataView.prototype.getUint32()")}} + - : Читает 4 байта начиная с указанного смещения этого `DataView` и интерпретирует их как 32-битное беззнаковое целое число. +- {{jsxref("DataView.prototype.getUint8()")}} + - : Читает 1 байт начиная с указанного смещения этого `DataView` и интерпретирует его как 8-битное беззнаковое целое число. +- {{jsxref("DataView.prototype.setBigInt64()")}} + - : Принимает BigInt и сохраняет его как 64-битное знаковое целое число в 8 байтах начиная с указанного смещения этого `DataView`. +- {{jsxref("DataView.prototype.setBigUint64()")}} + - : Принимает BigInt и сохраняет его как 64-битное беззнаковое целое число в 8 байтах начиная с указанного смещения этого `DataView`. +- {{jsxref("DataView.prototype.setFloat32()")}} + - : Принимает число и сохраняет его как 32-битное число с плавающей точкой в 4 байтах начиная с указанного смещения этого `DataView`. +- {{jsxref("DataView.prototype.setFloat64()")}} + - : Принимает число и сохраняет его как 64-битное число с плавающей точкой в 8 байтах начиная с указанного смещения этого `DataView`. +- {{jsxref("DataView.prototype.setInt16()")}} + - : Принимает число и сохраняет его как 16-битное знаковое целое число в 2 байтах по указанному смещению этого `DataView`. +- {{jsxref("DataView.prototype.setInt32()")}} + - : Принимает число и сохраняет его как 32-битное знаковое целое число в 4 байтах по указанному смещению этого `DataView`. +- {{jsxref("DataView.prototype.setInt8()")}} + - : Принимает число и сохраняет его как 8-битное знаковое целое число в байте по указанному смещению этого `DataView`. +- {{jsxref("DataView.prototype.setUint16()")}} + - : Принимает число и сохраняет его как 16-битное беззнаковое целое число в 2 байтах по указанному смещению этого `DataView`. +- {{jsxref("DataView.prototype.setUint32()")}} + - : Принимает число и сохраняет его как 32-битное беззнаковое целое число в 4 байтах по указанному смещению этого `DataView`. +- {{jsxref("DataView.prototype.setUint8()")}} + - : Принимает число и сохраняет его как 8-битное беззнаковое целое число в байте по указанному смещению этого `DataView`. + +## Примеры + +### Использование DataView ```js -var buffer = new ArrayBuffer(16); -var dv = new DataView(buffer, 0); +const buffer = new ArrayBuffer(16); +const view = new DataView(buffer, 0); -dv.setInt16(1, 42); -dv.getInt16(1); //42 +view.setInt16(1, 42); +view.getInt16(1); // 42 ``` -## Спецификация +## Спецификации {{Specifications}} -## Таблица совместимости +## Совместимость с браузерами {{Compat}} -## Замечания совместимости - -Starting with Firefox 40, `DataView` requires to be constructed with a {{jsxref("Operators/new", "new")}} operator. Calling `DataView()` as a function without `new`, will throw a {{jsxref("TypeError")}} from now on. - -```js example-bad -var dv = DataView(buffer, 0); -// TypeError: calling a builtin DataView constructor without new is forbidden -``` - -```js example-good -var dv = new DataView(buffer, 0); -``` - -## Также +## Смотрите также -- [jDataView](https://github.com/jDataView/jDataView): JavaScript library that polyfills and extends the `DataView` API to all browsers and Node.js. +- [Полифил `DataView` в `core-js`](https://github.com/zloirock/core-js#ecmascript-typed-arrays) - {{jsxref("ArrayBuffer")}} - {{jsxref("SharedArrayBuffer")}}