Javascript Buffer/s? What is Buffer/s?
Tags: buffer, javascript, beginners, indonesia
Published: 2021-11-16 09:19:06

Javascript memiliki bawaan yang membuatnya tidak dapat mengelola data biner, karena awalnya didesain untuk lingkungan browser saja dan **unicode-friendly**, Javascript memakai **unicode** untuk proses **encoding** dalam bentuk **String/s** atau karakter (char) untuk tujuan pertukaran data, itu alasan kenapa Javascript tidak membaca File menggunakan Buffer melainkan menggunakan [Blob](https://developer.mozilla.org/en-US/docs/Web/API/Blob) yang bisa dibaca dalam bentuk string atau data biner, atau mengonversikannya menjadi [ReadableStream](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream) sedangkan NodeJS sudah memiliki bawaan instansi `Buffer` untuk mengelola File menggunakan data biner. 

## Apa itu unicode?

**Unicode** adalah standar sistem pengkodean yang digunakan untuk mewakili karakter dari hampir semua bahasa yang dimengerti manusia.

## Apa itu String/s?

**String/s** adalah data dari sekumpulan karakter (char) yang membentuk teks.

## Apa itu Encoding?

**Encoding** adalah proses konversi data dari satu format ke format lainnya diantaranya:

1. Utf-8 ke hex 
2. Hex ke base64
3. Octal ke hex
4. Hex ke HTML

Hasil dari **encoding** disebut sebagai **encoded strings**, yang berarti data dalam bentuk **String/s** tersebut dihasilkan dari proses **encoding**.

## Apa perbandingan antara menggunakan String/s dan Buffer/s?

Penggunaan **String/s** dibanding menggunakan **Buffer/s** secara langsung untuk pemrosesan data dalam jumlah besar kurang efisien (contohnya pada kasus pemrosesan File), alasannya karena kita harus memformat terlebih dahulu dari **unicode**, oleh karena itu **Buffer/s** tidak berjalan dengan cepat di **String operations** karena **v8** akan memperbarui kode yang sudah dihasilkan untuk **Buffer/s object**, alasannya karena **String/s** sudah bawaan pada **v8** dan mengalokasikan memori pada VM, dan karena tujuan utama **Buffer/s** bukan untuk membuat cepat **String operations** seperti **slice**, atau **concat**, namun hanya untuk mempresentasikan data biner dalam jumlah besar.

## Apa itu v8?

**v8** adalah mesin yang digunakan pada bahasa pemrograman Javascript yang menggunakan sebuah compiler dan sebuah interpreter, dan menggunakan JIT (just in time) compilation untuk meningkatkan performa.


## Apa itu Buffer/s?

| ![javascript-buffer-s-what-is-buffer-s-javascript-developer](https://res.cloudinary.com/practicaldev/image/fetch/s--QaDHbFNl--/c_limit,f_auto,fl_progressive,q_auto,w_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zocbmv5papw1eb364w0e.png) |
|:--:|
| <center><small>Image Credits - https://sayed.cyou/web-dev/javascript/javascript-buffer-s-what-is-buffer-s-javascript-developer/</small></center>|

**Buffer/s** adalah context atau area dimana data biner berasal dari **Stream/s** berada. Contohnya adalah data biner yang berasal dari `fs.createReadStream` di Javascript.

**Stream/s** memiliki banyak definisi yang bisa anda temukan di sumber lain namun intinya adalah:

> contoh kasus penggunaan untuk memproses data dalam jumlah besar yang tidak secara langsung disimpan pada memori.

Beberapa bahasa pemrograman memiliki mekanisme untuk menyimpan **Stream/s** pada memori, contohnya C# yang dapat menggunakan **MemoryStream** untuk menyimpan **Stream/s** pada memori.

Di Javascript, terdapat class `Buffer` dimana didesain untuk mengelola data biner mentah, setiap buffer dibuat bertindak sebagai array dari bilangan bulat (`<Buffer 00 00 00 00 00 00 00 00>`) dengan `Buffer` sebagai instansi-nya, tetapi tidak dapat diubah ukurannya dan memiliki banyak metode khusus untuk data biner, ketika kita menampilkan data tersebut menggunakan `console.log()`, kita akan melihat rantai nilai dengan nilai heksadesimal.

Contohnya:
```js
const buffer = Buffer.alloc(12);

console.log(buffer); // <Buffer 00 00 00 00 00 00 00 00 00 00 00 00>
```

## Kenapa menggunakan Buffer/s?

Tanpa **Buffer/s I/O (Input/output)** berarti setiap pemrosesan data akan ditangani langsung dari sistem operasi secara internal, yaitu dari disk, network, atau operasi lain yang membutuhkan resource yang besar dan mahal, dimana ini lebih tidak efisien dibandingkan menggunakan area atau context pada memori yang disebut sebagai **Buffer/s** contohnya pada pemrosesan File yang mempunyai jumlah data yang besar.

Referensi :

- [NodeJS - How to use buffer](https://nodejs.org/en/knowledge/advanced/buffers/how-to-use-buffers)
- [Mozilla - Binary](https://developer.mozilla.org/en-US/docs/Web/API/DOMString/Binary)
- [Stackoverflow - when to use buffer and what for](https://stackoverflow.com/questions/22436289/when-to-use-buffer-and-what-for)