ปลอดภัยหรือไม่ที่จะเปรียบเทียบอย่างเข้มงวดในคำสั่งสวิตช์ JavaScript


106

ฉันมีตัวแปรที่อาจเป็นบูลีนfalseหรือจำนวนเต็ม (รวม 0) ฉันต้องการวางไว้ในคำสั่งสวิตช์เช่น:

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

ในการทดสอบของฉันใน Google Chrome ดูเหมือนว่าจะทำงานได้อย่างสมบูรณ์ แต่ฉันกังวลเล็กน้อยที่จะใช้เพราะฉันกลัวว่าในบางเบราว์เซอร์ถ้าmy_varเป็นfalseเช่นนั้นมันอาจดำเนินการในกรณีแรกตั้งแต่0 == falseนั้นมา

ฉันแค่สงสัยว่ามีอะไรเป็นทางการใน JavaScript ที่บอกว่าคำสั่ง switch จะใช้การเปรียบเทียบที่เข้มงวดเช่นนั้น0 !== falseแต่ฉันไม่พบอะไรเลยและฉันไม่แน่ใจว่าสิ่งนี้จะทำงานได้ดีในเอ็นจิ้น JavaScript อื่นหรือไม่ มีใครทราบบ้างว่าการเปรียบเทียบที่ทำโดยคำสั่ง switch นั้นรับประกันว่าเข้มงวดหรือไม่?

คำตอบ:


104

ลองดูECMA 262 ส่วน 12.11อัลกอริทึมที่สอง 4.c

ค. หากอินพุตเท่ากับ clauseSelector ตามที่กำหนดโดยตัวดำเนินการ === ดังนั้น ...


11
มันเป็นปาร์ตี้เช่นนั้นตั้งแต่ปี 1999 (หน้า 68, s 12.11, CaseBlock # 3.)
Walf

แล้วไง? ฉันไม่แน่ใจว่าทำไมคุณถึงตัดคำพูดที่นี่ออกไป
Oleg V. Volkov

34

http://qfox.nl/notes/110ตอบคำถามของคุณ (ผู้ชายคนนี้รู้มากเกี่ยวกับความสำคัญของ JavaScript)

สวิตช์ใน Javascript ใช้การตรวจสอบประเภทที่เข้มงวด (===) ดังนั้นคุณไม่ต้องกังวลกับการบีบบังคับซึ่งจะป้องกันไม่ให้ wtfjs :) หากในทางกลับกันคุณกำลังพึ่งพาการบีบบังคับโชคดีเพราะคุณไม่สามารถบังคับได้


jsfiddle.net/to469fLm/4คุณสามารถสรุปฟังก์ชันบังคับเพื่อให้บรรลุความต้องการของคุณได้
Darethas

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.