JavaScript’in parametre geçişini ele alış biçimi sıklıkla kafa karışıklığına yol açar ve genellikle değer-ile-geçme veya referans-ile-geçme olarak tartışılır. Gerçeklik daha inceliklidir: JavaScript, tamamen ilgili veri türüne bağlı olarak her ikisinin de özelliklerini birleştiren bir mekanizma kullanır.
İçerik Tablosu
- İlkel Verilerle Değer-İle-Geçmeyi Anlamak
- Nesnelerle Referans-İle-Geçmeyi Kavramak
- JavaScript’te Değer-İle-Geçme ve Referans-İle-Geçmeyi Uzlaştırmak
İlkel Verilerle Değer-İle-Geçmeyi Anlamak
JavaScript’in ilkel veri tipleri—number
, string
, boolean
, null
, undefined
, bigint
ve symbol
—değer-ile-geçme kullanarak çalışır. Bir ilkel veri tipi bir fonksiyona geçtiğinde, değerinin bir kopyası oluşturulur ve geçirilir. Fonksiyon içinde yapılan değişiklikler yalnızca bu kopyuyu etkiler ve orijinal değişkeni değiştirmeden bırakır.
let x = 10;
function changeValue(y) {
y = 20;
}
changeValue(x);
console.log(x); // Çıktı: 10
Bu örnekte, changeValue
içinde y
‘nin değiştirilmesi orijinal x
‘i değiştirmez.
Nesnelerle Referans-İle-Geçmeyi Kavramak
JavaScript’teki nesneler (diziler ve fonksiyonlar dahil) farklı davranır. Bir nesne bir fonksiyona geçtiğinde, geçirilen şey bir referanstır—nesnenin bellek konumuna işaret eden bir işaretçi. Bu nedenle, fonksiyon *içinde* nesnenin özelliklerinde yapılan herhangi bir değişiklik doğrudan orijinal nesneyi etkiler.
let myArray = [1, 2, 3];
function modifyArray(arr) {
arr.push(4);
}
modifyArray(myArray);
console.log(myArray); // Çıktı: [1, 2, 3, 4]
Burada, myArray
değiştirilir çünkü fonksiyon nesnenin kendisini, bir kopyasını değil değiştirir.
Ancak, önemli bir ayrım vardır: parametreyi fonksiyon içinde *yeni* bir nesneye yeniden atamak orijinal nesneyi değiştirmez.
let myObject = { a: 1 };
function reassignObject(obj) {
obj = { a: 2 }; // Yeni bir nesne ataması
}
reassignObject(myObject);
console.log(myObject); // Çıktı: { a: 1 }
reassignObject
içinde, obj
farklı bir nesneyi işaret eder; orijinal myObject
değişmeden kalır.
JavaScript’te Değer-İle-Geçme ve Referans-İle-Geçmeyi Uzlaştırmak
JavaScript’in parametre geçişi kesinlikle bir ya da diğeri değildir. Bağlama bağlı bir sistemdir:
- İlkel Türler: Değer-ile-geçme. Değerin bir kopyası geçirilir; iç değişiklikler orijinali etkilemez.
- Nesneler: Referans-ile-geçme. Nesneye bir referans geçirilir; nesnenin özelliklerindeki değişiklikler orijinali etkiler. Parametreyi fonksiyon içinde yeni bir nesneye yeniden atamak orijinali değiştirmeden bırakır.
Bu ayrımı anlamak, sağlam ve öngörülebilir JavaScript kodu yazmak için çok önemlidir. Davranış tamamen ilkel verilerle mi yoksa nesnelerle mi çalıştığınıza bağlıdır.