คำสั่ง switch
สามารถแทนที่ได้หลายรายการ if
ตรวจสอบ
ซึ่งให้วิธีที่อธิบายได้มากขึ้นในการเปรียบเทียบค่ากับตัวแปรหลายตัว
switch
มีบล็อค case
อย่างน้อยหนึ่งบล็อคและมีค่าเริ่มต้นที่เป็นทางเลือก
ดูเหมือนว่านี้:
สวิตช์ (x) { กรณี 'value1': // ถ้า (x === 'value1') - [หยุดพัก] กรณี 'value2': // ถ้า (x === 'value2') - [หยุดพัก] ค่าเริ่มต้น: - [หยุดพัก] -
ค่าของ x
จะถูกตรวจสอบเพื่อความเท่าเทียมกันอย่างเข้มงวดกับค่าจาก case
แรก (นั่นคือ value1
) จากนั้นไปที่ค่าที่สอง ( value2
) และอื่นๆ
หากพบความเท่าเทียมกัน switch
จะเริ่มรันโค้ดโดยเริ่มจาก case
ที่เกี่ยวข้อง จนกระทั่งถึง break
ที่ใกล้ที่สุด (หรือจนกระทั่งสิ้นสุด switch
)
หากไม่มีการจับคู่ตัวพิมพ์ โค้ดเริ่ม default
จะถูกดำเนินการ (ถ้ามี)
ตัวอย่างของ switch
(เน้นโค้ดที่ดำเนินการ):
ให้ = 2 + 2; สวิตช์ (ก) { กรณีที่ 3: alert( 'เล็กเกินไป' ); หยุดพัก; กรณีที่ 4: alert( 'แน่นอน!' ); หยุดพัก; กรณีที่ 5: alert( 'ใหญ่เกินไป' ); หยุดพัก; ค่าเริ่มต้น: alert( "ฉันไม่ทราบค่าดังกล่าว" ); -
ที่นี่ switch
เริ่มเปรียบเทียบ a
จากตัวแปร case
แรกที่เป็น 3
การแข่งขันล้มเหลว
แล้ว 4
. นั่นเป็นการแข่งขัน ดังนั้นการดำเนินการจึงเริ่มต้นจาก case 4
จนถึง break
ที่ใกล้ที่สุด
ถ้าไม่มี break
การดำเนินการจะดำเนินต่อไปใน case
ถัดไปโดยไม่มีการตรวจสอบใดๆ
ตัวอย่างที่ไม่มี break
:
ให้ = 2 + 2; สวิตช์ (ก) { กรณีที่ 3: alert( 'เล็กเกินไป' ); กรณีที่ 4: alert( 'แน่นอน!' ); กรณีที่ 5: alert( 'ใหญ่เกินไป' ); ค่าเริ่มต้น: alert( "ฉันไม่ทราบค่าดังกล่าว" ); -
ในตัวอย่างข้างต้น เราจะเห็นการดำเนินการตามลำดับของ alert
สามรายการ:
alert( 'แน่นอน!' ); alert( 'ใหญ่เกินไป' ); alert( "ฉันไม่ทราบค่าดังกล่าว" );
นิพจน์ใดๆ ก็สามารถเป็นอาร์กิวเมนต์ switch/case
ได้
ทั้ง switch
และ case
อนุญาตให้มีการแสดงออกโดยพลการ
ตัวอย่างเช่น:
ให้ = "1"; ให้ข = 0; สวิตช์ (+a) { กรณี ข + 1: alert("สิ่งนี้เกิดขึ้น เพราะ +a คือ 1 เท่ากับ b+1 ทุกประการ"); หยุดพัก; ค่าเริ่มต้น: alert("สิ่งนี้ไม่ทำงาน"); -
ที่นี่ +a
ให้ 1
ซึ่งเปรียบเทียบกับ b + 1
ใน case
และโค้ดที่เกี่ยวข้องถูกดำเนินการ
สามารถจัดกลุ่ม case
หลายแบบที่ใช้รหัสเดียวกันได้
ตัวอย่างเช่น ถ้าเราต้องการให้โค้ดเดียวกันทำงานสำหรับ case 3
และ case 5
:
ให้ = 3; สวิตช์ (ก) { กรณีที่ 4: alert('ถูกต้อง!'); หยุดพัก; กรณีที่ 3: // (*) จัดกลุ่มสองกรณี กรณีที่ 5: alert('ผิด!'); alert("ทำไมไม่เรียนคณิต?"); หยุดพัก; ค่าเริ่มต้น: alert('ผลลัพธ์มันแปลกๆ จริงๆ'); -
ตอนนี้ทั้ง 3
และ 5
แสดงข้อความเดียวกัน
ความสามารถในการ "จัดกลุ่ม" เคสเป็นผลข้างเคียงของการทำงาน switch/case
โดยไม่ break
ที่นี่การดำเนินการของ case 3
เริ่มต้นจากบรรทัด (*)
และผ่าน case 5
เนื่องจากไม่มี break
ขอเน้นย้ำว่าการตรวจสอบความเท่าเทียมกันนั้นเข้มงวดเสมอ ค่าต้องเป็นประเภทเดียวกันจึงจะตรงกัน
ตัวอย่างเช่น ลองพิจารณาโค้ด:
ให้ arg = prompt("ป้อนค่า?"); สวิตช์ (หาเรื่อง) { กรณี '0': กรณี '1': alert( 'หนึ่งหรือศูนย์' ); หยุดพัก; กรณี '2': alert( 'สอง' ); หยุดพัก; กรณีที่ 3: alert( 'อย่าดำเนินการ!' ); หยุดพัก; ค่าเริ่มต้น: alert( 'ไม่ทราบค่า' ); -
สำหรับ 0
, 1
alert
ครั้งแรกจะทำงาน
สำหรับ 2
alert
ครั้งที่สองจะทำงาน
แต่สำหรับ 3
ผลลัพธ์ของ prompt
คือสตริง "3"
ซึ่งไม่เท่ากับ ===
กับหมายเลข 3
อย่างเคร่งครัด ดังนั้นเราจึงได้โค้ดที่เสียใน case 3
! ตัวแปร default
จะดำเนินการ
ความสำคัญ: 5
เขียนโค้ดโดยใช้ if..else
ซึ่งจะสอดคล้องกับ switch
ต่อไปนี้:
สวิตช์ (เบราว์เซอร์) { กรณี 'ขอบ': alert( "คุณได้เปรียบแล้ว!" ); หยุดพัก; กรณี 'โครเมี่ยม': กรณี 'Firefox': กรณี 'ซาฟารี': กรณี 'โอเปร่า': alert( 'โอเค เรารองรับเบราว์เซอร์เหล่านี้ด้วย' ); หยุดพัก; ค่าเริ่มต้น: alert( 'เราหวังว่าหน้านี้จะดูดี!' ); -
เพื่อให้ตรงกับฟังก์ชันการทำงานของ switch
อย่างแม่นยำ if
ต้องใช้การเปรียบเทียบที่เข้มงวด '==='
สำหรับสตริงที่กำหนด '=='
แบบธรรมดาก็ใช้ได้เช่นกัน
ถ้า (เบราว์เซอร์ == 'Edge') { alert("คุณได้เปรียบแล้ว!"); } อื่นถ้า (เบราว์เซอร์ == 'Chrome' - เบราว์เซอร์ == 'Firefox' - เบราว์เซอร์ == 'ซาฟารี' - เบราว์เซอร์ == 'โอเปร่า') { alert( 'โอเค เรารองรับเบราว์เซอร์เหล่านี้ด้วย' ); } อื่น { alert( 'เราหวังว่าหน้านี้จะดูดี!' ); -
โปรดทราบ: browser == 'Chrome' || browser == 'Firefox' …
ถูกแบ่งออกเป็นหลายบรรทัดเพื่อให้อ่านง่ายขึ้น
แต่โครงสร้าง switch
ยังคงสะอาดกว่าและมีคำอธิบายมากกว่า
ความสำคัญ: 4
เขียนโค้ดด้านล่างใหม่โดยใช้คำสั่ง switch
เดียว:
ให้ a = +prompt('a?', ''); ถ้า (ก == 0) { การแจ้งเตือน( 0 ); - ถ้า (ก == 1) { การแจ้งเตือน( 1 ); - ถ้า (ก == 2 || ก == 3) { การแจ้งเตือน( '2,3' ); -
เช็คสองรายการแรกจะกลายเป็นสอง case
เช็คครั้งที่ 3 แบ่งออกเป็น 2 กรณี คือ
ให้ a = +prompt('a?', ''); สวิตช์ (ก) { กรณีที่ 0: การแจ้งเตือน( 0 ); หยุดพัก; กรณีที่ 1: การแจ้งเตือน( 1 ); หยุดพัก; กรณีที่ 2: กรณีที่ 3: การแจ้งเตือน( '2,3' ); หยุดพัก; -
โปรดทราบ: ไม่จำเป็นต้อง break
ที่ด้านล่าง แต่เราใส่มันเพื่อสร้างโค้ดที่พิสูจน์ได้ในอนาคต
ในอนาคตมีโอกาสที่เราอยากจะเพิ่มอีก case
เช่น case 4
และถ้าเราลืมเพิ่มตัวแบ่งก่อนหน้านั้น เมื่อสิ้นสุด case 3
จะเกิดข้อผิดพลาด นั่นคือการประกันตัวเองชนิดหนึ่ง