A buffer is an area of memory. JavaScript developers are not familiar with this concept, much less than C, C++ or Go developers (or any programmer that uses a system programming language), which interact with memory every day.
It represents a fixed-size chunk of memory (can’t be resized) allocated outside of the V8 JavaScript engine.
You can think of a buffer like an array of integers, which each represent a byte of data.
It is implemented by the Node.js Buffer class.
Buffers were introduced to help developers deal with binary data, in an ecosystem that traditionally only dealt with strings rather than binaries.
Buffers are deeply linked with streams. When a stream processor receives data faster than it can digest, it puts the data in a buffer.
A simple visualization of a buffer is when you are watching a YouTube video and the red line goes beyond your visualization point: you are downloading data faster than you’re viewing it, and your browser buffers it.
A buffer is created using the Buffer.from()
, Buffer.alloc()
, and Buffer.allocUnsafe()
methods.
const buf = Buffer.from('Hey!');
Buffer.from(array)
Buffer.from(arrayBuffer[, byteOffset[, length]])
Buffer.from(buffer)
Buffer.from(string[, encoding])
You can also just initialize the buffer passing the size. This creates a 1KB buffer:
const buf = Buffer.alloc(1024);//orconst buf = Buffer.allocUnsafe(1024);
While both alloc
and allocUnsafe
allocate a Buffer
of the specified size in bytes, the Buffer
created by alloc
will be initialized with zeroes and the one created by allocUnsafe
will be uninitialized. This means that while allocUnsafe
would be quite fast in comparison to alloc
, the allocated segment of memory may contain old data which could potentially be sensitive.
Older data, if present in the memory, can be accessed or leaked when the Buffer
memory is read. This is what really makes allocUnsafe
unsafe and extra care must be taken while using it.