2013-04-16 32 views
9

Tôi thường thấy điều này trong JavaScript:Math.floor() | 0

var val = (myvar/myothervar) | 0; 

Mà như xa như tôi hiểu là một trong số rất nhiều các phím tắt để sàn một giá trị trong JavaScript (như ~~, và >> 0, vv). Tuy nhiên, tôi đã nhìn vào một đoạn mã gần đây rằng đã làm điều này:

var val = Math.floor(myvar/ myothervar)|0; 

Họ đã sử dụng Math.floor() và sau đó cũng đã làm một Bitwise OR với 0. Tác giả đã làm điều này nhiều lần, vì vậy nó không chỉ là một lỗi đánh máy mà họ đã làm một lần. Bạn kiếm được gì bằng cách làm cả hai?

Đối với người hiếu, mã tôi đề cập đến có thể được tìm thấy here

+1

Có lẽ điều này được thiết kế để điều trị 'Infinity' như '0' trong trường hợp mà' myothervar' được '0'? Ví dụ, khi mô phỏng lực hấp dẫn giữa hai điểm ('G * m/r^2'), có thể giả sử không có lực hấp dẫn giữa hai điểm đồng thời (khi' r = 0') hơn là cố gắng hấp dẫn vô hạn. – apsillers

+0

@apsillers: Ví dụ hay, nhưng sẽ tốt hơn nếu kiểm tra xem r có nhỏ tùy ý hay không. Chia cho '5e-324' không đặc biệt mong muốn là – Eric

Trả lời

8

Bạn có thể không nghĩ đến:

  • Math.floor(NaN) == NaN (ok, không thực sự, nhưng Math.floor(NaN)NaN)
  • Math.floor(NaN) | 0 == 0

Cũng liên quan đến Infinity

Như đã chỉ ra bởi @apsillers, đây là probabably để loại bỏ Infinity s:

var x = 1; 
console.log(Math.floor(1/x));  // 1 
console.log(Math.floor(1/x) | 0); // 1 
x = 0; 
console.log(Math.floor(1/x));  // Infinity 
console.log(Math.floor(1/x) | 0); // 0 
+0

Ah! Giải thích nó! – Chad

+1

Tại sao bận tâm 'Math.floor'ing nó? – david

+0

@david: Không thực sự chắc chắn – Eric

Các vấn đề liên quan