74

Boole false veya bir tam sayı (0 dahil) olabilecek bir değişkenim var. Ben böyle bir switch deyiminde koymak istiyorum: Google Chrome'da benim testlerdeJavaScript anahtar ifadesinde sıkı bir karşılaştırma yapmak güvenli midir?

switch(my_var){ 
    case 0: 
     // Do something 
     break; 
    case 1: 
     // Do something else 
     break; 
    case false: 
     // Some other code 
} 

, mükemmel iş gibi görünüyor, ama ben korkarım çünkü kullanmak için biraz gerginim bazı tarayıcılarda my_var, false ise, 0 == false'dan beri ilk durumu yürütebilir.

Sadece JavaScript'de resmi bir şey olup olmadığını soran anahtar deyiminin, 0 !== false gibi sıkı bir karşılaştırma kullanacağını, ancak kendim hiçbir şey bulamadığım ve bunun iyi çalışıp çalışmadığından emin olamadığını merak ediyorum. farklı JavaScript motorları. Bir anahtar beyanı ile yapılan karşılaştırmanın katı olması garanti edilirse, kimse biliyor mu?

cevap

71

ECMA 262, section 12.11, ikinci algoritma, 4.c'ye bir bakın.

c. Sonra === operatörü tarafından tanımlandığı şekilde giriş ... clauseSelector eşitse

+5

[1999'dan beri böyle bir parti] olmuştu (http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition, % 20Aralık% 201999.pdf) (sayfa 68, s. 12.11, CaseBlock # 3) – Walf

25

http://qfox.nl/notes/110 sorularınızı yanıtları. (Bu adam JavaScript'in nükteliği hakkında çok şey bilir)

Javascript anahtarlar katı tip kontrolü (===) kullanın. Yani asla zorlama hakkında endişelenmeniz gerekir, bu da birkaç wtfjs'i engeller :). 'da diğer elinizde zorlayıcı şanslar varsa, zor şansınız çünkü 'u zorlayamazsınız.

+0

https://jsfiddle.net/to469fLm/4/, yapabilirsin İhtiyaçlarınızı karşılamak için zorlama işlevini genelleştirin – darethas

33

Deneyin:

switch(1) { 
    case '1': 
    alert('Switch comparison is NOT strict.'); 
    break; 
    case 1: 
    alert('Switch comparison is strict.'); 
    break; 
    default: 
    alert('Huh?'); 
} 
+6

İç çekiş, asla düşüşlere alışmayacağım. –

+15

Tamam, downvotes almamın nedeni, soruyu yanıtlayabilmeniz için, JavaScript uygulamanızı veya kitaplığınızı makul bir şekilde çalıştırabilen her JavaScript motoru üzerinde denemeniz gerekir. Ancak, çekirdek işlevlerini bile test etmenin büyük bir hayranıyım. Bir dokümantasyonun ne kadar güvenilir olduğuna bakılmaksızın, tüm büyük uygulamaların gerçekte yerine getirilip getirilemeyeceği garanti edilemez ve bunu öğrenmenin en kesin yolu test etmektir. –

+1

İkinci yorumunuzu destekledim, çünkü haklısınız - test etmek önemlidir. Ve bir geliştirici olarak, belirli bir tarayıcı kümesi üzerinde çalıştığım için kodun sorumluluğunu alacağım. OTOH, yetkili belgelere güvenemezsek, stackoverflow.com'un anlamı nedir? (Ve sana bir kredi kazandırmasa da, umarım bir kez daha fazla kazanma gününü yaratacaktır.) (Zaten benden zaten biraz daha fazla kredin var.) –