Int16Array: примеры (JAVASCRIPT)
Int16Array(buffer: ArrayBuffer | length: number | array: Iterable | object): Int16ArrayОсновы Int16Array
Int16Array - это типизированный массив, представляющий собой представление бинарных данных в виде 16-битных целых чисел со знаком в порядке байтов платформы. Он является частью семейства типизированных массивов JavaScript, предназначенных для работы с бинарными данными.
Типизированные массивы используются для обработки бинарных данных, например, при работе с графикой, аудио, сетевыми протоколами или файловыми форматами, где важна точность представления чисел и эффективность использования памяти.
Конструкторы Int16Array
Int16Array можно создать несколькими способами:
- new Int16Array(length) - создает массив с указанным количеством элементов (каждый элемент инициализируется нулем)
- new Int16Array(typedArray) - создает массив из другого типизированного массива
- new Int16Array(object) - создает массив из итерируемого объекта или обычного массива
- new Int16Array(buffer[, byteOffset[, length]]) - создает представление ArrayBuffer с указанным смещением и длиной
Свойства и возвращаемые значения
Int16Array наследует свойства от TypedArray и ArrayBuffer:
- BYTES_PER_ELEMENT - возвращает 2 (размер элемента в байтах)
- buffer - ссылка на ArrayBuffer
- byteLength - размер в байтах
- byteOffset - смещение в байтах от начала ArrayBuffer
- length - количество элементов в массиве
Базовые примеры использования
Создание Int16Array различными способами:
Пример 1: Создание по длине
const arr1 = new Int16Array(4);
console.log(arr1);Int16Array(4) [ 0, 0, 0, 0 ]
Пример 2: Создание из обычного массива
const arr2 = new Int16Array([10, 20, 30, 40]);
console.log(arr2);
console.log('Размер в байтах:', arr2.byteLength);Int16Array(4) [ 10, 20, 30, 40 ] Размер в байтах: 8
Пример 3: Создание из ArrayBuffer
const buffer = new ArrayBuffer(8);
const arr3 = new Int16Array(buffer, 2, 3);
arr3.set([100, 200, 300]);
console.log(arr3);
console.log('Смещение:', arr3.byteOffset);Int16Array(3) [ 100, 200, 300 ] Смещение: 2
Пример 4: Методы работы с массивом
const arr4 = new Int16Array([5, 15, 25, 35]);
console.log('Первый элемент:', arr4[0]);
console.log('Сумма элементов:', arr4.reduce((a, b) => a + b));
const subarray = arr4.subarray(1, 3);
console.log('Подмассив:', subarray);Первый элемент: 5 Сумма элементов: 80 Подмассив: Int16Array(2) [ 15, 25 ]
Похожие типизированные массивы в JavaScript
JavaScript предоставляет различные типизированные массивы для разных числовых форматов:
- Int8Array - 8-битные целые со знаком (от -128 до 127)
- Uint16Array - 16-битные целые без знака (от 0 до 65535)
- Int32Array - 32-битные целые со знаком (больший диапазон, но больше памяти)
- Float32Array - 32-битные числа с плавающей точкой
- Float64Array - 64-битные числа с плавающей точкой (двойная точность)
Выбор зависит от требований к диапазону значений, точности и объему памяти. Int16Array оптимален для значений в диапазоне от -32768 до 32767 при необходимости экономии памяти по сравнению с 32-битными типами.
Типичные ошибки и проблемы
Ошибка 1: Выход за пределы диапазона значений
const arr = new Int16Array(2);
arr[0] = 40000; // Превышает максимальное значение 32767
console.log(arr[0]);-25536 // Произошло переполнение
Ошибка 2: Неправильное использование конструктора
try {
const arr = new Int16Array('abc');
} catch (e) {
console.log('Ошибка:', e.message);
}Ошибка: Invalid array length
Ошибка 3: Изменение длины массива
const arr = new Int16Array([1, 2, 3]);
arr.length = 5; // Типизированные массивы имеют фиксированную длину
console.log(arr.length);3 // Длина не изменилась
Ошибка 4: Смешение типов данных
const arr = new Int16Array(3);
arr[0] = 3.14; // Дробная часть будет отброшена
console.log(arr[0]);3 // Дробная часть потеряна
Изменения в последних версиях
Int16Array является частью спецификации ECMAScript 6 и существенно не изменялся в последующих версиях. Однако, улучшения касаются в основном интеграции с другими возможностями языка:
- В ES2017 улучшена поддержка итераторов и методов массива
- В более новых версиях улучшена производительность в движках JavaScript
- Добавлена лучшая поддержка в методах типа slice, map, filter с сохранением типа
- Интеграция с Atomics API для многопоточных операций через Web Workers
Все современные браузеры полностью поддерживают Int16Array, включая мобильные версии.
Расширенные примеры использования
Пример 1: Обработка аудиоданных
// Эмуляция обработки аудиобуфера
const sampleRate = 44100;
const duration = 1; // секунда
const samples = sampleRate * duration;
const audioBuffer = new Int16Array(samples);
// Генерация синусоидальной волны 440 Гц
for (let i = 0; i < samples; i++) {
const time = i / sampleRate;
audioBuffer[i] = Math.sin(2 * Math.PI * 440 * time) * 32767;
}
console.log('Аудиобуфер создан, samples:', audioBuffer.length);
console.log('Пиковое значение:', Math.max(...audioBuffer.slice(0, 100)));Аудиобуфер создан, samples: 44100 Пиковое значение: 32767
Пример 2: Работа с бинарными протоколами
// Эмуляция парсинга сетевого пакета
const packet = new ArrayBuffer(12);
const view = new Int16Array(packet);
// Заполнение заголовка пакета
view[0] = 0x4A53; // JS - идентификатор
view[1] = 0x0100; // версия 1.0
view[2] = 100; // тип пакета
view[3] = 4; // количество данных
// Данные пакета
const dataView = new DataView(packet);
dataView.setInt32(8, 123456, true); // little-endian
console.log('Идентификатор:', view[0].toString(16));
console.log('Данные:', dataView.getInt32(8, true));Идентификатор: 4a53 Данные: 123456
Пример 3: Взаимодействие с WebGL
// Создание буфера для индексов геометрии (треугольники)
const indexData = [
0, 1, 2, // первый треугольник
2, 3, 0 // второй треугольник
];
const indexBuffer = new Int16Array(indexData);
console.log('Буфер индексов создан');
console.log('Размер буфера:', indexBuffer.byteLength, 'байт');
console.log('Индексы:', ...indexBuffer);Буфер индексов создан Размер буфера: 12 байт Индексы: 0 1 2 2 3 0
Пример 4: Параллельные вычисления с Atomics
// Использование в многопоточном контексте
if (typeof SharedArrayBuffer !== 'undefined') {
const sharedBuffer = new SharedArrayBuffer(16);
const sharedArray = new Int16Array(sharedBuffer);
// Инициализация данных
sharedArray[0] = 1;
sharedArray[1] = 2;
// Атомарная операция сложения
Atomics.add(sharedArray, 0, 5);
console.log('Результат атомарного сложения:', sharedArray[0]);
} else {
console.log('SharedArrayBuffer не поддерживается');
}Результат атомарного сложения: 6
Пример 5: Конвертация между типами массивов
const floatArray = new Float32Array([1.5, 2.7, 3.9, 4.2]);
const int16Array = new Int16Array(floatArray.length);
// Конвертация с масштабированием
floatArray.forEach((value, index) => {
int16Array[index] = Math.round(value * 100);
});
console.log('Исходный Float32Array:', ...floatArray);
console.log('Преобразованный Int16Array:', ...int16Array);
// Обратная конвертация
const backConverted = new Float32Array(int16Array.length);
int16Array.forEach((value, index) => {
backConverted[index] = value / 100;
});
console.log('Восстановленный массив:', ...backConverted);Исходный Float32Array: 1.5 2.7 3.9 4.2 Преобразованный Int16Array: 150 270 390 420 Восстановленный массив: 1.5 2.7 3.9 4.2
Аналоги в других языках программирования
Python (массивы модуля array):
import array
arr = array.array('h', [10, 20, 30, 40]) # 'h' - signed short
print(arr)
print('Размер элемента:', arr.itemsize)array('h', [10, 20, 30, 40])
Размер элемента: 2C (статический массив):
#include
int main() {
int16_t arr[4] = {10, 20, 30, 40};
printf("Размер массива: %lu байт\n", sizeof(arr));
return 0;
} Размер массива: 8 байт
PHP (pack/unpack):
$data = pack('s4', 10, 20, 30, 40); // 's' - signed short
$unpacked = unpack('s4', $data);
print_r($unpacked);Array
(
[1] => 10
[2] => 20
[3] => 30
[4] => 40
)Основное отличие JavaScript Int16Array - это интегрированность в язык и поддержка методов Array, тогда как в других языках часто требуются отдельные библиотеки или более низкоуровневая работа с памятью.