TypedArray
BaselineWidely 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(); // новое в ES2017new 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® 2026 Language Specification # sec-typedarray-objects |