2012-04-10 39 views
5

Làm cách nào để kiểm tra xem giá trị đầu vào là NaN hay không mà không sử dụng chức năng isNaN?Làm thế nào để biết giá trị là NaN mà không sử dụng isNaN, có giá trị dương?

+1

Tại sao bạn sẽ cần điều này? Thêm vào đó, điều này là rất nhiều "cho tôi codez" nhu cầu, vì vậy ... không, chúng tôi sẽ không giúp đỡ. –

+8

Tôi có một ốc vít tôi cần vặn vào, nhưng tôi không muốn sử dụng một trình điều khiển vít. Không, tôi sẽ không nói cho bạn biết tại sao tôi sẽ không dùng tuốc nơ vít. Cho tôi biết cám ơn. – asawyer

+0

Đây có phải là bài tập về nhà không? Tôi không thể nghĩ ra bất kỳ lý do nào khác mà bạn muốn giao vai trò một hàm 'isNaN'. – JaredPar

Trả lời

7

Nếu bạn có thể sử dụng ECMAScript 6, bạn có Object.is:

return Object.is(obj, NaN); 

Nếu không, đây là một lựa chọn, từ mã nguồn của underscore.js:

// Is the given value `NaN`? 
_.isNaN = function(obj) { 
    // `NaN` is the only value for which `===` is not reflexive. 
    return obj !== obj; 
}; 

Cũng lưu ý của họ cho rằng chức năng:

Lưu ý: điều này không giống với hàm isNaN gốc, cũng sẽ trả về true nếu biến không xác định.

+0

'isNaN ('0') === false', trong khi' _.isNaN ('0') 'là đúng. –

+0

'isNaN ('as')' là 'true', nhưng' _.isNaN ('as') 'là' false'. –

+0

@RobW Trong cái gì? Đó là một lỗi cho mỗi spec. Theo spec, điều duy nhất không hoàn toàn bằng chính nó là NaN. – gsnedders

1

Chuyển đổi các đầu vào cho một số, và kiểm tra xem các phép trừ không phải là zero:

var x = 'value'; 
var is_NaN = +x - x !== 0; // The + is actually not needed, but added to show 
          // that a number conversion is made. 
+0

Còn về 'x = Infinity' thì sao? – Kobi

+0

@Kobi: 'Infinity-Infinity' là' NaN' :-P –

+1

@Kobi 'isNaN (Vô cực)' trả về 'false' và phương thức của tôi trả về true. Infinity không phải là [số thực] (https://secure.wikimedia.org/wikipedia/en/wiki/Real_number), vì vậy tôi tin rằng việc triển khai của tôi tốt hơn (cảm thấy tự do để tranh cãi với tôi). –

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