Neden ",,," == Array (4) JavaScript’te?


119

Tercümanınızı / konsolunuzu açın ve karşılaştırmayı deneyin

> ",,," == Array(4)
True

Neden? İlk başta düşündüm de belki ",,," 'yi sonlandıran bir dilimi olan dört karakterlik bir dizi olarak düşünebilirsiniz, nedeni bu olabilir, ama

> "..." == Array(4)

"Yanlış" döndürür. Peki neden? Javascript'te biraz ördek yazmanın kendine özgü olduğunu biliyorum, ancak bu davranışın altını çizenin ne olduğunu merak ediyorum. Bunu Zed Shaw'un buradaki mükemmel sunumundan derledim .


14
C haricinde çok az dil, programcının görebileceği bir şekilde sıfır sonlandırma kullanır.
Joey

7
Sorabilirsem, bu keşfe ne yol açar?
SomeKittens

1
@SomeKittens Zed Shaw, soruma bağladığım videoda bundan açıkça bahsediyor (Javascript eleştirisi olarak). Şerefe!
ZenLikeThat

5
Bu aynı zamanda Ruby ve JavaScript bazı kültürlerinden gösteren (oldukça iyi bilinir) "wat" konuşma belirtilen @SomeKittens destroyallsoftware.com/talks/wat
Cronco

5
Bu, her zaman ===yerine kullanmak için birçok iyi nedenden biridir ==.
wprl

Yanıtlar:


178

Sağ işlenen bir dize ve dize gösterimine dönüştürülür Çünkü Array(4)olduğunu ,,,:

> Array(4).toString()
  ",,,"

Dizi yapıcı işlevini kullanır ve bir sayı iletirseniz, dizinin uzunluğunu bu sayıya ayarlar. Dolayısıyla, dört boş dizininiz olduğunu (aynı [,,,]) ve dizilerin varsayılan dize gösteriminin, öğelerinin virgülle ayrılmış bir listesi olduğunu söyleyebilirsiniz :

> ['a','b','c'].toString()
  "a,b,c"

Karşılaştırmanın nasıl çalıştığı, şartnamenin 11.9.3 bölümünde açıklanmaktadır . Orada göreceksiniz ( x == y):

8. Tür ( x ), Dize veya Sayı ise ve Tür ( y ) Nesne ise, x == ToPrimitive ( y )
karşılaştırmasının sonucunu döndürün .

(diziler JavaScript’teki nesnelerdir)

ve ToPrimitiveyöntemi takip ederseniz, sonunda onun çağırdığını göreceksiniz toString.


2
Tamam, şimdi bunların hepsi bana mantıklı geliyor. Teşekkürler.
ZenLikeThat

6
Bunun nedeni, dizilerin sanki kullanıyorlarmış gibi dizilmesidir Array.join(",").
duskwuff -inaktif-

JavaScript'i programlamak için kanlı sabırlı
olmalısınız


31

Kullanmayı deneyin ===. ==Javascript'te kullanıldığında , değişkenleri dönüştürmeye çalışacak ve böylece bunun gibi sorunlara yol açacaktır. Konsol, Array(4)dize gösterimine (yani Array(4).toString) çevrim yapıyor ",,,". Virgüllerin olmasının nedeni, .toString()işlevin onları bir dizideki ayrı öğelere eklemesidir.

Aşağıdaki snippet'e bakın:

document.write( Array(4).toString() );


18

Bunun nedeni Array(4), 4 boş değerden oluşan bir diziyi başlatması, ==örtük olarak dönüştürmesi, yani:

 ",,," == Array(4)

 ",,," == Array(4).toString()

 ",,," == ["", "", "", ""] // note 3 commas for 4 values

 ",,," == ["", "", "", ""].toString()

Hepsi benzer.

==değerleri karşılaştırmadan önce örtük tür dönüştürmeleri yapar, bu da tahmin edilemeyen sonuçlara neden olabilir. ===Türü ve değeri kontrol etmek için kullanın .


5

Bir Diziyi bir dizeyle karşılaştırmak, karşılaştırmayı yapmadan önce Diziyi bir dizeye zorlar. Boş bir 4 elemanlı Diziyi bir dizeye zorlamak, bu tam dizeyi verir.


4

Önce "prototip" ile ilgili bir şey olduğunu düşündüm ... ama küçük bir araştırmadan sonra üzücü bir sonuca vardım ...

Görünüşe göre çok fazla mantıklı olmayan içsel ve daha belirsiz bir js meselesi ...

Sadece dene

Array(4)==Array(4)

ve türler üzerinde baskı da yok ...

Array(4)===Array(4)

ve YANLIŞ alacaksın

Bunu biliyor null==null, null===nullhatta undefined==undefinedve undefined===undefinedböylece ... biraz anlaşılmaz var ... döner DOĞRU ...

Array(4)==[,,,] ayrıca doğru olmalı


ZEE, Array (4) == [,,,] doğru olmayacak. Nesneyi ilkel ile karşılaştırırsak, nesne ilkele dönüştürülecektir. ToString () 'i çağırmasının nedeni budur.
devsathish

array (x) kurucunun adresi olmalıdır ... neyse, bir sistemde (ne tür bir sistemle uğraşmayın), <identity_X> === <identity_X> her zaman doğru olmalıdır!
ZEE
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.