JavaScript'te Değiştirilebilir ve Değiştirilemez
Bu makale JavaScript'teki değiştirilebilir ve değiştirilemez kavramlarını açıklar.
YouTube Video
JavaScript'te Değiştirilebilir ve Değiştirilemez
Değiştirilebilir Nedir?
Değiştirilebilir, bir değerin değiştirilebileceği anlamına gelir. Referans türleri olan nesneler ve diziler, değiştirilebilir veri yapılarına tipik örneklerdir.
Değiştirilebilir Bir Nesne Örneği
1let person = { name: "Alice", age: 25 };
2person.age = 26;
3console.log(person); // { name: "Alice", age: 26 }
Bu kodda, person
nesnesinin age
özelliği 25
ten 26
ya değiştirilmiştir. Nesneler referans yoluyla geçtiği için, person
değişkeninde saklanan bellek adresindeki içerik değiştirilir.
Değiştirilebilir Bir Dizi Örneği
1let numbers = [1, 2, 3];
2numbers.push(4);
3console.log(numbers); // [1, 2, 3, 4]
Bu kodda, push
yöntemi kullanılarak orijinal diziye yeni bir öğe 4
eklenir. Bu, orijinal diziyi değiştirir ve bu da onu bir değiştirilebilir işlem yapar.
Bir Fonksiyonda Örnek
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)
Bir fonksiyon içinde değiştirilebilir işlemler yapıldığında, orijinal dizi de değiştirilir.
Değiştirilemez Nedir?
Değiştirilemez, bir değerin değiştirilemeyeceği anlamına gelir. İlkel türler temelde değiştirilemezdir.
Değiştirilemez Bir İlkel Türün Örneği
1let str = "hello";
2str[0] = "H";
3console.log(str); // "hello"
str
dizesinin ilk karakterini H
olarak değiştirme girişimi başarısız olur çünkü dizeler değiştirilemezdir.
Bir Fonksiyonda Örnek
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)
Sayılar değiştirilemez olduğu için, bir fonksiyon içindeki işlemler orijinal değişkeni etkilemez.
Dizilerde Değiştirilemez İşlemler
Diziler değiştirilebilir, ancak orijinalini değiştirmek yerine yeni bir dizi oluşturmak, değiştirilemez işlemlere olanak tanır.
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)
Burada, yayılma biçimi (...
) newNumbers
adlı yeni bir dizi oluşturmak için kullanılır. Orijinal numbers
dizisi değiştirilmediği için bu işlemsiz bir operasyondur.
Değişmez Veri Yapılarının Kullanımının Faydaları
Geliştirilmiş Öngörülebilirlik
Değişmez veriler değiştirilemediği için, beklenmedik değişikliklerin olma olasılığı daha düşüktür, bu da hata riskini azaltır.
Değişmezliğe Dayalı Kütüphanelerle Uyumluluk
React
ve Redux
gibi kütüphaneler genellikle değişmez veri düşünülerek tasarlanır, bu da doğru şekilde kullanıldığında durum yönetimini kolaylaştırır.
Nesneleri Object.freeze ile Değişmez Hale Getirmek
Object.freeze
, bir nesneye yapılan değişiklikleri önlemek için kullanılabilir.
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 }
Ancak, Object.freeze
yalnızca yüzeysel bir dondurma yapar, yani iç içe geçmiş nesnelerin özellikleri değiştirilebilir durumda kalır.
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)
Tamamen değişmez bir nesne oluşturmak için derin dondurma gereklidir.
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)
Özet
- Değişebilir veri, nesneler ve diziler dahil olmak üzere değiştirilebilir.
- Değişmez veri, dizgi ve sayı gibi temel türler dahil olmak üzere değiştirilemez.
- Yayılma sözdizimi veya
map
kullanmak, değişmez veri işlemlerini mümkün kılar.. Object.freeze
vedeepFreeze
nesnelerde değişiklik yapılmasını önlemek için kullanılabilir.- Değişmez veri kullanımı, daha öngörülebilir ve daha az hata eğilimli kod sağlar.
Değişmez tasarım, kod güvenliğini ve okunabilirliğini artırır, bu yüzden bunu iyi değerlendirin!
Yukarıdaki makaleyi, YouTube kanalımızda Visual Studio Code'u kullanarak takip edebilirsiniz. Lütfen YouTube kanalını da kontrol edin.