Int32Array: примеры (JAVASCRIPT)
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 памятью:
// Предположим, что 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):
// В контексте браузера
// 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-битных целых в файле
Преобразование в обычный массив и обратно:
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 (создается новый типизированный массив):
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 и имеет строгую типизацию на уровне языка, в то время как аналоги в других языках часто являются отдельными структурами или библиотеками.