Neden 0[0] sözdizimsel olarak geçerli mi?
Neden javascript bu satırı geçerli değil mi ?
var a = 0[0];
Bu, a
sonra undefined
.
CEVAP
Yapmak 0[0]
JS tercüman olacak makineyi ilk 0
Number
nesne ve daha sonra denemek için erişim [0]
özelliği olan nesne undefined
.
Özellik erişim sözdizimi 0[0]
Bu bağlamda dil dilbilgisi tarafından izin verilir çünkü sözdizimi hatası yoktur. Bu yapı (Javascript dilbilgisi terimleri kullanarak) NumericLiteral[NumericLiteral]
.
ES5 ECMA spec section A.3 dil dilbilgisi ilgili bölümü şudur:
Literal ::
NullLiteral
BooleanLiteral
NumericLiteral
StringLiteral
RegularExpressionLiteral
PrimaryExpression :
this
Identifier
Literal
ArrayLiteral
ObjectLiteral
( Expression )
MemberExpression :
PrimaryExpression
FunctionExpression
MemberExpression [ Expression ]
MemberExpression . IdentifierName
new MemberExpression Arguments
Yani, bu aşamalar ile: grammer takip edebilirsiniz
MemberExpression [ Expression ]
PrimaryExpression [ Expression ]
Literal [ Expression ]
NumericLiteral [ Expression ]
Ve, benzer şekilde Expression
de sonunda NumericLiteral
dilbilgisi izledikten sonra, bu izin verildiğini görüyoruz:
NumericLiteral [ NumericLiteral ]
0[0]
dilbilgisi izin verilen bir parçası ve hiçbir SyntaxError böylece anlamına gelir.
Sonra, çalışma zamanı sırasında izin verilir okumak için bir özelliği yok (sadece okuma olarak undefined
) sürece kaynağıdır okuyarak ya da bir nesne ya da bir örtülü dönüşüm için bir nesne. Ve, bir sayısal hazır bilgi gerçekten bir nesne (nesne Sayısı) örtülü bir dönüştürme var.
Bu Javascript genellikle bilinmeyen bu özelliklerinden biridir. Türleri Number
, Boolean
String
Javascript genellikle DAHİLİ olarak ilkel olarak saklanır (tam gelişmiş nesneler değil). Bu kompakt, sabit bir depolama gösterimi (muhtemelen uygulama verimliliği için bu şekilde yapılır). Ama, Javascript, özellikleri ve yöntemleri ile nesneleri gibi bu ilkel tedavi olmak istiyor. Yani, eğer sen denemek için erişim özelliği veya yöntemi bu değildir, doğrudan desteklenen ilkel, o zaman Javascript edecek geçici olarak zorlamak ilkel haline uygun bir nesne türü değeri ayarlamak için değeri ilkel.
0[0]
gibi ilkel bir nesne gibi bir sözdizimi kullandığınızda yorumlayıcı bir ilkel bir özellik erişim olarak tanır. Bu yanıtı ilk 0
sayısal ilkel alıp [0]
özellik erişimi olan tam gelişmiş Number
bir nesne haline bastırmaktır. Bu özel durumda, bir nesne üzerinde [0]
özelliği 0[0]
elde değeri yok ediliyor undefined
.
İşte özellikleri ile ilgili amaçlar için bir nesne için bir ilkel otomatik dönüşüm ile ilgili bir makale:
The Secret Life of Javascript Primitives
Burada ECMA 5.1 şartname ilgili bölümler:
Atar İlişkilendirilmiş değeri undefined
null
, aksi takdirde 34* *döndürür.
- BaseReference MemberExpression değerlendirme sonucu olsun.
- BaseValue GetValue(baseReference).
- PropertyNameReference İfade değerlendirme sonucu olsun.
- PropertyNameValue GetValue(propertyNameReference).
- Çağrı CheckObjectCoercible(baseValue).
- PropertyNameString Olabilirdi(propertyNameValue).
- Eğer değerlendirilen sözdizimsel üretim katı içeriyorsa modu kod, sıkı izin doğru, kesin yanlış olsun başka.
- BaseValue olan tip Referans değerini döndürür ve kimin başvurulan adı olan propertyNameString ve katı.
Bu soru için operatif bir parçası adım #5 yukarıda.
Bu değer erişilen özellik bir başvuru olduğunda, ToObject(base)
ilkel nesne sürümü almak için çağırır açıklamaktadır.
Bu Boolean
, Number
String
ilkel nesne bir form dönüştürülür açıklamaktadır [[PrimitiveValue]] iç özellik buna göre ayarlayın.
İlginç bir test olarak, eğer kod şöyle olsaydı:
var x = null;
var a = x[0];
Öyle ki hala at bir SyntaxError de ayrıştırma saati olarak bu teknik olarak yasal sözdizimi, ama o-cekti atmak İlişkilendirilmiş bir de zamanı gelince kaçıyorsun kodu çünkü yukarıda Özelliği Erişenleri mantık uygulanır değeri x
, çağrı CheckObjectCoercible(x)
arama ToObject(x)
her iki at bir İlişkilendirilmiş x
null
undefined
.
Neden &; ad std quot;" kötü olara...
Neden C ön işlemci word "linux&qu...
Neden' ◎ܫ◎ ve fonksiyonu t JavaSc...
Neden benim program tam olarak 8192 el...
Neden git ileri varsayılan olarak birl...