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
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.
Neden bir JavaScript değişken dolar iş...
Neden Javascript sadece IE Geliştirici...
Neden [1,2] [3,4] = &JavaScript;1,23,4...
Neden JavaScript eval fonksiyonu kötü ...
Neden [5,6,8,7][1,2] = 8 Javascript mu...