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
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
Ne bir işaretçi değişkeni ve C bir ref...
&Quot;protokol"?neden kullanmak i...
Biri Ayrık bir Pıd yapısını açıklayabi...
Biri UİViewController bir doğum süreci...
Biri ivy.xml bağımlılık'conf özni...