SORU
29 Kasım 2011, Salı


Javascript işaretçi/referans delilik. Biri bunu açıklayabilir mi?

Javascript referans nesneleri geçirir. Bu çok harika bir fikir. Ama bu nesneleri manipüle başladıktan sonra, her şey gibi sezgisel olmayan bir şekilde davranır. Bana bir örnek vereyim:

var a, b;

a = {}
b = a;
a['one'] = {};

console.log( JSON.stringify(a) );
// outputs: {"one":{}}

console.log( JSON.stringify(b) );
// outputs: {"one":{}}

Bu a malzeme Atama da b etkileyecek bekleniyor şimdi b a bir işaretçi vardır, çünkü tüm iyi ve güzel.

Ama eğer bunu yaparsam:

a = a['one'];

console.log( JSON.stringify(a) );
// outputs: {}

console.log( JSON.stringify(b) );
// outputs: {"one":{}}

Bu benim için şaşırtıcı olur. Ben pek bir şey kalmamış a b hala aynı (ve {} a['one'] önceden ayarlamak için {} a set a['one']).

Ama durum öyle değil. Görünen a kendi kaybeder başvuru için b zaman atanan yeni bir şey, ama b tutar değeri a ayarlamak için önce a kaybetme başvuru için b.

Ama eğer bunu yaparsam:

a['two'] = 2;

console.log( JSON.stringify(a) );
// outputs: {"two":2}

console.log( JSON.stringify(b) );
// outputs: {"one":{"two":2}}

Ne? a açıkça b, başvuru kaybetti ama b a bazı referans var gibi görünüyor.

Boş nesne 34 ** her değişken araştırıyorum şimdi aynı yeri işaret ediyor, yani bellekte bir yer işaret ediyor?

Sağlam bir kavrayışa sahip biri bunu bana açıklayabilir mi?

CEVAP
29 Kasım 2011, Salı


Satır örnek satır şu:

a = {}

a başvurular yeni nesne artık.

b = a;

b a başvurular aynı nesneye başvuruyor. a başvuracak unutmayın.

a['one'] = {};

Yeni nesne artık başvurular başka bir yeni nesne bir dizin 'one' vardır.

Ne zaman

a = a['one'];

a a['one'] = {} ne zaman oluşturduğunuz yeni nesne a['one'] ifade etmek için ayarlama. b a = {} ile oluşturulan nesneye başvuruyor.

"a b a 52**, ne de tam tersi ifade etmez çünkü". başvurusunu kaybetti derken sorunu karıştırıyorsun a b bakınnesnelerdiğer nesneleri ifade etmek için yapılabilir. Bu gibi:

a = {}; b = a ile birlikte

a
 \
  \
   { }
  /
 /
b

a['one'] = {} ile o zaman alırsınız

a
 \
  \
   { one: { } }
  /
 /
b

a = a['one'] ile o zaman alırsınız

a - - - - 
          \
   { one: { } }
  /
 /
b

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Influencer Plus

    Influencer P

    2 Ocak 2013
  • ParryGripp

    ParryGripp

    12 AĞUSTOS 2006
  • The10HourMan

    The10HourMan

    28 EYLÜL 2012