Nasıl değişken atama JavaScript çalışır?
Geçen gün tam olarak nasıl kütle JavaScript çalıştığını görmek için oynuyordum.
İlk konsolda: bu örnek denedim
a = b = {};
a.foo = 'bar';
alert(b.foo);
Sonuç "uyarısı. bir görüntülenen" bar oldu Bu yeterince adil, a
b
gerçekten aynı nesne için isimler. Sonra, nasıl bu örnek daha basit hale getirebilirim diye düşündüm.
a = b = 'foo';
a = 'bar';
alert(b);
Hemen hemen aynı şey, değil mi? Peki bu sefer, ilk örnek davranış beklerdim olarak foo
bar
döndürür.
Peki neden böyle oluyor?
N. B.Bu örnek daha aşağıdaki kod ile basitleştirilmiş olabilir:
a = {};
b = a;
a.foo = 'bar';
alert(b.foo);
a = 'foo';
b = a;
a = 'bar';
alert(b);
(JavaScript dizeler gibi ilkel davranır ve farklı sağlamalarının için tamsayılar şüpheleniyorum. Sağlamalarının dönüş işaretçisi bir süre "core" ilkel kendilerini bir kopyasını döndürür)
CEVAP
İlk örnekte, varolan bir nesnenin özelliğini ayarlarsınız. İkinci örnekte, yeni bir nesne atama.
a = b = {};
a
b
şimdi aynı nesne işaretçileri. Yaparken bu kadar:
a.foo = 'bar';
b.foo
beri a
b
aynı nesneye işaret ayarlar.
Ancak!
Eğer bunun yerine eğer:
a = 'bar';
a
farklı bir nesne için artık puan diyorsunuz. Bu ne a
daha önce sivri bir etkisi yoktur.
Javascript değişken atama ve özellik atama 2 farklı işlemler vardır. En iyi nesnelere işaretçi değişkenler düşünmek, ve doğrudan bir değişkene atadığınızda, herhangi bir nesne, sadece farklı bir nesne için değişken repointing değiştiriyorsunuz.
Ama bir özelliği, a.foo
gibi atama a
işaret eden bir nesneyi değiştirmek olacaktır. Bu, tabii ki, aynı zamanda sadece hepsi aynı nesneye işaret, çünkü bu nesneyi işaret eden tüm diğer başvurular değiştirir.
JavaScript kilitler nasıl çalışır?...
Nasıl Düzenli İfade, JavaScript için b...
Nasıl JavaScript tanımsız veya boş bir...
Nasıl Javascript bir Nesne adı olarak ...
Nasıl bir değişken olmadığını kontrol ...