เรามักจะต้องทำซ้ำการกระทำ
ตัวอย่างเช่น ส่งออกสินค้าจากรายการทีละรายการ หรือเพียงเรียกใช้โค้ดเดียวกันสำหรับแต่ละหมายเลขตั้งแต่ 1 ถึง 10
ลูป เป็นวิธีหนึ่งในการทำซ้ำโค้ดเดียวกันหลายครั้ง
for...of และ for...in ลูป
ประกาศเล็กๆ น้อยๆ สำหรับผู้อ่านขั้นสูง
บทความนี้ครอบคลุมเฉพาะการวนซ้ำพื้นฐาน: while , do..while และ for(..;..;..)
หากคุณมาที่บทความนี้เพื่อค้นหาลูปประเภทอื่น นี่คือคำแนะนำ:
ดูสำหรับ…ในเพื่อวนซ้ำคุณสมบัติของวัตถุ
ดู for...of และ iterables สำหรับการวนซ้ำอาร์เรย์และอ็อบเจ็กต์ที่ทำซ้ำได้
มิฉะนั้นโปรดอ่านต่อ
while ลูปมีไวยากรณ์ดังต่อไปนี้:
ในขณะที่ (เงื่อนไข) {
// รหัส
// เรียกว่า "ตัวห่วง"
- แม้ว่า condition จะเป็นความจริง code จากเนื้อหาลูปก็จะถูกดำเนินการ
ตัวอย่างเช่น การวนซ้ำด้านล่างจะส่งออก i ในขณะที่ i < 3 :
ให้ฉัน = 0;
ในขณะที่ (i < 3) { // แสดง 0 จากนั้น 1 และ 2
การแจ้งเตือน (ฉัน);
ฉัน++;
-การดำเนินการครั้งเดียวของเนื้อความของลูปเรียกว่า การวนซ้ำ การวนซ้ำในตัวอย่างด้านบนจะวนซ้ำสามครั้ง
หาก i++ หายไปจากตัวอย่างด้านบน การวนซ้ำจะเกิดซ้ำ (ในทางทฤษฎี) ตลอดไป ในทางปฏิบัติ เบราว์เซอร์มีวิธีหยุดการวนซ้ำดังกล่าว และใน JavaScript ฝั่งเซิร์ฟเวอร์ เราสามารถปิดกระบวนการได้
นิพจน์หรือตัวแปรใดๆ ก็สามารถเป็นเงื่อนไขลูปได้ ไม่ใช่แค่การเปรียบเทียบเท่านั้น เงื่อนไขจะได้รับการประเมินและแปลงเป็นบูลีนด้วย while
ตัวอย่างเช่น วิธีเขียนที่สั้นกว่า while (i != 0) คือ while (i) :
ให้ฉัน = 3;
ในขณะที่ (i) { // เมื่อฉันกลายเป็น 0 เงื่อนไขจะกลายเป็นเท็จ และการวนซ้ำจะหยุดลง
การแจ้งเตือน (ฉัน);
ฉัน--;
-วงเล็บปีกกาไม่จำเป็นสำหรับเนื้อหาบรรทัดเดียว
หากเนื้อหาของลูปมีคำสั่งเดียว เราสามารถละเครื่องหมายปีกกา {…} :
ให้ฉัน = 3; ในขณะที่ (i) แจ้งเตือน (i--);
การตรวจสอบเงื่อนไขสามารถย้ายไป อยู่ใต้ เนื้อหาลูปได้โดยใช้ไวยากรณ์ do..while :
ทำ {
// ห่วงร่างกาย
} ในขณะที่ (เงื่อนไข);ลูปจะดำเนินการกับเนื้อหาก่อน จากนั้นจึงตรวจสอบเงื่อนไข และแม้ว่าจะเป็นจริง จะดำเนินการซ้ำแล้วซ้ำอีก
ตัวอย่างเช่น:
ให้ฉัน = 0;
ทำ {
การแจ้งเตือน (ฉัน);
ฉัน++;
} ในขณะที่ (i < 3); ควรใช้ไวยากรณ์รูปแบบนี้เฉพาะเมื่อคุณต้องการให้เนื้อหาของลูปดำเนินการ อย่างน้อยหนึ่งครั้ง โดยไม่คำนึงถึงเงื่อนไขที่เป็นความจริง โดยปกติแล้ว ควรใช้รูปแบบอื่น: while(…) {…}
for loop นั้นซับซ้อนกว่า แต่ก็เป็น loop ที่ใช้บ่อยที่สุดเช่นกัน
ดูเหมือนว่านี้:
สำหรับ (เริ่มต้น; เงื่อนไข; ขั้นตอน) {
// ... ห่วงร่างกาย ...
- มาเรียนรู้ความหมายของส่วนต่างๆ เหล่านี้ด้วยตัวอย่างกันดีกว่า ลูปด้านล่างเรียกใช้ alert(i) for i ตั้งแต่ 0 ถึง (แต่ไม่รวม) 3 :
สำหรับ (ให้ i = 0; i <3; i++) { // แสดง 0 จากนั้น 1 จากนั้น 2
การแจ้งเตือน (ฉัน);
- เรามาตรวจสอบคำสั่ง for ทีละส่วนกัน:
| ส่วนหนึ่ง | ||
|---|---|---|
| เริ่ม | let i = 0 | ดำเนินการหนึ่งครั้งเมื่อเข้าสู่วง |
| เงื่อนไข | i < 3 | ตรวจสอบก่อนการวนซ้ำทุกครั้ง หากเป็นเท็จ การวนซ้ำจะหยุดลง |
| ร่างกาย | alert(i) | วิ่งซ้ำแล้วซ้ำเล่าในขณะที่เงื่อนไขเป็นจริง |
| ขั้นตอน | i++ | ดำเนินการหลังจากเนื้อหาในการวนซ้ำแต่ละครั้ง |
อัลกอริธึมการวนซ้ำทั่วไปทำงานดังนี้:
เริ่มวิ่ง → (หากเงื่อนไข → รันตัวถังและรันสเต็ป) → (หากเงื่อนไข → รันตัวถังและรันสเต็ป) → (หากเงื่อนไข → รันตัวถังและรันสเต็ป) ...
นั่นคือ begin ดำเนินการหนึ่งครั้ง จากนั้นทำซ้ำ: หลังจากการทดสอบ condition แต่ละครั้ง body และ step จะถูกดำเนินการ
หากคุณยังใหม่กับลูป การกลับไปที่ตัวอย่างและจำลองวิธีการวนซ้ำทีละขั้นตอนบนกระดาษอาจช่วยได้
นี่คือสิ่งที่เกิดขึ้นในกรณีของเรา:
// สำหรับ (ให้ i = 0; i <3; i++) การแจ้งเตือน (i)
//เริ่มวิ่ง
ให้ฉัน = 0
// ถ้าเงื่อนไข → รันเนื้อหาและรันสเต็ป
ถ้า (i < 3) { การแจ้งเตือน (i); ฉัน++ }
// ถ้าเงื่อนไข → รันเนื้อหาและรันสเต็ป
ถ้า (i < 3) { การแจ้งเตือน (i); ฉัน++ }
// ถ้าเงื่อนไข → รันเนื้อหาและรันสเต็ป
ถ้า (i < 3) { การแจ้งเตือน (i); ฉัน++ }
// ...เสร็จสิ้น เพราะตอนนี้ i == 3การประกาศตัวแปรแบบอินไลน์
ที่นี่ตัวแปร "ตัวนับ" i ได้รับการประกาศไว้ในลูปโดยตรง สิ่งนี้เรียกว่าการประกาศตัวแปรแบบอินไลน์ ตัวแปรดังกล่าวจะมองเห็นได้ภายในลูปเท่านั้น
สำหรับ (ให้ i = 0; i <3; i++) {
การแจ้งเตือน (ฉัน); // 0, 1, 2
-
การแจ้งเตือน (ฉัน); // ผิดพลาด ไม่มีตัวแปรดังกล่าวแทนที่จะกำหนดตัวแปร เราสามารถใช้ตัวแปรที่มีอยู่ได้:
ให้ฉัน = 0;
สำหรับ (i = 0; i < 3; i++) { // ใช้ตัวแปรที่มีอยู่
การแจ้งเตือน (ฉัน); // 0, 1, 2
-
การแจ้งเตือน (ฉัน); // 3 มองเห็นได้ เนื่องจากประกาศไว้นอกลูป ส่วนใดส่วนหนึ่งของ for สามารถข้ามได้
ตัวอย่างเช่น เราสามารถละเว้น begin ได้ ถ้าเราไม่จำเป็นต้องทำอะไรที่ loop start
ชอบที่นี่:
ให้ฉัน = 0; // เราได้ประกาศและมอบหมายแล้ว
สำหรับ (; i < 3; i++) { // ไม่จำเป็นต้อง "เริ่มต้น"
การแจ้งเตือน (ฉัน); // 0, 1, 2
- นอกจากนี้เรายังสามารถลบส่วน step ออกได้:
ให้ฉัน = 0;
สำหรับ (; ฉัน < 3;) {
การแจ้งเตือน (i++);
- สิ่งนี้ทำให้การวนซ้ำเหมือนกับ while (i < 3)
จริงๆ แล้วเราสามารถลบทุกอย่างออกได้ โดยสร้างวงวนที่ไม่มีที่สิ้นสุด:
สำหรับ (;;) {
// ทำซ้ำโดยไม่มีขีดจำกัด
- โปรดทราบว่าทั้งสอง for อัฒภาค ; จะต้องมีอยู่ มิฉะนั้นจะเกิดข้อผิดพลาดทางไวยากรณ์
โดยปกติแล้ว ลูปจะออกเมื่อเงื่อนไขกลายเป็นเท็จ
แต่เราสามารถบังคับทางออกได้ตลอดเวลาโดยใช้คำสั่ง break พิเศษ
ตัวอย่างเช่น การวนซ้ำด้านล่างจะขอให้ผู้ใช้ระบุชุดตัวเลข โดยจะ "หมด" เมื่อไม่ได้ป้อนตัวเลข:
ให้ผลรวม = 0;
ในขณะที่ (จริง) {
ให้ค่า = +prompt("ป้อนตัวเลข", '');
ถ้า (!value) แตก; -
ผลรวม += ค่า;
-
alert( 'ผลรวม:' + ผลรวม ); คำสั่ง break จะเปิดใช้งานที่บรรทัด (*) หากผู้ใช้เข้าสู่บรรทัดว่างหรือยกเลิกการป้อนข้อมูล จะหยุดการวนซ้ำทันที โดยผ่านการควบคุมไปยังบรรทัดแรกหลังการวนซ้ำ กล่าวคือ alert .
การผสมผสาน “การวนซ้ำไม่สิ้นสุด + break ตามต้องการ” เหมาะอย่างยิ่งสำหรับสถานการณ์เมื่อต้องตรวจสอบเงื่อนไขของลูปไม่ใช่ที่จุดเริ่มต้นหรือจุดสิ้นสุดของลูป แต่อยู่ตรงกลางหรือแม้แต่ในหลายๆ ตำแหน่งของร่างกาย
คำสั่ง continue คือ "เวอร์ชันที่เบากว่า" ของ break มันไม่ได้หยุดวงทั้งหมด แต่จะหยุดการวนซ้ำปัจจุบันและบังคับให้ลูปเริ่มการวนซ้ำใหม่ (หากเงื่อนไขอนุญาต)
เราสามารถใช้มันได้หากเราทำซ้ำปัจจุบันเสร็จแล้ว และต้องการไปยังครั้งถัดไป
การวนซ้ำด้านล่างใช้ continue เพื่อส่งออกเฉพาะค่าคี่:
สำหรับ (ให้ i = 0; i < 10; i++) {
// ถ้าเป็นจริงให้ข้ามส่วนที่เหลือของร่างกายไป
ถ้า (i % 2 == 0) ดำเนินการต่อ;
การแจ้งเตือน (ฉัน); // 1 จากนั้น 3, 5, 7, 9
- สำหรับค่าคู่ของ i คำสั่ง continue จะหยุดดำเนินการเนื้อความและผ่านการควบคุมไปยังการวนซ้ำครั้งถัดไปของ for (พร้อมกับตัวเลขถัดไป) ดังนั้น alert จึงถูกเรียกเฉพาะค่าคี่เท่านั้น
คำสั่ง continue ช่วยลดการซ้อน
การวนซ้ำที่แสดงค่าคี่อาจมีลักษณะดังนี้:
สำหรับ (ให้ i = 0; i < 10; i++) {
ถ้า (ฉัน % 2) {
การแจ้งเตือน (ฉัน);
-
- จากมุมมองทางเทคนิค นี่จะเหมือนกับตัวอย่างด้านบน แน่นอนว่าเราสามารถรวมโค้ดไว้ในบล็อก if แทนที่จะใช้ continue
แต่เป็นผลข้างเคียง สิ่งนี้ทำให้เกิดการซ้อนขึ้นอีกระดับหนึ่ง (การเรียก alert ภายในเครื่องหมายปีกกา) หากโค้ดภายใน if ยาวเกินสองสามบรรทัด อาจทำให้การอ่านโดยรวมลดลง
ไม่ break/continue ไปทางด้านขวาของ '?'
โปรดทราบว่าโครงสร้างไวยากรณ์ที่ไม่ใช่นิพจน์ไม่สามารถใช้กับตัวดำเนินการแบบไตรภาคได้ ? - โดยเฉพาะอย่างยิ่ง ไม่อนุญาตให้ใช้คำสั่งเช่น break/continue
ตัวอย่างเช่น หากเราใช้รหัสนี้:
ถ้า (ผม > 5) {
การแจ้งเตือน (ฉัน);
} อื่น {
ดำเนินการต่อ;
-…และเขียนใหม่โดยใช้เครื่องหมายคำถาม:
(ฉัน > 5) ? การแจ้งเตือน (i): ดำเนินการต่อ; // ไม่อนุญาตให้ดำเนินการต่อที่นี่
…มันหยุดทำงาน: มีข้อผิดพลาดทางไวยากรณ์
นี่เป็นอีกเหตุผลหนึ่งที่จะไม่ใช้ตัวดำเนินการเครื่องหมายคำถาม ? แทนที่จะเป็น if
บางครั้งเราจำเป็นต้องแยกออกจากลูปที่ซ้อนกันหลายอันพร้อมกัน
ตัวอย่างเช่น ในโค้ดด้านล่าง เราวนซ้ำ i และ j โดยแจ้งพิกัด (i, j) จาก (0,0) ถึง (2,2) :
สำหรับ (ให้ i = 0; i <3; i++) {
สำหรับ (ให้ j = 0; j <3; j++) {
ให้ input = prompt(`ค่าที่ coords (${i},${j})`, '');
// จะเป็นอย่างไรหากเราต้องการออกจากที่นี่ไปยัง Done (ด้านล่าง)?
-
-
alert('เสร็จสิ้น!');เราต้องการวิธีหยุดกระบวนการหากผู้ใช้ยกเลิกการป้อนข้อมูล
break ธรรมดาหลังจาก input จะทำให้วงในแตกเท่านั้น เท่านั้นยังไม่พอ – ฉลากมาช่วยชีวิต!
ป้ายกำกับ คือตัวระบุที่มีเครื่องหมายทวิภาคก่อนการวนซ้ำ:
labelName: สำหรับ (...) {
-
- คำสั่ง break <labelName> ในลูปด้านล่างแยกออกเป็นป้ายกำกับ:
ภายนอก: สำหรับ (ให้ i = 0; i < 3; i++) {
สำหรับ (ให้ j = 0; j <3; j++) {
ให้ input = prompt(`ค่าที่ coords (${i},${j})`, '');
// หากเป็นสตริงว่างหรือถูกยกเลิก ให้แยกออกจากทั้งสองลูป
ถ้า (!input) แตกด้านนอก; -
//ทำอะไรสักอย่างที่มีค่า...
-
-
alert('เสร็จสิ้น!'); ในโค้ดด้านบน break outer จะมองขึ้นไปด้านบนเพื่อหาป้ายกำกับที่ชื่อ outer และแยกออกจากวงนั้น
ดังนั้นการควบคุมจะไปตรงจาก (*) ถึง alert('Done!')
นอกจากนี้เรายังสามารถย้ายป้ายกำกับไปยังบรรทัดแยก:
ภายนอก:
สำหรับ (ให้ i = 0; i < 3; i++) { ... } คำสั่ง continue ยังสามารถใช้กับป้ายกำกับได้ ในกรณีนี้ การเรียกใช้โค้ดจะข้ามไปยังการวนซ้ำครั้งถัดไปของลูปที่มีป้ายกำกับ
ป้ายกำกับไม่อนุญาตให้ "กระโดด" ทุกที่
ป้ายกำกับไม่อนุญาตให้เราข้ามไปยังตำแหน่งที่ต้องการในโค้ด
ตัวอย่างเช่น เป็นไปไม่ได้ที่จะทำเช่นนี้:
ทำลายฉลาก; // ข้ามไปที่ป้ายกำกับด้านล่าง (ใช้งานไม่ได้) ป้ายกำกับ: สำหรับ (...)
คำสั่ง break จะต้องอยู่ภายในบล็อคโค้ด ในทางเทคนิคแล้ว บล็อกโค้ดที่มีป้ายกำกับใดๆ จะดำเนินการได้ เช่น:
ฉลาก: {
-
ทำลายฉลาก; //ทำงาน
-
- …แม้ว่า 99.9% ของ break เวลาจะใช้ภายในลูป ดังที่เราได้เห็นในตัวอย่างด้านบน
continue สามารถทำได้จากภายในลูปเท่านั้น
เราครอบคลุมลูป 3 ประเภท:
while – มีการตรวจสอบเงื่อนไขก่อนการวนซ้ำแต่ละครั้ง
do..while – เงื่อนไขจะถูกตรวจสอบหลังจากการวนซ้ำแต่ละครั้ง
for (;;) – มีการตรวจสอบเงื่อนไขก่อนการวนซ้ำแต่ละครั้ง มีการตั้งค่าเพิ่มเติมให้เลือก
ในการสร้างลูปแบบ "ไม่มีที่สิ้นสุด" โดยปกติจะใช้โครงสร้าง while(true) การวนซ้ำดังกล่าวสามารถหยุดได้ด้วยคำสั่ง break
หากเราไม่ต้องการทำอะไรในการวนซ้ำปัจจุบันและต้องการส่งต่อไปยังครั้งถัดไป เราสามารถใช้คำสั่ง continue ได้
break/continue ป้ายกำกับการสนับสนุนก่อนการวนซ้ำ ป้ายกำกับเป็นวิธีเดียวที่จะ break/continue เพื่อออกจากลูปที่ซ้อนกันเพื่อไปยังลูปภายนอก
ความสำคัญ: 3
รหัสนี้แจ้งเตือนค่าสุดท้ายคืออะไร ทำไม
ให้ฉัน = 3;
ในขณะที่ (i) {
แจ้งเตือน( i-- );
-
คำตอบ: 1 .
ให้ฉัน = 3;
ในขณะที่ (i) {
แจ้งเตือน( i-- );
- การวนซ้ำทุกครั้งจะลดลง i 1 การตรวจสอบ while(i) หยุดการวนซ้ำเมื่อ i = 0
ดังนั้น ขั้นตอนของการวนซ้ำจึงเกิดลำดับต่อไปนี้ (“การวนซ้ำแบบคลี่ออก”):
ให้ฉัน = 3; การแจ้งเตือน(i--); // แสดง 3 ลด i เหลือ 2 alert(i--) // แสดง 2, ลด i เหลือ 1 alert(i--) // แสดง 1 ลด i เหลือ 0 // เสร็จแล้ว ในขณะที่ (i) การตรวจสอบหยุดการวนซ้ำ
ความสำคัญ: 4
สำหรับการวนซ้ำทุกครั้ง ให้จดบันทึกค่าที่ส่งออก จากนั้นเปรียบเทียบกับค่าเฉลย
ทั้งสองลูป alert ค่าเดียวกันหรือไม่?
แบบฟอร์มคำนำหน้า ++i :
ให้ฉัน = 0; ในขณะที่ (++ i < 5) แจ้งเตือน ( i );
รูปแบบ postfix i++
ให้ฉัน = 0; ในขณะที่ (i ++ < 5) แจ้งเตือน ( i );
งานนี้แสดงให้เห็นว่าแบบฟอร์ม postfix/prefix สามารถนำไปสู่ผลลัพธ์ที่แตกต่างกันได้อย่างไรเมื่อใช้ในการเปรียบเทียบ
ตั้งแต่ 1 ถึง 4
ให้ฉัน = 0; ในขณะที่ (++ i < 5) แจ้งเตือน ( i );
ค่าแรกคือ i = 1 เนื่องจาก ++i เพิ่มค่า i ก่อน จากนั้นจึงส่งคืนค่าใหม่ ดังนั้นการเปรียบเทียบครั้งแรกคือ 1 < 5 และ alert จะแสดง 1
จากนั้นทำตาม 2, 3, 4… – ค่าต่างๆ จะปรากฏขึ้นทีละรายการ การเปรียบเทียบจะใช้ค่าที่เพิ่มขึ้นเสมอ เนื่องจาก ++ อยู่หน้าตัวแปร
ในที่สุด i = 4 จะเพิ่มขึ้นเป็น 5 การเปรียบเทียบ while(5 < 5) ล้มเหลว และการวนซ้ำหยุด จึงไม่แสดง 5
ตั้งแต่ 1 ถึง 5
ให้ฉัน = 0; ในขณะที่ (i ++ < 5) แจ้งเตือน ( i );
ค่าแรกเป็นอีกครั้ง i = 1 รูปแบบ postfix ของ i++ ที่เพิ่มขึ้น i แล้วส่งคืนค่า เก่า ดังนั้นการเปรียบเทียบ i++ < 5 จะใช้ i = 0 (ตรงกันข้ามกับ ++i < 5 )
แต่สาย alert จะแยกกัน เป็นอีกคำสั่งหนึ่งที่ดำเนินการหลังจากการเพิ่มขึ้นและการเปรียบเทียบ ดังนั้นจะได้กระแส i = 1
จากนั้นทำตาม 2, 3, 4…
หยุดที่ i = 4 กัน แบบฟอร์มคำนำหน้า ++i จะเพิ่มขึ้นและใช้ 5 ในการเปรียบเทียบ แต่ที่นี่เรามีแบบฟอร์ม postfix i++ ดังนั้นจึงเพิ่ม i เป็น 5 แต่ส่งคืนค่าเก่า ดังนั้นการเปรียบเทียบจึงเป็นจริง while(4 < 5) – จริง และการควบคุมจะดำเนินต่อไปเพื่อ alert
ค่า i = 5 เป็นค่าสุดท้าย เนื่องจากในขั้นตอนถัดไป while(5 < 5) เป็นเท็จ
ความสำคัญ: 4
สำหรับแต่ละวง ให้เขียนว่าจะแสดงค่าใด แล้วเปรียบเทียบกับคำตอบ
ทั้งสองลูป alert ค่าเดียวกันหรือไม่?
แบบฟอร์ม postfix:
สำหรับ (ให้ i = 0; i <5; i++) การแจ้งเตือน ( i );
แบบฟอร์มคำนำหน้า:
สำหรับ (ให้ i = 0; i < 5; ++ i) การแจ้งเตือน ( i );
คำตอบ: จาก 0 ถึง 4 ในทั้งสองกรณี
สำหรับ (ให้ i = 0; i < 5; ++ i) การแจ้งเตือน ( i ); สำหรับ (ให้ i = 0; i <5; i++) การแจ้งเตือน ( i );
ที่สามารถหักออกจากอัลกอริทึมของ for :
ดำเนินการหนึ่งครั้ง i = 0 ก่อนทุกอย่าง (เริ่มต้น)
ตรวจสอบสภาพ i < 5
หากเป็น true - ดำเนินการ alert(i) จากนั้น i++
การเพิ่มขึ้น i++ ถูกแยกออกจากการตรวจสอบเงื่อนไข (2) นั่นเป็นเพียงคำสั่งอื่น
ค่าที่ส่งคืนตามส่วนเพิ่มไม่ได้ใช้ที่นี่ ดังนั้นจึงไม่มีความแตกต่างระหว่าง i++ และ ++i
ความสำคัญ: 5
ใช้ for loop เพื่อส่งออกเลขคู่ตั้งแต่ 2 ถึง 10
เรียกใช้การสาธิต
สำหรับ (ให้ i = 2; i <= 10; i++) {
ถ้า (ฉัน % 2 == 0) {
การแจ้งเตือน (ฉัน);
-
- เราใช้ตัวดำเนินการ "โมดูโล" % เพื่อรับส่วนที่เหลือและตรวจสอบความสม่ำเสมอที่นี่
ความสำคัญ: 5
เขียนโค้ดใหม่โดยเปลี่ยน for loop เป็น while โดยไม่เปลี่ยนแปลงพฤติกรรม (เอาต์พุตควรคงเดิม)
สำหรับ (ให้ i = 0; i <3; i++) {
alert( `หมายเลข ${i}!` );
-
ให้ฉัน = 0;
ในขณะที่ (ฉัน < 3) {
alert( `หมายเลข ${i}!` );
ฉัน++;
-ความสำคัญ: 5
เขียนลูปโดยให้ใส่ตัวเลขที่มากกว่า 100 หากผู้เยี่ยมชมป้อนหมายเลขอื่น – ขอให้พวกเขาป้อนอีกครั้ง
การวนซ้ำจะต้องขอตัวเลขจนกว่าผู้เข้าชมจะป้อนตัวเลขที่มากกว่า 100 หรือยกเลิกการป้อนข้อมูล/เข้าสู่บรรทัดว่าง
ที่นี่เราสามารถสรุปได้ว่าผู้เยี่ยมชมป้อนเฉพาะตัวเลขเท่านั้น ไม่จำเป็นต้องมีการจัดการพิเศษสำหรับอินพุตที่ไม่ใช่ตัวเลขในงานนี้
เรียกใช้การสาธิต
ให้หมายเลข;
ทำ {
num = prompt("กรอกตัวเลขที่มากกว่า 100?", 0);
} ในขณะที่ (num <= 100 && num); การวนซ้ำ do..while ที่ทำซ้ำในขณะที่การตรวจสอบทั้งสองเป็นความจริง:
การตรวจสอบ num <= 100 – นั่นคือค่าที่ป้อนยังคงไม่เกิน 100
เครื่องหมาย && num เป็นเท็จ เมื่อ num เป็น null หรือสตริงว่าง จากนั้น while ลูปก็หยุดเช่นกัน
PS หาก num เป็น null ดังนั้น num <= 100 จะเป็น true ดังนั้นหากไม่มีการตรวจสอบครั้งที่ 2 การวนซ้ำจะไม่หยุดหากผู้ใช้คลิก CANCEL จำเป็นต้องมีการตรวจสอบทั้งสองอย่าง
ความสำคัญ: 3
จำนวนเต็มที่มากกว่า 1 เรียกว่าจำนวนเฉพาะ หากไม่สามารถหารด้วยสิ่งใดสิ่งหนึ่งได้โดยไม่มีเศษเหลือ ยกเว้น 1 และตัวมันเอง
กล่าวอีกนัยหนึ่ง n > 1 เป็นจำนวนเฉพาะหากไม่สามารถหารด้วยสิ่งใดๆ ได้เท่าๆ กัน ยกเว้น 1 และ n
ตัวอย่างเช่น 5 เป็นจำนวนเฉพาะ เนื่องจากไม่สามารถหารโดยไม่มีเศษด้วย 2 , 3 และ 4 ได้
เขียนโค้ดที่ให้ผลลัพธ์เป็นตัวเลขเฉพาะในช่วงตั้งแต่ 2 ถึง n
สำหรับ n = 10 ผลลัพธ์จะเป็น 2,3,5,7
PS รหัสควรใช้งานได้กับ n ใด ๆ ไม่ได้รับการปรับแต่งอย่างหนักสำหรับค่าคงที่ใด ๆ
มีอัลกอริธึมมากมายสำหรับงานนี้
ลองใช้ลูปแบบซ้อน:
สำหรับแต่ละ i ในช่วงเวลา {
ตรวจสอบว่าฉันมีตัวหารจาก 1..i หรือไม่
ถ้าใช่ => ค่าไม่ใช่จำนวนเฉพาะ
ถ้าไม่ใช่ => ค่านั้นเป็นจำนวนเฉพาะ ให้แสดงมัน
-รหัสที่ใช้ป้ายกำกับ:
ให้ n = 10;
ต่อไปนายกรัฐมนตรี:
สำหรับ (ให้ i = 2; i <= n; i++) { // สำหรับแต่ละ i...
for (ให้ j = 2; j < i; j++) { // มองหาตัวหาร..
ถ้า (i % j == 0) ดำเนินการต่อถัดไปนายกรัฐมนตรี; // ไม่ใช่จำนวนเฉพาะ ไปต่อไป i
-
การแจ้งเตือน (ฉัน); // ไพรม์
- มีพื้นที่มากมายในการเพิ่มประสิทธิภาพ เช่น เราอาจหาตัวหารตั้งแต่ 2 ถึงรากที่สองของ i แต่อย่างไรก็ตาม หากเราต้องการมีประสิทธิภาพจริงๆ เป็นระยะเวลานาน เราจำเป็นต้องเปลี่ยนวิธีการและอาศัยคณิตศาสตร์ขั้นสูงและอัลกอริธึมที่ซับซ้อน เช่น ตะแกรงกำลังสอง ตะแกรงฟิลด์ตัวเลขทั่วไป เป็นต้น