2011-08-08 42 views
38
parseFloat("NaN") 

lợi nhuận "NaN", nhưngNaN có bằng NaN không?

parseFloat("NaN") == "NaN" 

lợi nhuận sai. Bây giờ, đó có thể là một điều tốt mà nó trở lại sai, nhưng tôi không hiểu làm thế nào điều này là như vậy. Người sáng tạo JavaScript có tạo ra trường hợp đặc biệt này không? Bởi vì nếu không thì tôi không thể hiểu được điều này trả về sai lầm như thế nào.

+14

Một NaN không bao giờ bằng chính nó, theo định nghĩa. Nó hoạt động theo cách này bằng bất kỳ ngôn ngữ nào. – Keith

+0

Lưu ý [câu trả lời của tôi dưới đây] (http://stackoverflow.com/a/12628417/1195056) là một phương pháp chính xác để kiểm tra điều này đã được thêm vào với ECMAScript 6. – krillgar

+0

Phần tốt nhất của sự kiện là 'parseFloat (" A ") == parseFloat ("A") 'return' false' –

Trả lời

31

Khi hàm JavaScript trả về NaN, đây không phải là chuỗi chữ mà là thuộc tính đối tượng trong không gian chung. Bạn không thể so sánh nó với chuỗi "NaN".

Xem https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/NaN

+17

NaN không phải là một đối tượng; nó là một giá trị nguyên thủy đặc biệt. (Điều này xảy ra là giá trị của một thuộc tính chỉ đọc _of_ đối tượng toàn cục). –

+0

@Henning Tốt bắt, cố định câu trả lời của tôi – Phil

30

Đó là một trường hợp đặc biệt, NaN là điều duy nhất trong Javascript không bằng chính nó.

Mặc dù các câu trả lời khác về chuỗi so với đối tượng NaN cũng đúng.

+1

Tại sao sau đó "NaN" == "NaN" trả về đúng? Nó có lẽ sẽ không có ý nghĩa cho rằng để trả về false, nhưng ... – joseph

+26

@joseph "NaN" == "NaN" là so sánh hai (bằng) chuỗi. – dlev

8
  • Khi Number (được trả về bởi parseFloat) so sánh với stringstring chuyển đổi sang Number
  • NaN không bằng bất kỳ đối tượng khác (bao gồm NaN)

Bạn nhận được NaN==NaN. Nó là sai bởi quy tắc thứ hai.

28

Cập nhật 2

mới để ECMAScript 6 là Object.is() chức năng. Điều này được thiết kế để tăng cường hơn nữa kiểm tra ===. Một trong những lợi ích của chức năng mới này là Object.is(NaN, NaN) giờ đây sẽ trả về giá trị true. Nếu bạn là able to utilize ECMAScript 6, thì đây sẽ là giải pháp dễ đọc nhất và phù hợp nhất cho bạn.

gốc

Cách thích hợp để kiểm tra này sẽ là:

isNaN(parseInt(variable)) 

Nếu bất cứ điều gì bạn đang kiểm tra là một NaN, chức năng đó sẽ trở thành sự thật. Phương pháp này được tích hợp vào thông số JavaScript.

Sử dụng jQuery

jQuery xây dựng trong isNaN chức năng riêng của họ ban đầu để giúp đối phó với một số khác biệt giữa các trình duyệt, và thêm một số kiểm tra bổ sung để phiên bản của họ có thể được sử dụng thay cho một trong VanillaJS.

Cập nhật cho jQuery

Sau jQuery 1.7, họ đã thay đổi chức năng này để $.isNumeric().

Documentation of the switch

Nếu bạn có một cái nhìn tại this Stack Overflow question, bạn sẽ tìm thấy nhiều lần, nơi isNaN() lợi nhuận gì trực giác sẽ được coi là một câu trả lời "không chính xác", nhưng là chính xác bởi spec.

Một trong những lý do chính để tránh vanilla isNaN()null sẽ trả về false, khiến bạn nghĩ đó là một con số. Tuy nhiên, hàm jQuery bao hàm phạm vi kết quả trực quan lớn hơn nhiều.

Từ tài liệu của họ:

Tính đến jQuery 3.0 $ .isNumeric() trả về true chỉ nếu đối số là số loại, hoặc nếu đó là kiểu string và nó có thể bị cưỡng chế vào số hữu hạn . Trong tất cả các trường hợp khác, nó trả về false.

+12

Điều này không liên quan gì đến jQuery. Gì? – user1596138

+0

Chỉ vì jQuery đã thay đổi chức năng mà chúng đang sử dụng không có nghĩa là bạn phải sử dụng. –

9

NaN là một trong số ít ví dụ về một đối tượng không bằng chính nó. Trong thực tế, bất động sản rất này được sử dụng để thực hiện phổ biến bool IsNaN(number) phương pháp:

function isNaN(x) 
{ 
    return x != x; 
} 
+4

vui vẻ * javascript * –

+3

Thay đổi ví dụ từ C# thành JavaScript. –

+1

"vài ví dụ"? có cái nào khác không? Nếu vậy việc triển khai này không thành công trên các ví dụ khác. – djechlin

4

isNaN công trình cho tất cả các giá trị mà không phải là số

isNaN('foo') == true 
isNaN(NaN) == true 
isNaN(12) == false 
isNaN([1,2,3]) == true 

Tuy nhiên nếu bạn muốn kiểm tra cho NaN cụ thể, hoặc tránh ép buộc loại;
bạn có thể sử dụng thay vì Number.isNaN

Number.isNaN('foo') == false 
Number.isNaN(NaN) == true 
Number.isNaN(12) == false 
Number.isNaN([1,2,3]) == false 
1

Trong ECMAScript 6 Object.is() là sự tăng cường của ===. Phương thức này chấp nhận hai đối số và trả về true nếu các giá trị tương đương. Và hai giá trị được coi là tương đương khi chúng có cùng loại và có cùng giá trị. Đó là lý do vì console.log (Object.is (NaN, NaN)) -> TRUE

0

Tôi đang làm việc với Google Apps Script và vì vậy tôi bị kẹt với ECMA 5. Tương tự như câu trả lời của Coffee Coffee, đây là những gì tôi đã có thể hình dung ra rằng dường như cung cấp một câu trả lời chắc chắn là có hay không phải là một giá trị thực sự là NaN, không nếu một giá trị là NaN nhưng nếu nó thực sự là NaN bản thân:

function isThisNaN(x) 
{ 
    return isNaN(x) && Object.prototype.toString.call(x) === '[object Number]'; 
} 
console.log(isThisNaN(NaN)); // true 

lol Chỉ cần hài hước với tôi rằng Object.prototype.toString.call(NaN) bằng '[object Number]'. Bộ não mới của tôi nói với tôi rằng NaN là "Không phải là số" nhưng đáng buồn là nó không đơn giản như vậy.

EDIT: Tôi đoán tôi nên nói rằng tôi đã kết thúc bài viết này như thế nào. Tôi đi với ý tưởng rằng chắc chắn một chuỗi không chứa một số sẽ không được coi là một số ... tốt, tôi đã kết thúc việc tìm kiếm này ra:

isNaN('a'); // true 
isNaN(' '); // false 

nên mặc dù ' ' là một chuỗi không phải là số, nó dường như được đưa vào một số (0).

console.log(Number(' ')); // 0.0 

tuy nhiên ...

console.log(0 ? true : false); // false 
console.log(' ' ? true : false); // true 

Sau khi đọc tôi càng làm hiểu nó tốt hơn một chút nhưng wow những gì một tinh thần crapstorm cho một newbie lol