-
Notifications
You must be signed in to change notification settings - Fork 8k
/
index.md
144 lines (109 loc) · 12.5 KB
/
index.md
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
---
title: TypedArray
slug: Web/JavaScript/Reference/Global_Objects/TypedArray
---
{{JSRef}}
Объект **_TypedArray_** (типизированный массив) это массивоподобное представление нижележащего [буфера с бинарными данными (ArrayBuffer)](/ru/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer). Нет ни глобального свойства `TypedArray`, ни открытого конструктора _`TypedArray`_. Но существует ряд глобальных элементов, которые являются конструкторами типизированных массивов для конкретно заданных типов данных. Они приведены ниже. Далее вы найдёте общие свойства и функции, которые можно использовать с любыми типизированными массивами.
## Синтаксис
```
new TypedArray(); // новое в ES2017
new TypedArray(length);
new TypedArray(typedArray);
new TypedArray(object);
new TypedArray(buffer [, byteOffset [, length]]);
где TypedArray() это одно из следующих значений:
Int8Array(), Uint8Array(), Uint8ClampedArray(), Int16Array(), Uint16Array(), Int32Array(), Uint32Array(), Float32Array(), Float64Array()
```
### Параметры
- length
- : При вызове в памяти создаётся буфер длины **`length`** _BYTES_PER_ELEMENT_ байт, содержащий нули
- typedArray
- : Когда вызывается с аргументом **`typedArray`**, который может быть объектом любого из типов типизированных массивов (например, `Int32Array`), тогда переданный массив `typedArray` копируется в новый массив. Каждое значение из `typedArray` конвертируется в соответствующий конструктору тип прямо перед копированием. Длина нового объекта `typedArray` будет такой же как и длина переданного в параметре `typedArray`
- object
- : Новый массив создаётся так, как если бы была вызвана функция `TypedArray.from()`
- buffer, byteOffset, length
- : Когда происходит вызов с параметрами **`buffer`** и опциональными параметрами **`byteOffset`** и **`length`**, то будет создан новый типизированный массив, который будет отражать `buffer` типа {{jsxref("ArrayBuffer")}}. Параметры `byteOffset` и `length` определяют диапазон (размер) памяти, выводимый данным массивоподобным представлением. Если оба этих параметра (`byteOffset` и `length`) опущены, то будет использован весь буфер `buffer`; если опущен только `length`, то будет выведен весь остаток буфера после смещения начала отсчёта элементов, заданного параметром `byteOffset`.
## Описание
ECMAScript 2015 определяет конструктор объекта _TypedArray,_ который является прототипом всех _TypedArray_-конструкторов. Этот конструктор не открыт явным образом: какое-либо глобальное свойство _`%TypedArray%`_ или _`TypedArray`_ отсутствует. Он доступен только через `Object.getPrototypeOf(...) (`например`, Int8Array.prototype)`. Все `TypedArray`s конструкторы наследуют общие свойства от конструктора `%TypedArray%`. Кроме того, все прототипы типизированных массивов (`TypedArray.prototype`) ��меют своим прототипом `%TypedArray%.prototype`.
Сам по себе конструктор `%TypedArray%` не имеет пользы. Его вызов напрямую или через оператор `new` выдаст ошибку `TypeError`, кроме случая, когда он используется во время создания объектов в JS-движке, поддерживающего подклассы. В настоящее время такие движки неизвестны, поэтому `%TypedArray%` используется только для дополнения функциональности (затычка) браузеров в конструкторах _TypedArray_.
Когда создаётся экземпляр _TypedArray_ (например, `Int8Array`), то буферный массив создаётся в памяти, в случае если объект `ArrayBuffer` передаётся как аргумент конструктора, то вместо создания буфера используется он. Адрес буфера сохраняется во внутреннем свойстве экземпляра, и все методы из `%TypedArray%.prototype`, например сеттеры и геттеры, оперируют с буфером, по этому адресу.
### Доступ к свойствам
Получить доступ к элементам массива можно используя стандартный синтаксис по индексу (например, `arr[12]`). Однако, получение и установка индексируемых свойств по цепи прототипов не будет происходить даже в случае, когда вы пытаетесь использовать индексы извне массива. Индексируемые свойства обращаются к элементам буфера {{jsxref("ArrayBuffer")}} и не имеют отношения к объектным свойствам. Также можно использовать именованные свойства как и в обычных объектах.
```js
//Установка и получение используя стандартный синтаксис массивов
var int16 = new Int16Array(2);
int16[0] = 42;
console.log(int16[0]); // 42
//Отсутствует обращение к свойству прототипа (элемент №20 должен бы иметь значение "foo")
Int8Array.prototype[20] = "foo";
new Int8Array(32)[20]; // 0
//Отсутствует даже в случае обращения к индексу извне текущего массива
Int8Array.prototype[20] = "foo";
new Int8Array(8)[20]; // undefined
// также в случае отрицательных индексов
Int8Array.prototype[-1] = "foo";
new Int8Array(8)[-1]; // undefined
// Допустимы именованные свойства
Int8Array.prototype.foo = "bar";
new Int8Array(32).foo; // "bar"
```
## Объекты TypedArray
| Тип | Диапазон значений | Размер (байты) | Описание | Тип Web IDL | Эквивалентный тип языка C |
| ------------------------------- | ------------------------- | -------------- | ------------------------------------------------------------------------------------------ | --------------------- | ------------------------- |
| {{jsxref("Int8Array")}} | -128 до 127 | 1 | 8-битное целое со знаком с дополнением до двух | `byte` | `int8_t` |
| {{jsxref("Uint8Array")}} | 0 до 255 | 1 | 8-битное беззнаковое целое | `octet` | `uint8_t` |
| {{jsxref("Uint8ClampedArray")}} | 0 до 255 | 1 | 8-битное беззнаковое целое (фиксированное от 0 до 255) | `octet` | `uint8_t` |
| {{jsxref("Int16Array")}} | -32768 до 32767 | 2 | 16-битное целое со знаком с дополнением до двух | `short` | `int16_t` |
| {{jsxref("Uint16Array")}} | 0 до 65535 | 2 | 16-битное беззнаковое целое | `unsigned short` | `uint16_t` |
| {{jsxref("Int32Array")}} | -2147483648 до 2147483647 | 4 | 32-битное целое со знаком с дополнением до двух | `long` | `int32_t` |
| {{jsxref("Uint32Array")}} | 0 до 4294967295 | 4 | 32-битное беззнаковое целое | `unsigned long` | `uint32_t` |
| {{jsxref("Float32Array")}} | 1.2x10-38 to 3.4x1038 | 4 | 32-битное число с плавающей точкой IEEE-стандарта (7 значащих цифр, например 1.123456) | `unrestricted float` | `float` |
| {{jsxref("Float64Array")}} | 5.0x10-324 to 1.8x10308 | 8 | 64-битное число с плавающей точкой IEEE-стандарта (16 значащих цифр, например, 1.123...15) | `unrestricted double` | `double` |
## Свойства
- {{jsxref("TypedArray.BYTES_PER_ELEMENT")}}
- : Возвращает размер элемента для разных типизированных массивов.
- _TypedArray_.length
- : Свойство "Длина", значение которого 0.
- {{jsxref("TypedArray.name")}}
- : Возвращает строковое имя конструктора. Например, "Int8Array".
- {{jsxref("TypedArray.@@species", "get TypedArray[@@species]")}}
- : Конструктор. Используется для создания производных объектов.
- {{jsxref("TypedArray.prototype")}}
- : Прототип для _TypedArray_-объектов.
## Методы
- {{jsxref("TypedArray.from()")}}
- : Создаёт типизированный массив из массивоподобного или перечислимого объекта. Смотрите {{jsxref("Array.from()")}}.
- {{jsxref("TypedArray.of()")}}
- : Создаёт новый типизированный массив с переменным числом аргументов, из которых создастся массив. Смотрите {{jsxref("Array.of()")}}.
## Прототип TypedArray
Все TypedArrays-массивы наследуют от {{jsxref("TypedArray.prototype")}}.
### Полифилы (дополнители) методов
Многие методы, используемые в TypedArray, могут быть подменены, используя методы, присутствующие среди стандартных в прототипе Arrays. Следующий кусок Javascript-кода демонстрирует, как вы можете дополнить недостающие методы Typed Array.
```js example-bad
var typedArrayTypes = [
Int8Array,
Uint8Array,
Uint8ClampedArray,
Int16Array,
Uint16Array,
Int32Array,
Uint32Array,
Float32Array,
Float64Array,
];
for (var k in typedArrayTypes)
for (var v in Array.prototype)
if (
Array.prototype.hasOwnProperty(v) &&
!typedArrayTypes[k].prototype.hasOwnProperty(v)
)
typedArrayTypes[k].prototype[v] = Array.prototype[v];
```
## Спецификации
{{Specifications}}
## Совместимость с браузерами
{{Compat}}
## Смотрите также
- [JavaScript typed arrays](/ru/docs/Web/JavaScript/Typed_arrays)
- {{jsxref("ArrayBuffer")}}
- {{jsxref("DataView")}}