SORU
27 Ocak 2012, Cuma


Bu tuhaf davranışları JavaScript 'Wat' konuşma CodeMash 2012 yılında söz izahı nedir?

'Wat' talk for CodeMash 2012temelde Ruby ile birkaç tuhaf bir tuhaflıklar ve JavaScript işaret eder.

http://jsfiddle.net/fe479/9/ sonuçları JSFiddle yaptım.

Davranışları JavaScript Ruby bilmiyorum gibi) belirli aşağıda listelenmiştir.

Benim sonuçlar bazı video ile uyuşmuyordu, ve ben emin değilim neden bu JSFiddle buldum. Ancak, JavaScript işleme ne kadar olduğunu bilmek her durumda perde arkasında çalışıyorum.

Empty Array   Empty Array
[]   []
result:
<Empty String>

JavaScript dizileri ile kullanıldığında operatör hakkında çok merak ediyorum. Bu videonun sonucu eşleşir.

Empty Array   Object
[]   {}
result:
[Object]

Bu videonun sonucu eşleşir. Burada neler oluyor? Neden bu bir nesne. operatörü ne iş yapar?

Object   Empty Array
{}   []
result
[Object]

Bu video ile uyuşmuyor. Bu video sonucu ise 0, [Nesnesi] olduğunu göstermektedir.

Object   Object
{}   {}
result:
[Object][Object]

Bu video ya uymuyor, ve nasıl iki nesne değişken bir sonuç yazdırılıyor mu? Belki benim JSFiddle yanlış.

Array(16).join("wat" - 1)
result:
NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN

Wat 1 sonuç yaparak 12*...*

Bu sadece bir dize bir sayı çıkarmak için çalışıyor NaN sonuçlar bu basit bir davranış olduğunu düşünüyorum.

CEVAP
27 Ocak 2012, Cuma


İşte görüyorsun sonuçları için açıklama listesi (görmek gerekiyor). Kullanıyorum başvuruları ECMA-262 standard.

  1. [] []

    Toplama operatörü kullanırken, sol ve sağ işlenen iki temel öğeler ilk (§11.6.1) dönüştürülür. Başına §9.1 dönüştürme bir nesne (bu durumda bir dizi) bir ilkel döndürür varsayılan değeri olan nesneler için geçerli bir toString() yöntem ise arama object.toString() (§8.12.8). Diziler için bu array.join() (§15.4.4.2) arama aynıdır. Boş bir dize boş bir dizi sonuçlar katılmadan, yani operatör boş dize olan iki boş dizeler, birleştirme, döner ek #7 adım.

  2. [] {}

    [] [], Her iki işlenen benzer ilkel ilk dönüştürülür. "Nesne nesneleri" (§15,2 ve bu yine sonuç arama object.toString(), boş olmayan, olmayan tanımsız nesneler."[object Object]" (§15.2.4.2).

  3. {} []

    {} burada değil ayrıştırılmış olarak bir nesne, ama yerine bir boş blok (§12.1, en az senin kadar uzun değil zorlayarak bu bildiri bir ifade, ama bu konuda daha fazla). Boş bloklar dönüş değeri boş ise, bu ifadenin sonucu [] aynıdır. tekli operatör (§11.4.6) ToNumber(ToPrimitive(operand)) döndürür. Zaten bildiğimiz, ToPrimitive([]) olarak boş bir dize ve §9.3.1, ToNumber("") göre 0.

  4. {} {}

    Benzer şekilde önceki durumda, ilk {} boş dönüş değeri ile blok olarak ayrıştırılır. Yine {} ToNumber(ToPrimitive({})), aynı ToPrimitive({}) "[object Object]" ([] {}). Dize ToNumber uygulamak {} sonucu "[object Object]" olsun. §9.3.1, bize bu adımları takip sonucu NaN:

    Dilbilgisi bir genişleme Dize yorumlayamazStringNumericLiteralsonra ToNumber sonucudurNaN.

  5. Array(16).join("wat" - 1)

    §15.4.1.1 §15.4.2.2, Array(16) başı olarak oluşturur uzunluğu 16 ile yeni bir dizi. Katılmak için bağımsız değişken değeri, 74* *adım #5 ve #6 numara ToNumber kullanarak her iki işlenen dönüştürmek için var olduğunu göstermektedir. ToNumber(1) ToNumber("wat") tekrar §9.3.1 başına NaN ise sadece 1 (§9.3),. §11.6.2, §11.6.3 adım 7 aşağıdaki dikte

    Eğer ya da işlenenNaNsonucudurNaN.

    Array(16).join tartışmanın bu NaN. §15.4.4.5 (Array.prototype.join) aşağıdaki, "NaN" hangi bağımsız değişken, (§9.8.1) ToString aramalıyız:

    EğermNaNdönüş Dizesi"NaN".

    §15.4.4.5 10 adım aşağıdaki görüyorsun sonuç eşittir "NaN" ve boş dize birleştirme 15 tekrarlar. Kullanırken "wat" 1 yerine "wat" - 1 bağımsız olarak, ayrıca operatör dönüştürür 1 bir dize yerine dönüştürme "wat" bir sayı, çok etkili aramalar Array(16).join("wat1").

Fonksiyon bir argüman olarak kullanırken, bir olmak deyimi zorluyorsun. {} [] dava için farklı sonuçları görmeye neden olarak: ^em>ExpressionStatementayrıştırılmış bunun yerine çok imkansız boş blok {} ayrıştırmak için yapar , boş bir nesne değişmez.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Adam Washington

    Adam Washing

    12 Mayıs 2006
  • Chuck Testa

    Chuck Testa

    14 AĞUSTOS 2011
  • kylediablo

    kylediablo

    8 Ocak 2007