We're looking for a user researcher to understand the needs of developers and designers. Is this you or someone you know? Check out the post: https://mzl.la/2IGzdXS

Объект 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
При вызове в памяти создаётся буфер длины  lengthBYTES_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). Все TypedArrays конструкторы наследуют общие свойства от конструктора %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];

Спецификации

Спецификация Статус Примечание
Typed Array Specification Устаревшая Определяет работу TypedArray и ArrayBufferView. Заменен в ECMAScript 6.
ECMAScript 2015 (6th Edition, ECMA-262)
Определение 'TypedArray Objects' в этой спецификации.
Стандарт Первоначальное определение в стандарте ECMA. Определяет поведение индекных и именованных свойств. Указывает, что необходимо использовать оператор new.
ECMAScript Latest Draft (ECMA-262)
Определение 'TypedArray Objects' в этой спецификации.
Черновик Спецификация ECMAScript 2017 изменила конструктор TypedArray, так что используется операция ToIndex, и позволены конструкторы без аргументов.

Совместимость браузеров

ВозможностьChromeEdgeFirefoxInternet ExplorerOperaSafari
Базовая поддержка7 Да41011.65.1
Constructor without arguments ? ?55 ? ? ?
Indexed properties not consulting prototype Да1 ?25 ? ? ?
Iterable in constructor ? ?52 ? ? ?
Named properties Да ?30 ? ? ?
TypedArray() without new throws ? ?44 ? ? ?
BYTES_PER_ELEMENT7 Да41011.65.1
buffer7 Да41011.65.1
byteLength7 Да41011.65.1
byteOffset7 Да41011.65.1
copyWithin45 ?34 Нет36 Нет
entries45 ?37 Нет36 Нет
every45 ?37 Нет36 Нет
fill45 ?37 Нет36 Нет
filter45 ?38 Нет Нет Нет
find Нет ?37 Нет Нет Нет
findIndex Нет ?37 Нет Нет Нет
forEach Да ?38 Нет ?10
from45 ?38 Нет Нет10
includes471443 Нет3410
indexOf45 Да373 Нет32 Нет
join Да Да37 Нет Нет Нет
keys Да Да37 Нет Нет10
lastIndexOf Да Да374 Нет Да10
length7 Да41011.65.1
map Да Да38 Нет Нет Нет
move Нет Нет16 — 345 Нет Нет Нет
name7 Да41011.65.1
of45 ?38 Нет Нет Нет
prototype7 Да41011.65.1
reduce451237 Нет3210
reduceRight451237 Нет3210
reverse451237 Нет3210
set71241011.65.1
slice45 ?38 Нет ? ?
some45 ?37 Нет3210
sort Да ?46 Нет Да ?
subarray71241011.65.1
toLocaleString Да ?51 Да Да Да
toString Да ?51 Нет Да Да
values Да1237 Нет2610
@@iterator Да ?

36

27 — 366 7

17 — 278 9

Да Да Да
@@species ? ?48 ? ? ?
ВозможностьAndroid webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
Базовая поддержка4 Да Да411.64.2 Да
Constructor without arguments ? ? ?55 ? ? ?
Indexed properties not consulting prototype Да1 Да1 ?25 ? ? Да
Iterable in constructor ? ? ?52 ? ? ?
Named properties Да Да ?30 ? ? Да
TypedArray() without new throws ? ? ?44 ? ? ?
BYTES_PER_ELEMENT4 Да Да411.64.2 Да
buffer4 Да Да411.64.2 Да
byteLength4 Да Да411.64.2 Да
byteOffset4 Да Да411.64.2 Да
copyWithin Нет Нет ?34 Нет Нет Нет
entries Нет Да ?37 Нет Нет Да
every Нет Да ?37 Нет Нет Да
fill Нет Да ?37 Нет Нет Да
filter Нет Да ?38 Нет Нет Да
find Нет Нет ?37 Нет Нет Нет
findIndex Нет Нет ?37 Нет Нет Нет
forEach Нет Да ?38 ? ? Да
from Нет Нет ?38 Нет10 Нет
includes Нет47 ?4334105.0
indexOf Нет45 Да37332 Нет5.0
join Нет Да Да37 Нет Нет Да
keys Нет Да Да37 Нет10 Да
lastIndexOf Нет Да Да374 Да10 Да
length4 Да Да411.64.2 Да
map Нет Да Да38 Нет Нет Да
move Нет Нет Нет38 — 345 Нет Нет Нет
name4 Да Да411.64.2 Да
of Нет Нет ?38 Нет Нет Нет
prototype4 Да Да411.64.2 Да
reduce ? ? Да37 Нет10 ?
reduceRight ? ? Да37 Нет10 ?
reverse ? ? Да37 Нет10 ?
set4 Да Да411.64.2 Да
slice ? ? ?38 ? ? ?
some ? ? ?37 Нет10 ?
sort ? ? ?46 ? ? ?
subarray4 Да Да411.64.2 Да
toLocaleString Да Да ?51 Да Да Да
toString Да Да ?51 Да Да Да
values Да Да Да37 Да10 Да
@@iterator Да Да ?

36

27 — 366 7

17 — 278 9

Да Да Да
@@species ? ? ?48 ? ? ?

1. Negative integers are not considered as indexed properties and therefore return the value of the prototype property.

2. -1 and similar are not considered as indexed properties and therefore return the value of the prototype property.

3. Starting with Firefox 47, this method will no longer return -0. For example, new Uint8Array([0]).indexOf(0, -0) will now always return +0.

4. Starting with Firefox 47, this method will no longer return -0. For example, new Uint8Array([0]).lastIndexOf(0, -0) will now always return +0.

5. Was available in Aurora and Nightly channels only.

6. A placeholder property named @@iterator is used.

7. Supported as @@iterator.

8. A placeholder property named iterator is used.

9. Supported as iterator.

Совместимость

Начиная с ECMAScript 2015, конструкторы TypedArray требуют использования оператора new. Вызов конструктора TypedArray как функции без new, отныне выбросит ошибку TypeError.

var dv = Int8Array([1, 2, 3]);
// TypeError: вызов встроенного конструктора Int8Array 
// без new запрещён
var dv = new Int8Array([1, 2, 3]);

Смотрите также

Метки документа и участники

Внесли вклад в эту страницу: pk.prog, arai
Обновлялась последний раз: pk.prog,