TypedArray
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.
Объект TypedArray (типизированный массив) это массивоподобное представление нижележащего буфера с бинарными данными (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
типа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]
). Однако, получение и установка индексируемых свойств по цепи прототипов не будет происходить даже в случае, когда вы пытаетесь использовать индексы извне массива. Индексируемые свойства обращаются к элементам буфера ArrayBuffer
и не имеют отношения к объектным свойствам. Также можно использовать именованные свойства как и в обычных объектах.
//Установка и получение используя стандартный синтаксис массивов
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 |
---|---|---|---|---|---|
Int8Array |
-128 до 127 | 1 | 8-битное целое со знаком с дополнением до двух | byte |
int8_t |
Uint8Array |
0 до 255 | 1 | 8-битное беззнаковое целое | octet |
uint8_t |
Uint8ClampedArray |
0 до 255 | 1 | 8-битное беззнаковое целое (фиксированное от 0 до 255) | octet |
uint8_t |
Int16Array |
-32768 до 32767 | 2 | 16-битное целое со знаком с дополнением до двух | short |
int16_t |
Uint16Array |
0 до 65535 | 2 | 16-битное беззнаковое целое | unsigned short |
uint16_t |
Int32Array |
-2147483648 до 2147483647 | 4 | 32-битное целое со знаком с дополнением до двух | long |
int32_t |
Uint32Array |
0 до 4294967295 | 4 | 32-битное беззнаковое целое | unsigned long |
uint32_t |
Float32Array |
1.2x10-38 to 3.4x1038 | 4 | 32-битное число с плавающей точкой IEEE-стандарта (7 значащих цифр, например 1.123456) | unrestricted float |
float |
Float64Array |
5.0x10-324 to 1.8x10308 | 8 | 64-битное число с плавающей точкой IEEE-стандарта (16 значащих цифр, например, 1.123...15) | unrestricted double |
double |
Свойства
TypedArray.BYTES_PER_ELEMENT
-
Возвращает размер элемента для разных типизированных массивов.
- TypedArray.length
-
Свойство "Длина", значение которого 0.
TypedArray.name
-
Возвращает строковое имя конструктора. Например, "Int8Array".
get TypedArray[@@species]
-
Конструктор. Используется для создания производных объектов.
TypedArray.prototype
-
Прототип для TypedArray-объектов.
Методы
TypedArray.from()
-
Создаёт типизированный массив из массивоподобного или перечислимого объекта. Смотрите
Array.from()
. TypedArray.of()
-
Создаёт новый типизированный массив с переменным числом аргументов, из которых создастся массив. Смотрите
Array.of()
.
Прототип TypedArray
Все TypedArrays-массивы наследуют от TypedArray.prototype
.
Полифилы (дополнители) методов
Многие методы, используемые в TypedArray, могут быть подменены, используя методы, присутствующие среди стандартных в прототипе Arrays. Следующий кусок Javascript-кода демонстрирует, как вы можете дополнить недостающие методы Typed Array.
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];
Спецификации
Specification |
---|
ECMAScript Language Specification # sec-typedarray-objects |
Совместимость с браузерами
BCD tables only load in the browser