SORU
12 Kasım 2009, PERŞEMBE


Neden 2 == [2] JavaScript mu?

Geçenlerde JavaScript 2 == [2] keşfetti. Görünüşe göre, bu cilvesi ilginç sonuçları bir çift vardır:

var a = [0, 1, 2, 3];
a[[2]] === a[2]; // this is true

Benzer şekilde, aşağıdaki gibi çalışır:

var a = { "abc" : 1 };
a[["abc"]] === a["abc"]; // this is also true

Hala daha da garibi, bu gibi çalışır:

[[[[[[[2]]]]]]] == 2; // this is true too! WTF?

Bu davranışlar tüm tarayıcılarda tutarlı görünüyor.

Bu dilin bir özelliği neden herhangi bir fikir?

EDİTİşte bu daha delice sonuçları"": . özelliği

[0] == false // true
if ([0]) { /* executes */ } // [0] is both true and false!

var a = [0];
a == a // true
a == !a // also true, WTF?

Bu örnekler trephine http://jimbojw.com ün jimbojw yanı sıra walkingeyerobot tarafından bulundu.

CEVAP
12 Kasım 2009, PERŞEMBE


ECMA-spec kıyaslama algoritması (senin sorun için ECMA-262, 3rd edition ilgili bölümler: 11.9.3, , 8.6.2.6 9.1)bakabilirsiniz.

Seninle ilgili Özet algoritmaları JS geri çevirmek, 2 == [2] temelde bu değerlendirirken ne olur: Eğer

2 === Number([2].valueOf().toString())

diziler valueOf() dizinin kendisi verir ve bir öğe dizi bir dize temsil tek öğe dize gösterimidir.

Bu [[[[[[[2]]]]]]].toString() hala dize 2 de üçüncü örnek açıklar.

Gördüğünüz gibi, oldukça arkasında sahne ben genellikle sadece katı eşitlik operatörünün kullanımı bu yüzden büyünün, === var.

Birinci ve ikinci örnek, özellik adları her zaman dizeleri, Çok olarak takip etmek daha kolay

a[[2]]

olur denk

a[[2].toString()]

sadece olan

a["2"]

Hatta sayısal tuşlar dizisi-herhangi bir büyü olmadan önce özellik adları (yani dize) olarak kabul edilir unutmayın.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ADDVOiCE

    ADDVOiCE

    28 Mayıs 2009
  • thetrollska

    thetrollska

    2 EKİM 2009
  • Vintendo Power

    Vintendo Pow

    2 Ocak 2007