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

  • AlaskanGrizzly

    AlaskanGrizz

    30 EKİM 2009
  • MofoHifi Records

    MofoHifi Rec

    15 HAZİRAN 2006
  • TheOtherMau5

    TheOtherMau5

    6 Mart 2012