Trước tiên, tôi muốn lưu ý rằng vòng lặp như vậy được coi là kiểu xấu, vì nó rất dễ đọc và gây ra nhiều nhầm lẫn. Đây là một ví dụ điển hình về tối ưu hóa đã sai.
Nhìn vào specs, bạn sẽ thấy rằng for(...)
phải được theo sau bởi một tuyên bố . Có thể là any statement, bao gồm các khối. Vì vậy, tất cả trong số này là hợp lệ:
for (...)
foo; // expression statement
,
for(...)
{
// block statement
}
,
for(...)
if(...) // If statement
foo;
, và tất nhiên
for (...)
;
vì ";
" là empty statement. Nó không có gì, nhưng nó đủ để làm cho for(...);
có hiệu lực về cú pháp.
Hiện tại, đối với dấu phẩy. Lưu ý rằng nội dung của các parens phải là ba expressions, (mỗi tùy chọn), được phân tách bằng dấu chấm phẩy. Khá nhiều "mọi thứ" đủ điều kiện làm biểu thức, bao gồm comma-separated lists of expressions. Mặc dù ít được biết đến, những công việc này về cơ bản ở khắp mọi nơi trong JS, không chỉ trong vòng for
. Chúng đơn giản được đánh giá sau cái kia.
Vì vậy, vòng lặp của bạn có thể được viết lại như vậy
shuffle = function(o) {
var j, x, i = o.length;
while (i) { // for-loops are just while-loops in disguise
j = parseInt(Math.random() * i), // even better: replace , by ;
x = o[--i],
o[i] = o[j],
o[j] = x;
}
return o;
};
Ngoài ra, x = o[--i]
nên được viết như i--; x = o[i]
.
Nếu chỉ có một vòng lặp thì tập lệnh sẽ hoạt động, nhưng nếu bạn có nhiều quyền sau tập lệnh kia thì bạn phải tách riêng các câu lệnh. – Rayshawn