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ç diziA
yanlış gösterim önlemek için Ara.[[]][0] == A 1
, 'bir artırmak'.[[]][0] === (A 1)
; başka bir deyişle, o-ecek her zaman bir numara (1
gelmez mutlaka dönüş sayısı,
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 ...