Коротка відповідь
juniorArrayBuffer — це контейнер для бінарних даних, що не має типу. Uint32Array і Float32Array — це typed‑arrays, які створюють представлення даних у ArrayBuffer як unsigned 32‑bit integers або 32‑bit floating‑point numbers відповідно. Різниця полягає у форматі зберігання і арифметичних операціях, що застосовуються до елементів.
Повне пояснення
Що це і навіщо
- ArrayBuffer – низькорівневий буфер, що містить послідовність байтів. Використовується для роботи з бінарними даними (файли, WebSocket, WebRTC, Canvas, WebGL).
- Typed‑arrays (Uint32Array, Float32Array тощо) – об’єкти, що надають типізоване представлення ArrayBuffer. Вони дозволяють читати/записувати значення певного типу без ручної конвертації.
Ключові принципи/терміни
- ArrayBuffer: immutable length, raw bytes.
- TypedArray: view over ArrayBuffer, fixed element size (32‑bit), signed/unsigned, integer/floating.
- Endianness: little‑endian by default in JavaScript.
Як це працює
- Створюється ArrayBuffer:
new ArrayBuffer(16)– 16 байт. - Створюється view:
new Uint32Array(buffer)– 4 елементи (4 байти кожен). - Доступ до елементів:
arr[0] = 42;. - Операції виконуються у відповідності до типу: Uint32Array обмежує значення 0–2³²‑1, Float32Array підтримує плаваючі числа.
Практика і реалізація
const buf = new ArrayBuffer(8);
const u32 = new Uint32Array(buf);
u32[0] = 123456;
const f32 = new Float32Array(buf);
console.log(f32[0]); // 123456.0
Тестування
import { describe, it } from 'vitest';
describe('TypedArray', () => {
it('converts correctly', () => {
const buf = new ArrayBuffer(4);
const u32 = new Uint32Array(buf);
u32[0] = 1;
const f32 = new Float32Array(buf);
expect(f32[0]).toBeCloseTo(1.0);
});
});
Особливості в контексті JS/TS
- Typed‑arrays підтримуються у TypeScript з відповідними типами (
Uint32Array,Float32Array). - Для WebGL потрібні Float32Array для шейдерів.
Оптимізація, типові помилки
- Перевірка розмірів:
buffer.byteLengthмає відповідати кількості елементів * elementSize. - Не змішувати типи: Uint32Array не можна безпосередньо передати як Float32Array.
- Пам’ятайте про endianness при обміні даними між різними платформами.
Часті помилки
- Переповнення: запис значення > 2³²‑1 у Uint32Array.
- Невірний індекс: доступ за межами
length. - Відсутність
ArrayBufferпри створенні view. - Неочікуваний тип: використання Float32Array для цілих чисел.
- Відсутність
bufferу TypedArray при копіюванні. - Пам’ятайте про
slice– створює новий ArrayBuffer. - Не враховувати endianness при читанні з зовнішніх джерел.
- Перевірка
ArrayBuffer.isView(obj)перед операціями.
Cheatsheet
new ArrayBuffer(size)– створити буфер.new Uint32Array(buffer, byteOffset?, length?)– view..byteLength,.length,.BYTES_PER_ELEMENT– властивості.buffer.slice(start, end)– копія буфера.