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
İşte görüyorsun sonuçları için açıklama listesi (görmek gerekiyor). Kullanıyorum başvuruları ECMA-262 standard.
[] []
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 aramaobject.toString()
(§8.12.8). Diziler için buarray.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.[] {}
[] []
, Her iki işlenen benzer ilkel ilk dönüştürülür. "Nesne nesneleri" (§15,2 ve bu yine sonuç aramaobject.toString()
, boş olmayan, olmayan tanımsız nesneler."[object Object]"
(§15.2.4.2).{} []
{}
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.ToNumber(ToPrimitive(operand))
döndürür. Zaten bildiğimiz,ToPrimitive([])
olarak boş bir dize ve §9.3.1,ToNumber("")
göre 0.{} {}
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]"
([] {}
). DizeToNumber
uygulamak{}
sonucu"[object Object]"
olsun. §9.3.1, bize bu adımları takip sonucuNaN
:Dilbilgisi bir genişleme Dize yorumlayamazStringNumericLiteralsonra ToNumber sonucudurNaN.
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 numaraToNumber
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şınaNaN
ise sadece 1 (§9.3),. §11.6.2, §11.6.3 adım 7 aşağıdaki dikteEğer ya da işlenenNaNsonucudurNaN.
Array(16).join
tartışmanın buNaN
. §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ür1
bir dize yerine dönüştürme"wat"
bir sayı, çok etkili aramalarArray(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.
&Quot;sıkı" kullanın; JavaScript, ...
'' JavaScript anahtar kelime...
Bu nedir !! JavaScript? (değil) operat...
JavaScript değişkenleri kapsamı nedir?...
Bir Dizi hassas kaybetmeden git o Java...