Thêm một chút để mu is too short's answer, bạn có thể chuyển đổi đoạn mã thứ hai của mình vào một biểu switch
:
Handlebars.registerHelper 'status', (blog) ->
status = parseInt(blog.status, 10)
switch
when status <= 0 then 'Something...'
when status <= 20 then 'Active'
when status <= 40 then 'Moderately Active'
when status <= 60 then 'Very Active'
when status <= 100 then 'Hyper Active'
else 'Something else'
này về cơ bản là tương đương với làm một switch (true)
trong JavaScript (mặc dù trình biên dịch CS sẽ tạo ra một switch (false)
statement with the negated conditions để đảm bảo kết quả boolean từ các biểu thức ... tôi nghĩ).
Và lý do tại sao switch
trên phạm vi không hoạt động là dao động literals trong CS đại diện cho mảng JS cũ đồng bằng (mặc dù trình biên dịch sẽ làm một số thủ thuật tối ưu hóa khi làm một cái gì đó giống như for i in [1..something]
), vì vậy khi họ tìm thấy bên trong một switch
họ được đối xử chỉ like normal array values:
// Generated JS for question's CS code:
switch (parseInt(blog.status)) {
case [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]:
status = "active";
break;
case [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40]:
status = "Moderately Active";
break;
case [40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60]:
status = "Very Active";
break;
case (function() {
_results = [];
for (_i = 60; _i <= 100; _i++){ _results.push(_i); }
return _results;
}).apply(this):
status = "Hyper Active";
}
giá trị bên trong tuyên bố switch
được về cơ bản so với mỗi giá trị case
sử dụng ===
, mà chỉ hoạt động cho nguyên thủy, không phải cho mảng (và thậm chí nếu nó làm việc cho mảng, nó sẽ được thử nghiệm bình đẳng mảng, không phải nếu giá trị ed switch
được chứa trong mảng case
ed).
Tại sao tính năng này hoạt động? Vấn đề [github] (https://github.com/jashkenas/coffee-script/issues/1383) dường như nói rằng cú pháp này không được chấp nhận. –