Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Buffer проти масиву». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)Буфер створюють через `Buffer.from()` (з наявних даних), `Buffer.alloc()` (новий, обнулений), `Buffer.allocUnsafe()` (швидко, без обнулення) чи `Buffer.concat()` (об'єднання кількох); на відміну від масиву, буфер зберігає лише байти (0-255), має фіксований розмір і живе поза керованою пам'яттю V8. **Ключове:** `Buffer.allocUnsafe()` швидший за `alloc()`, але може містити залишкові дані з пам'яті - використовуй лише якщо одразу перезаписуєш усі байти.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## 1. Як створити новий Buffer У Node.js є кілька способів створити буфер: ### `Buffer.from()` Створює буфер **з наявних даних** (рядка, масиву байтів, іншого буфера): ```javascript const buf1 = Buffer.from('Hello', 'utf8'); // з рядка const buf2 = Buffer.from([72, 101, 108, 108, 111]); // з масиву чисел ``` ### `Buffer.alloc(size)` Створює **новий буфер заданого розміру**, заповнений **нулями**: ```javascript const buf3 = Buffer.alloc(10); // 10 байт, усі 0 ``` Безпечний спосіб - очищає пам'ять перед використанням. ### `Buffer.allocUnsafe(size)` Створює буфер потрібного розміру, **але без обнулення пам'яті** (може містити "сміття" від попередніх даних у пам'яті): ```javascript const buf4 = Buffer.allocUnsafe(10); ``` Використовується, якщо потрібна **максимальна швидкість**, і ти точно будеш **записувати всі байти** вручну. ### `Buffer.concat(list)` Об'єднує кілька буферів в один: ```javascript 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`) | ### Приклад відмінностей: ```javascript 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.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.