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

  • dope2111

    dope2111

    29 HAZİRAN 2009
  • Official Clouds

    Official Clo

    1 HAZİRAN 2011
  • Rachel Raum

    Rachel Raum

    10 EYLÜL 2007