SORU
26 AĞUSTOS 2011, Cuma


Neden[[]]yok[ []] [ []] dize " dönmek;10"?

Bu geçerli ve JavaScript (more examples here) string"10" döner:

  [[]][ []] [ []]

Neden? Burada neler oluyor?

CEVAP
26 AĞUSTOS 2011, Cuma


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ç dizi A yanlış 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 ( 1 gelmez 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

  1. Ifade UnaryExpression değerlendirme sonucu olsun.

  2. ToNumber(GetValue(ifade)) dönüş.

ToNumber() diyor ki:

Nesne

Aşağıdaki adımları uygulayın:

  1. PrimValue ToPrimitive(giriş değişkeni, Dize ipucu).

  2. 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:

  1. Sağlar arama sonucu olsun [[]] değişken ile nesne O iç yöntemi"". olabilirdi

  2. 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:

  1. Dizi hakkında ToObject arama sonucu bu değer olsun.

  2. Arama sonucunda işlev izin [[]] değişkeni ile dizinin iç yöntemi"". join

  3. Eğer İsCallable () işlevi false) ise, işlev standart yerleşik yöntem Nesne olsun.prototip.olabilirdi 15.2.4.2).

  4. 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

  1. Ifade UnaryExpression değerlendirme sonucu olsun.

  2. ToNumber(GetValue(ifade)) dönüş.

ToNumber "" olarak tanımlanır:

StringNumericLiteral bu MV ::: [boş] 0.

"" === 0 [] === 0 böylece.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jay Will

    Jay Will

    19 NİSAN 2006
  • steven johns

    steven johns

    11 Mart 2011
  • whiteboy7thst

    whiteboy7ths

    1 Temmuz 2009