[]

Javacript Primitives vs Objects

Şöyle bir sorum olacak Romalılar
var age=27;// bu bir primitive değişken
var obj={
name:'Ali',
city:'Ankara'
};//burda bir obje olsun

function change(a,b){
a=30;
b.city='İzmir';
}

change(age,obj);
console.log(age,obj);

Nasıl oluyorda konsolda 27 izmir yazıyor? fonksiyon objenin city değerini değiştiriken age değeri neden 27 kalıyor? Return olmadığından mı yoksa değişkenlerin tanımlanmasındaki scope hiyerarşisinden mi?

 
  • bedbed  (24.07.18 14:33:16) 
fonksiyon çağrılırken primitive tiplerin değeri diğer tiplerin referansı geçiliyor o yüzden


  • Sir Anthony Hopkins  (24.07.18 14:43:11) 
tam bir "pass by value / pass by reference" sorusu. JavaScript de referans ve hafiza alani nasil calisir?

"age" diye bir referans olusturuyorsun, bunu bir adres gibi dusun. bu referans icinde 27 olan bir hafiza alanini gosteriyor. "obj" diye bir referans olusturuyorsun, bu referans icinde baska referanslarin oldugu hafiza alanini gosteriyor. buna obje deniliyor. simdi bir de "city" diye bir referans olusturuyorsun, bu da icinde "Ankara" yazan hafiza alanini gosteriyor. Kisaca elinde soyle bir yapi oluyor;

age->27 ve obj->city->'Ankara'

age, obj, city adli 3 referans. 27 ve 'Ankara' diye iki hafiza alani.

fonksiyona age ve obj referansini gonderiyorsun. Ama javascript "pass by value" calistigi icin fonksiyona gelen referansi degil de degerini kopyalar. yani gelen age referansini degil de 27 degerini alir, hafizada o 27 icin yeni bir yer acar yani kopyalar ve onu yeni olusturulan "a" referansi ile gosterir. daha sonra gelen objeyi yani icinde bircok referans bulunduran hafiza alanini alir, kopyalar ve yeni hafiza alani acar ve bu hafiza alanini "b" referansi ile gosterir.

simdi elinde icinde degerleri farkli olsa da iki farkli hafiza alani var ve icinde ikisi de 27 degerini tutuyor.

age->27
a->27

ayrica birbirinin kopyasi iki farkli hafiza alani var, ikisinde de birbirinin kopyasi iki referans var. ama bu city referanslari ayni hafiza alanini gosteriyor.

obj->city
b->city
city->"ankara"

yani son durum su; age, a, obj, b, city diye referanslar var. bunun yaninda icinde 27, 27, "ankara" bulunduran hafiza alanlarin;

age->27
a->27
obj->city
b->city
city->"ankara"

sen simdi method icinde diyorsun ki a referansinin gosterdigi hafiza alanini 30 ile degistir. ve diyorsun ki b nin gosterdigi hafiza alanindaki city referansinin gosterdigi hafiza alanini "Izmir ile degistir.". Simdi hafizada durum su oldu;

age->27
a->30
obj->city
b->city
city->"Izmir"

sonra da fonksiyon bitince diyorsun ki; age referansinin gosterdigi hafiza alaninin degrini bana yaz ve hala 27. bir de obj referansinin gosterdigi hafiza alanindaki city referaninin gosterdigi hafiza alaninini bana yaz yani "Izmir". hafizanda hala a referansinin gosteridigi 30 degeri var ve artik kullanilamayacaigi icin bu hafiza alani temizlenecek.

Javascript "pass by value" bir dildir, ama objelerde obje alaninidaki degerler de pass bu value olarak gecse bu value lar tarafindan degerler birebir ayni hafiza alanini gosterdigi icin sanki "pass by referance" olmus gibi bir durum olur.

Javascriptin derinliklerini anlayinca hersey daha anlamli olur.
  • emrahday  (24.07.18 15:04:20 ~ 15:34:46) 
1
buraya yazılanların hakları Sir Anthony Hopkins'e aittir.
yazan eden compumaster, ilgilenen eden fader
modere edenler angelus, Artibir, aychovsky, baba jo, basond, compumaster, deckard, duyulmasi gerektigi kadar, fader, fraise, groove salad, kahvegibi, kaymaktutmayansicaksut, kibritsuyu, monstro, pandispanya, robin, ron dennis
bu sitede yazılanların hiçbiri doğru değildir. site içeriği küçükler için sakıncalı olabilir. yazılardan yazarları sorumludur. kaynak göstermeden alıntılanamaz. devlet tarafından atanmış bir kurumun internet üzerinde kimin hangi bilgiye ulaşıp ulaşamayacağına karar vermesi insan haklarına aykırıdır. web siteleri kullanıcıların istekleri doğrultusunda bağlandıkları yerlerdir. kullanıcılar isterlerse bir web sitesine bağlanmayabilirler. bu güçleri ve imkanları mevcuttur. bir kullanıcı bir siteye bağlanmak istiyorsa bu onun tercihi ve hakkıdır. bağlanmak istemiyorsa bu yine onun tercihi ve hakkıdır. halkın kendisine hizmet etmesi için görevlendirdiği kurumlar hadlerini aşıp halka neye ulaşıp ulaşmayacağını bilmeyen cahil cühela muamelesi edemezler. ebeveynlerin çocuklarını sakıncalı içeriklerden koruması için çok sayıda bedava ve ücretli yazılım mevcuttur. bu yazılımlar bir web tarayıcısını kullanmaktan daha karmaşık teknik bilgi gerektirmemektedir. devletin milletini küçük düşürmesi ve ebleh yerine koyması yasaktır. Skimlinks ile linkler üzerinden yönlendirme payı alınmaktadır.