Int32Array: примеры (JAVASCRIPT)

Типизированный массив Int32Array: примеры и применение
Раздел: Бинарные данные, Типизированные массивы
Int32Array(buffer: ArrayBuffer | length: number | array: Iterable | object): Int32Array

Общая информация о Int32Array

Int32Array — это типизированный массив, представляющий собой представление бинарных данных в виде 32-битных целых чисел со знаком в порядке байтов платформы. Он является частью JavaScript API для работы с бинарными данными и часто используется для манипуляций с бинарными буферами, взаимодействия с WebAssembly, WebGL или обработки аудио/видео.

Int32Array не является конструктором в традиционном смысле. Он вызывается как функция или используется с оператором new для создания экземпляров. Основные способы создания:

  • new Int32Array(length) — создает массив с заданным количеством элементов (каждый элемент инициализирован нулем).
  • new Int32Array(array) — создает массив из обычного массива или итерируемого объекта.
  • new Int32Array(buffer[, byteOffset[, length]]) — создает представление для существующего ArrayBuffer.
  • new Int32Array(typedArray) — создает массив из другого типизированного массива.

Свойства экземпляра:

  • BYTES_PER_ELEMENT — возвращает размер одного элемента в байтах (4).
  • buffer — ссылка на ArrayBuffer.
  • byteLength — длина в байтах.
  • byteOffset — смещение в байтах от начала буфера.
  • length — количество элементов.

Методы аналогичны методам обычного Array, но оптимизированы для работы с типизированными данными (например, set(), subarray()).

Базовые примеры использования

Создание массива заданной длины:

const arr1 = new Int32Array(3);
console.log(arr1);
Int32Array(3) [ 0, 0, 0 ]

Создание из обычного массива:

const arr2 = new Int32Array([10, -5, 42]);
console.log(arr2);
Int32Array(3) [ 10, -5, 42 ]

Создание из ArrayBuffer:

const buffer = new ArrayBuffer(16);
const arr3 = new Int32Array(buffer, 4, 2);
console.log(arr3.length, arr3.byteOffset);
2 4

Альтернативные типизированные массивы в JavaScript

  • Int8Array, Int16Array, Uint32Array, BigInt64Array — массивы целых чисел разной разрядности и знаковости. Int32Array оптимален для 32-битных целых значений.
  • Float32Array, Float64Array — для чисел с плавающей точкой.
  • DataView — более гибкое представление буфера, позволяющее читать/писать данные разных типов в любом порядке байтов. Int32Array быстрее для однотипных операций.

Обычный Array используется для данных произвольного типа, но не обеспечивает бинарную совместимость.

Распространенные ошибки

Выход за пределы диапазона 32-битного целого со знаком:

const arr = new Int32Array([2147483648]);
console.log(arr[0]);
-2147483648

Происходит переполнение. Диапазон значений: от -2 147 483 648 до 2 147 483 647.

Попытка изменить размер после создания:

const arr = new Int32Array(3);
arr.length = 5;
console.log(arr.length);
3

Длина типизированного массива неизменна.

Несовпадение типа данных при использовании set():

const arr = new Int32Array(2);
arr.set([1.9, 2.1]);
console.log(arr);
Int32Array(2) [ 1, 2 ]

Дробная часть отбрасывается (не округление).

Изменения в последних версиях ECMAScript

В ES2017 типизированные массивы, включая Int32Array, были официально включены в спецификацию как часть языка (ранее были определены в отдельных спецификациях).

Методы reverse() и sort() теперь гарантированно используют стабильную сортировку (начиная с ES2019).

Добавлена поддержка итераторов и методов массива, таких как from() и of() (ES2015).

Расширенные примеры и сценарии

Работа с WebAssembly памятью:

Пример javascript
// Предположим, что memory.buffer получен из WebAssembly
const wasmMemory = new WebAssembly.Memory({ initial: 1 });
const int32View = new Int32Array(wasmMemory.buffer, 0, 4);
int32View[0] = 42;
console.log(int32View.subarray(0, 2));
Int32Array(2) [ 42, 0 ]

Обработка бинарных данных из файла (с использованием FileReader):

Пример javascript
// В контексте браузера
// fileInput — элемент input type='file'
// const file = fileInput.files[0];
// const reader = new FileReader();
// reader.onload = (e) => {
//   const buffer = e.target.result;
//   const intArray = new Int32Array(buffer);
//   console.log(intArray.length);
// };
// reader.readAsArrayBuffer(file);
// Количество 32-битных целых в файле

Преобразование в обычный массив и обратно:

Пример javascript
const typedArr = new Int32Array([1, 2, 3]);
const normalArr = Array.from(typedArr);
normalArr.push(4);
const newTypedArr = Int32Array.from(normalArr);
console.log(newTypedArr);
Int32Array(4) [ 1, 2, 3, 4 ]

Использование с методом map (создается новый типизированный массив):

Пример javascript
const arr = new Int32Array([1, 2, 3]);
const doubled = Int32Array.from(arr, x => x * 2);
console.log(doubled);
Int32Array(3) [ 2, 4, 6 ]

Аналоги в других языках программирования

Python (библиотека array):

import array
arr = array.array('i', [10, -5, 42])
print(arr)
array('i', [10, -5, 42])

PHP (SplFixedArray с ограничениями):

$arr = new SplFixedArray(3);
$arr[0] = 10;
$arr[1] = -5;
$arr[2] = 42;
print_r($arr);
SplFixedArray Object
(
    [0] => 10
    [1] => -5
    [2] => 42
)

C (статический массив):

#include <stdio.h>
int main() {
    int32_t arr[] = {10, -5, 42};
    printf("%ld\n", sizeof(arr) / sizeof(arr[0]));
    return 0;
}
3

Отличия: в JavaScript Int32Array связан с ArrayBuffer и имеет строгую типизацию на уровне языка, в то время как аналоги в других языках часто являются отдельными структурами или библиотеками.

JS Int32Array function comments

En
Int32Array Represents an array of twos-complement 32-bit signed integers.