Buffer проти масиву
1. Як створити новий Buffer
У Node.js є кілька способів створити буфер:
Buffer.from()
Створює буфер з наявних даних (рядка, масиву байтів, іншого буфера):
const buf1 = Buffer.from('Hello', 'utf8'); // з рядка
const buf2 = Buffer.from([72, 101, 108, 108, 111]); // з масиву чиселBuffer.alloc(size)
Створює новий буфер заданого розміру, заповнений нулями:
const buf3 = Buffer.alloc(10); // 10 байт, усі 0Безпечний спосіб - очищає пам'ять перед використанням.
Buffer.allocUnsafe(size)
Створює буфер потрібного розміру, але без обнулення пам'яті (може містити "сміття" від попередніх даних у пам'яті):
const buf4 = Buffer.allocUnsafe(10);Використовується, якщо потрібна максимальна швидкість, і ти точно будеш записувати всі байти вручну.
Buffer.concat(list)
Об'єднує кілька буферів в один:
const part1 = Buffer.from('Hello ');
const part2 = Buffer.from('World');
const buf = Buffer.concat([part1, part2]);
console.log(buf.toString()); // "Hello World"2. Чим Buffer відрізняється від звичайного масиву
| Критерій | Buffer | Array |
|---|---|---|
| Тип даних | Зберігає байти (числа 0-255) | Може зберігати будь-які значення (числа, рядки, об'єкти тощо) |
| Розмір | Фіксований - не можна змінити довжину після створення | Динамічний - можна додавати й видаляти елементи |
| Продуктивність | Працює на рівні C++, дуже швидко для бінарних операцій | Повільніше, оскільки реалізований на рівні JS |
| Призначення | Для бінарних даних (файли, мережа, потоки) | Для логічних даних і структур у JS |
| Пам'ять | Розташовується в некерованій пам'яті (поза V8 heap) | Зберігається в керованій пам'яті V8 |
| Кодування | Підтримує читання/запис рядків у різних кодуваннях (utf8, hex, base64) | Не підтримує кодування напряму |
| Методи | Має низькорівневі методи (readUInt8, writeUInt16LE, slice, toString) | Звичайні методи масиву (map, forEach, push) |
Приклад відмінностей:
const arr = [72, 101, 108, 108, 111];
const buf = Buffer.from(arr);
console.log(arr); // [72, 101, 108, 108, 111]
console.log(buf); // <Buffer 48 65 6c 6c 6f>
console.log(arr.map(x => String.fromCharCode(x)).join('')); // "Hello"
console.log(buf.toString('utf8')); // "Hello"Обидва зберігають однакові числа,
але Buffer - оптимізований під роботу з байтами, а Array - для логіки на рівні JS.
Підсумок
Buffer- це спеціальний тип для зберігання й обробки бінарних даних, створюється черезBuffer.from(),Buffer.alloc(),Buffer.allocUnsafe()чиBuffer.concat().Він відрізняється від звичайного масиву тим, що:
- зберігає лише байти (0-255),
- має фіксований розмір,
- працює швидше й ближче до "заліза",
- використовується в усіх I/O операціях Node.js.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.