Tôi đã tìm thấy chú thích vòng lặp sau trong một dự án lớn mà tôi đang thực hiện (mã giả):
var someOtherArray = [];
for (var i = 0, n = array.length; i < n; i++) {
someOtherArray[i] = modifyObjetFromArray(array[i]);
}
Điều khiến tôi chú ý là biến "n" thêm này. Tôi chưa bao giờ thấy một lop được viết theo cách này trước đây.
Rõ ràng trong kịch bản này, không có lý do tại sao mã này không thể được viết theo cách sau (mà tôi rất quen thuộc):
var someOtherArray = [];
for (var i = 0; i < array.length; i++) {
someOtherArray[i] = modifyObjetFromArray(array[i]);
}
Nhưng nó làm tôi suy nghĩ.
Có một kịch bản khi viết một vòng lặp for như vậy sẽ có ý nghĩa? Ý tưởng xuất hiện rằng độ dài "mảng" có thể thay đổi trong quá trình thực hiện vòng lặp for, nhưng chúng tôi không muốn lặp xa hơn kích thước ban đầu, nhưng tôi không thể tưởng tượng được một kịch bản như vậy.
Thu hẹp mảng bên trong vòng lặp cũng không có nhiều ý nghĩa, bởi vì chúng ta có khả năng nhận được OutOfBoundException.
Có một mẫu thiết kế đã biết mà chú thích này hữu ích không?
Chỉnh sửa Như đã lưu ý bởi @ Jerry101, lý do là hiệu suất. Đây là một liên kết đến bài kiểm tra hiệu suất tôi đã tạo: http://jsperf.com/ninforloop . Theo tôi, sự khác biệt không đủ lớn trừ khi bạn lặp đi lặp lại mặc dù một mảng rất lớn. Mã tôi đã sao chép nó chỉ có tối đa 20 yếu tố, vì vậy tôi nghĩ khả năng đọc trong trường hợp này vượt trội hơn so với việc xem xét hiệu suất.
n
có thể chậm hơn biến thể sử dụng array.Length
do JITter có thể không nhận thấy rằng nó có thể loại bỏ kiểm tra giới hạn mảng.