SORU
25 Mart 2015, ÇARŞAMBA


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
25 Mart 2015, ÇARŞAMBA


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:

9.10 CheckObjectCoercible

Atar İlişkilendirilmiş değeri undefined null, aksi takdirde 34* *döndürür.

enter image description here

11.2.1 Property Accessors

  1. BaseReference MemberExpression değerlendirme sonucu olsun.
  2. BaseValue GetValue(baseReference).
  3. PropertyNameReference İfade değerlendirme sonucu olsun.
  4. PropertyNameValue GetValue(propertyNameReference).
  5. Çağrı CheckObjectCoercible(baseValue).
  6. PropertyNameString Olabilirdi(propertyNameValue).
  7. Eğer değerlendirilen sözdizimsel üretim katı içeriyorsa modu kod, sıkı izin doğru, kesin yanlış olsun başka.
  8. 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.

8.7.1 GetValue (V)

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.

9.9 ToObject

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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Facebook Developers

    Facebook Dev

    24 ŞUBAT 2009
  • Mark Halberstadt

    Mark Halbers

    19 ŞUBAT 2010
  • Muse

    Muse

    28 EYLÜL 2006