Skip to content

Commit

Permalink
[ru] update Web/JavaScript/Reference/Global_Objects/DataView transl…
Browse files Browse the repository at this point in the history
…ation (#17552)

[ru] update 'Web/JavaScript/Reference/Global_Objects/DataView' translation
  • Loading branch information
leon-win authored Dec 19, 2023
1 parent c4213ea commit 8a197f8
Showing 1 changed file with 124 additions and 59 deletions.
183 changes: 124 additions & 59 deletions files/ru/web/javascript/reference/global_objects/dataview/index.md
Original file line number Diff line number Diff line change
@@ -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")}}

0 comments on commit 8a197f8

Please sign in to comment.