Neden[[]]yok[ []] [ []] dize " dönmek;10"?
Bu geçerli ve JavaScript (more examples here) string"10" döner:
[[]][ []] [ []]
Neden? Burada neler oluyor?
CEVAP
Eğer ayrılırsak, karmaşa eşittir:
[[]][ []]
[ []]
JavaScript, [] === 0 doğrudur. sayı içine bir şeye dönüştürür ve bu durumda "" 0 (şartname detayları aşağıya bakınız).
Bu nedenle, ( üzerinde precendence) basitleştirmek:
[[]][0]
[0]
[[]][0] anlamına gelir, çünkü: [[]], doğrudur: ilk eleman olsun
[[]][0]iç dizi ([]) verir. Başvurular nedeniyle yanlış[[]][0] === []ama hadi iç diziAyanlış gösterim önlemek için Ara.anlamına geldiğinden[[]][0] == A 1, 'bir artırmak'.[[]][0] === (A 1); başka bir deyişle, o-ecek her zaman bir numara (1gelmez mutlaka dönüş sayısı,Her zaman yapar - - Tim için bir işaret bu.
Yine bir şey daha okunaklı içine karışıklık basitleştirmek edebiliriz. Hadi yerine 27* *A arka:
([] 1)
[0]
JavaScript, bu gerçek de şudur: [] 1 === "1", [] == "" (boş bir dizi katılmadan) çünkü, bu yüzden
([] 1) === ("" 1)("" 1) === ("1")("1") === 1
Hadi daha da basitleÅŸtirmek:
1
[0]
Ayrıca, bu JavaScript için de geçerli: bir elemanlı bir dizi katılmadan, çünkü [0] == "0",. Birleştirme elemanları , ile ayrılmış bir arada olacak. Bir öğe ile, bu mantık ilk elemanın kendisi neden olacağını söyleyebiliriz.
Böylece, sonunda elde ettiğimiz (sayı = string):
1
"0"
=== "10" // Yay!
Özellikleri [] ayrıntılar için:
Bu tam bir labirent, ama [] yapmak diyor çünkü bir dizeye dönüştürülür ediliyor:
11.4.6 Tekli Operatör
Tekli operatör Numarasını yazın için işlenen dönüştürür.
Üretim UnaryExpression : UnaryExpression aşağıdaki gibi değerlendirilir
Ifade UnaryExpression deÄŸerlendirme sonucu olsun.
ToNumber(GetValue(ifade)) dönüş.
ToNumber() diyor ki:
Nesne
Aşağıdaki adımları uygulayın:
PrimValue ToPrimitive(giriÅŸ deÄŸiÅŸkeni, Dize ipucu).
Olabilirdi primValue) dönüş.
ToPrimitive() diyor ki:
Nesne
Nesne için varsayılan bir değer döndürür. Bir nesnenin varsayılan değeri çağırarak alınır [[Önek]] nesne, isteğe bağlı ipucu PreferredType geçen iç yöntemi. Bu davranışı [[Önek]] dahili yöntem 8.12.8 tüm yerel ECMA nesneler için. bu belirtim tarafından tanımlanan
[[DefaultValue]] diyor ki:
[[Önek]] 8.12.8 (ipucu)
O zaman [[Önek]] iç yöntemi ipucu Dize olarak adlandırılır, aşağıdaki adımlar takip edilir:
Sağlar arama sonucu olsun [[]] değişken ile nesne O iç yöntemi"". olabilirdi
Eğer İsCallable(olabilirdi) o doğrudur
bir. Arama sonucunda str izin [[Çağrı]] bu değer ve boş bir bağımsız değişken listesi olarak O olabilirdi iç yöntemi.
b. Eğer str ilkel bir değer ise, str dönüş.
Bir dizi .toString diyor ki:
15.4.4.2 Dizi.prototip.() saÄŸlar
Olabilirdi yöntemi çağrıldığında, aşağıdaki adımlar takip edilir:
Dizi hakkında ToObject arama sonucu bu değer olsun.
Arama sonucunda işlev izin [[]] değişkeni ile dizinin iç yöntemi"". join
Eğer İsCallable () işlevi false) ise, işlev standart yerleşik yöntem Nesne olsun.prototip.olabilirdi 15.2.4.2).
Arama sonucu Return [[Çağrı]] bu değer ve boş argümanlarını bir liste olarak işlev sağlayan bir dizi yöntem iç.
[] [].join() === "" çünkü "", aşağı gelir.
Yine olarak tanımlanır:
11.4.6 Tekli Operatör
Tekli operatör Numarasını yazın için işlenen dönüştürür.
Üretim UnaryExpression : UnaryExpression aşağıdaki gibi değerlendirilir
Ifade UnaryExpression deÄŸerlendirme sonucu olsun.
ToNumber(GetValue(ifade)) dönüş.
ToNumber "" olarak tanımlanır:
StringNumericLiteral bu MV ::: [boÅŸ] 0.
"" === 0 [] === 0 böylece.

Neden 0 yapar.(&;#.##"&Olabilirdi quot...
Neden ekleme "" bir Dize içi...
Neden ama " bir dize ile" baÅŸl...
Neden "Mozilla" dize üzerind...
Neden yeni bir Dize (&;" quot;) c ...