ฉันได้พบคำอธิบายประกอบแบบวนรอบต่อไปนี้ในโครงการขนาดใหญ่ที่ฉันกำลังทำงาน (pseudocode):
var someOtherArray = [];
for (var i = 0, n = array.length; i < n; i++) {
someOtherArray[i] = modifyObjetFromArray(array[i]);
}
สิ่งที่ทำให้ฉันสนใจคือตัวแปรพิเศษ "n" ฉันไม่เคยเห็น a lop เขียนในลักษณะนี้มาก่อน
เห็นได้ชัดว่าในสถานการณ์นี้ไม่มีเหตุผลว่าทำไมโค้ดนี้ไม่สามารถเขียนได้ด้วยวิธีต่อไปนี้ (ซึ่งฉันคุ้นเคยมาก):
var someOtherArray = [];
for (var i = 0; i < array.length; i++) {
someOtherArray[i] = modifyObjetFromArray(array[i]);
}
แต่มันทำให้ฉันคิด
มีสถานการณ์เมื่อเขียนห่วงสำหรับเช่นนี้จะทำให้รู้สึก? แนวคิดมาอยู่ในใจว่าความยาวของ "อาเรย์" อาจมีการเปลี่ยนแปลงในระหว่างการดำเนินการลูป แต่เราไม่ต้องการวนซ้ำเกินกว่าขนาดดั้งเดิม แต่ฉันไม่สามารถจินตนาการถึงสถานการณ์ดังกล่าวได้
การลดขนาดอาร์เรย์ภายในลูปไม่สมเหตุสมผลมากนักเนื่องจากเรามีแนวโน้มที่จะได้รับ OutOfBoundsException
มีรูปแบบการออกแบบที่เป็นที่รู้จักซึ่งการเพิ่มความคิดเห็นนี้มีประโยชน์หรือไม่
แก้ไขดัง ที่บันทึกไว้โดย @ Jerry101 เหตุผลคือประสิทธิภาพ นี่คือการเชื่อมโยงในการทดสอบประสิทธิภาพการทำงานที่ผมได้สร้าง: http://jsperf.com/ninforloop ในความเห็นของฉันความแตกต่างนั้นไม่ใหญ่พอเว้นแต่คุณจะทำซ้ำแม้ว่าจะมีชุดใหญ่มาก รหัสที่ฉันคัดลอกมานั้นมีองค์ประกอบมากถึง 20 ชิ้นเท่านั้นดังนั้นฉันจึงคิดว่าการอ่านในกรณีนี้มีค่ามากกว่าการพิจารณาเกี่ยวกับประสิทธิภาพ
nอาจช้ากว่าการใช้ตัวแปรarray.Lengthเนื่องจาก JITter อาจไม่สังเกตเห็นว่าสามารถกำจัดการตรวจสอบขอบเขตของอาร์เรย์ได้