Mutable dan Immutable dalam JavaScript
Artikel ini menjelaskan konsep mutable dan immutable dalam JavaScript.
YouTube Video
Mutable dan Immutable dalam JavaScript
Apa itu Mutable?
Mutable berarti sebuah nilai dapat dimodifikasi. Objek dan array, yang merupakan tipe referensi, adalah contoh khas dari struktur data yang mutable.
Contoh Objek yang Mutable
1let person = { name: "Alice", age: 25 };
2person.age = 26;
3console.log(person); // { name: "Alice", age: 26 }
Dalam kode ini, properti age
dari objek person
diubah dari 25
menjadi 26
. Karena objek dikirim sebagai referensi, konten pada alamat memori yang disimpan dalam variabel person
dimodifikasi.
Contoh Array yang Mutable
1let numbers = [1, 2, 3];
2numbers.push(4);
3console.log(numbers); // [1, 2, 3, 4]
Dalam kode ini, metode push
digunakan untuk menambahkan elemen baru 4
ke array asli. Ini memodifikasi array asli, menjadikannya operasi yang mutable.
Contoh dalam Fungsi
1// Function to append a value to an array
2function append(arr, value) {
3 arr.push(value); // Modify the original array
4 console.log(arr);
5}
6
7let numbers = [1, 2, 3];
8append(numbers, 4);
9
10console.log(numbers); // [1, 2, 3, 4] (original array is modified)
Ketika melakukan operasi mutable di dalam fungsi, array asli juga ikut dimodifikasi.
Apa itu Immutable?
Immutable berarti sebuah nilai tidak dapat dimodifikasi. Tipe primitif pada dasarnya bersifat immutable.
Contoh Tipe Primitif yang Immutable
1let str = "hello";
2str[0] = "H";
3console.log(str); // "hello"
Mencoba mengubah karakter pertama dari string str
menjadi H
gagal karena string bersifat immutable.
Contoh dalam Fungsi
1// Function to increment a number
2function increment(num) {
3 num++; // This modifies only the local copy of num
4 console.log(num);
5}
6
7let number = 10;
8increment(number);
9
10console.log(number); // 10 (original number remains unchanged)
Karena angka bersifat immutable, operasi di dalam fungsi tidak memengaruhi variabel asli.
Operasi Immutable pada Array
Array bersifat mutable, tetapi membuat array baru daripada memodifikasi yang asli memungkinkan operasi bersifat immutable.
1// Create an array of numbers
2let numbers = [1, 2, 3];
3
4// Create a new array by spreading the original and adding a new element
5let newNumbers = [...numbers, 4];
6
7console.log(numbers); // [1, 2, 3] (original array is unchanged)
8console.log(newNumbers); // [1, 2, 3, 4] (new array with an added element)
Di sini, sintaks penyebaran (...
) digunakan untuk membuat array baru newNumbers
. Karena array numbers
asli tidak dimodifikasi, ini adalah operasi yang tidak dapat diubah.
Manfaat Menggunakan Struktur Data yang Tidak Dapat Diubah
Peningkatan Prediktabilitas
Karena data yang tidak dapat diubah tidak dapat diubah, modifikasi tak terduga lebih kecil kemungkinannya terjadi, sehingga mengurangi risiko bug.
Kompatibilitas dengan Pustaka Berbasis Ketidakberubahan
Pustaka seperti React
dan Redux
sering dirancang dengan mempertimbangkan data yang tidak dapat diubah, sehingga mempermudah pengelolaan state jika digunakan dengan benar.
Membuat Objek Tidak Dapat Diubah dengan Object.freeze
Object.freeze
dapat digunakan untuk mencegah modifikasi pada sebuah objek.
1// Create a frozen object (properties cannot be modified)
2const person = Object.freeze({ name: "Alice", age: 25 });
3
4// Attempt to modify a property (ignored in non-strict mode, error in strict mode)
5person.age = 26;
6
7console.log(person); // { name: "Alice", age: 25 }
Namun, Object.freeze
melakukan pembekuan dangkal, yang berarti properti dari objek bersarang tetap dapat diubah.
1// Create a frozen object with a nested object
2const user = Object.freeze({ profile: { name: "Bob" } });
3
4// Attempt to modify a nested property (this works because Object.freeze() is shallow)
5user.profile.name = "Charlie";
6
7console.log(user.profile.name); // "Charlie" (nested object is still mutable)
Untuk membuat objek sepenuhnya tidak dapat diubah, diperlukan pembekuan mendalam.
1// Function to deeply freeze an object, making all nested objects immutable
2function deepFreeze(obj) {
3 Object.keys(obj).forEach(key => {
4 if (typeof obj[key] === "object" && obj[key] !== null) {
5 deepFreeze(obj[key]); // Recursively freeze nested objects
6 }
7 });
8 return Object.freeze(obj); // Freeze the top-level object
9}
10
11// Create a deeply frozen object
12const user = deepFreeze({ profile: { name: "Bob" } });
13
14// Attempt to modify a nested property (ignored)
15user.profile.name = "Charlie";
16
17console.log(user.profile.name); // "Bob" (unchanged due to deep freeze)
Ringkasan
- Data dapat diubah dapat dimodifikasi, termasuk objek dan array.
- Data tidak dapat diubah tidak dapat dimodifikasi, termasuk tipe primitif seperti string dan angka.
- Menggunakan sintaks penyebaran atau
map
memungkinkan operasi data yang tidak dapat diubah.. Object.freeze
dandeepFreeze
dapat digunakan untuk mencegah modifikasi pada objek.- Menggunakan data yang tidak dapat diubah memungkinkan kode yang lebih dapat diprediksi dan kurang rentan kesalahan.
Desain yang tidak dapat diubah meningkatkan keamanan dan keterbacaan kode, jadi manfaatkan dengan baik!
Anda dapat mengikuti artikel di atas menggunakan Visual Studio Code di saluran YouTube kami. Silakan periksa juga saluran YouTube kami.