Làm thế nào để bạn kiểm tra xem một số là NaN trong JavaScript?


415

Tôi mới chỉ thử nó trong bảng điều khiển JavaScript của Firefox, nhưng cả hai câu sau đây đều không đúng:

parseFloat('geoff') == NaN;

parseFloat('geoff') == Number.NaN;

5
đáng đọc nếu mục tiêu thực tế của bạn là kiểm tra các con số: stackoverflow.com/questions/18082/iêu
Paul


1
@Gothdo: chắc chắn, nhưng tôi đã hỏi làm thế nào để kiểm tra xem một số có phải là NaN, trái với bất kỳ giá trị nào không.
Paul D. Chờ

3
@ PaulD.Waite Có, nhưng rất nhiều người đến đây khi Google làm một cái gì đó như "làm thế nào để kiểm tra xem một biến có phải là nan trong javascript không".
Michał Perłakowski

PaulD.Waite tôi đồng ý với bạn, nhưng tôi có cùng mối quan tâm như @Gothdo có. Nhiều người đặt câu hỏi này với ý định là "Cách kiểm tra xem giá trị trong JS có phải là NaN không". Bạn có thể kiểm tra nhận xét của mjohnsonengr trên cùng một câu trả lời . BTW, tôi cũng đã gắn cờ Câu hỏi này cho người điều hành chú ý.
dopeddude

Câu trả lời:


582

Hãy thử mã này:

isNaN(parseFloat("geoff"))

Để kiểm tra xem giá trị nào là NaN hay không, thay vì chỉ các số, xem tại đây: Làm thế nào để bạn kiểm tra NaN trong Javascript?


8
Có cần paseFloat không?
rahul

23
Nếu bạn muốn một chuỗi rỗng được hiểu là NaN, thì có. (Tôi không nói bạn sẽ luôn như vậy.)
Paul D. Waite

1
Nếu tôi là bạn, tôi sẽ gán nó cho một biến và, sử dụng biến điều kiện! == biến. Như được trình bày trong thông số kỹ thuật tc39.github.io/ecma262/#sec-isnan-number
ám chỉ

3
isNaN(parseFloat("geoff")) // true isNaN(parseFloat("10geo")) // false Cái này hữu ích như thế nào?
Prashanth

Điều này cũng có thể hữu ích khi dùng thử w3schools.com/jsref/jsref_isnan.asp
Srijan Chaudhary

146

Tôi vừa bắt gặp kỹ thuật này trong cuốn sách JavaScript hiệu quả khá đơn giản:

Vì NaN là giá trị JavaScript duy nhất được coi là không bằng nhau, nên bạn luôn có thể kiểm tra xem giá trị đó có phải là NaN hay không bằng cách kiểm tra xem nó có bằng nhau không:

var a = NaN;
a !== a; // true 

var b = "foo";
b !== b; // false 

var c = undefined; 
c !== c; // false

var d = {};
d !== d; // false

var e = { valueOf: "foo" }; 
e !== e; // false

Không nhận ra điều này cho đến khi @allsyed nhận xét, nhưng đây là trong thông số ECMA: https://tc39.github.io/ecma262/#sec-isnan-number


27
Hiệu quả nhưng phản trực giác. Tôi sẽ không muốn duy trì loại mã này.
osa

35
Đó không phải là mã trái với trực giác, đó là NaN.
Jazzy

20
@DanM Đây không phải là lỗi, đó là hành vi IEE754 tiêu chuẩn của NaN. Đó là cách nó được triển khai trong CPU và đó là hành vi được mong đợi trong mọi ngôn ngữ lập trình trên thế giới sử dụng phao.
Tarmil

4
@Tarmil Ghi chú đúng! Điều đó thực sự rất thú vị; Tôi luôn nghĩ rằng sự bất bình đẳng của NaN là một điều Javascript.
Dan M

2
NaN === Nan; // sai. Đây là một lỗi đã biết trong javascript. isNan là một phương thức mới.
atilkan

52

Sử dụng mã này:

isNaN('geoff');

Xem isNaN()tài liệu trên MDN .

alert ( isNaN('abcd'));  // alerts true
alert ( isNaN('2.0'));  // alerts false
alert ( isNaN(2.0));  // alerts false

1
Có thể đó chỉ là tôi, nhưng ý tưởng về NaN trở nên khó hiểu khi var value = 0/0;var value2= String("123 131");tạo ra các giá trị NaN và một cái gì đó như thế này var value3 = "abcd";cũng là một giá trị NaN.
Nick Pineda

@NickPineda Tại sao?
Sinjai

44

Theo như một giá trị của Số loại sẽ được kiểm tra xem nó có phải là một NaNhay không, hàm toàn cục isNaNsẽ thực hiện công việc

isNaN(any-Number);

Đối với một cách tiếp cận chung hoạt động cho tất cả các loại trong JS, chúng ta có thể sử dụng bất kỳ cách nào sau đây:

Đối với người dùng ECMAScript-5:

#1
if(x !== x) {
    console.info('x is NaN.');
}
else {
    console.info('x is NOT a NaN.');
}

Đối với những người sử dụng ECMAScript-6:

#2
Number.isNaN(x);

Và vì mục đích thống nhất trên cả ECMAScript 5 & 6, chúng tôi cũng có thể sử dụng polyfill này cho Number.isNan

#3
//Polyfill from MDN
Number.isNaN = Number.isNaN || function(value) {
    return typeof value === "number" && isNaN(value);
}
// Or
Number.isNaN = Number.isNaN || function(value) {     
    return value !== value;
}

vui lòng kiểm tra Câu trả lời này để biết thêm chi tiết.


6
Cảm ơn bạn không chỉ sử dụng "isNan ()" mà còn cung cấp câu trả lời hoàn toàn chi tiết. Đây là chính xác những gì tôi đang tìm kiếm khi tôi tìm thấy câu hỏi này trên Google.
mjohnsonengr

1
".... đã đưa ra kết quả sai cho các trường hợp trên" Tôi sẽ không nói sai, chỉ khác, bởi vì toàn cầu isNaNchuyển đổi đối số thành giá trị số trước.
Felix Kling

1
@FelixKling Vui lòng kiểm tra câu trả lời cập nhật. Cảm ơn.
dopeddude

1
isNaN ("lorem ipsum"); // đúng với ES5 đã thổi bay tâm trí của tôi
Nick Pineda

2
@NickPineda Cảm giác rất tương hỗ, nhưng cuối cùng MDN có thể giải thích theo cách này "Khi đối số cho hàm isNaN không phải là kiểu Số, giá trị đầu tiên được ép buộc thành Số. Giá trị kết quả sau đó được kiểm tra để xác định xem nó có phải là không. NaN. "
dopeddude

16

NaN là một giá trị đặc biệt không thể được kiểm tra như thế. Một điều thú vị tôi chỉ muốn chia sẻ là

var nanValue = NaN;
if(nanValue !== nanValue) // Returns true!
    alert('nanValue is NaN');

Lợi nhuận này có đúng không chỉ cho các giá trị NaN và là một cách an toàn của thử nghiệm. Chắc chắn nên được bọc trong một hàm hoặc ít nhất là nhận xét, bởi vì nó không có ý nghĩa rõ ràng để kiểm tra nếu cùng một biến không bằng nhau, hehe.


1
Đó không phải là một cách hoàn toàn đáng tin cậy. Theo thông số kỹ thuật. biến! == biến là cách đáng tin cậy nhất để kiểm tra NaN
ám chỉ

1
Xem câu trả lời của tôi ở trên về điều này ^
Jazzy

14

Bạn nên sử dụng isNaN(value)lệnh gọi hàm toàn cục , bởi vì:

  • Nó được hỗ trợ nhiều trình duyệt
  • Xem isNaN để biết tài liệu

Ví dụ:

 isNaN('geoff'); // true
 isNaN('3'); // false

Tôi hy vọng điều này sẽ giúp bạn.


1
Vâng, isNaN('') //falsenhưng parseInt('') //NaN. Điều tương tự có thể được nói cho null.
Chim cánh cụt im lặng

13

Kể từ ES6 , Object.is(..)là một tiện ích mới có thể được sử dụng để kiểm tra hai giá trị cho sự bình đẳng tuyệt đối:

var a = 3 / 'bar';
Object.is(a, NaN); // true


9

Để khắc phục sự cố '1.2geoff'trở thành phân tích cú pháp, chỉ cần sử dụng Number()trình phân tích cú pháp thay thế.

Vì vậy, thay vì điều này:

parseFloat('1.2geoff'); // => 1.2
isNaN(parseFloat('1.2geoff')); // => false
isNaN(parseFloat('.2geoff')); // => false
isNaN(parseFloat('geoff')); // => true

Làm cái này:

Number('1.2geoff'); // => NaN
isNaN(Number('1.2geoff')); // => true
isNaN(Number('.2geoff')); // => true
isNaN(Number('geoff')); // => true

EDIT: Tôi chỉ nhận thấy một vấn đề khác từ điều này mặc dù ... các giá trị sai (và đúng như một boolean thực) được chuyển Number()trở lại như 0! Trong trường hợp đó ... parseFloat hoạt động mọi lúc thay thế. Vì vậy, rơi trở lại đó:

function definitelyNaN (val) {
    return isNaN(val && val !== true ? Number(val) : parseFloat(val));
}

Và dường như tất cả mọi thứ. Tôi đã điểm chuẩn nó chậm hơn 90% so với lodash _.isNaNnhưng sau đó người ta không bao gồm tất cả các NaN:

http://jsperf.com/own-isnan-vs-underscore-lodash-is Nam

Nói rõ hơn, tôi quan tâm đến cách giải thích theo nghĩa đen của con người về một thứ gì đó là "Không phải là Số" và lodash sẽ quan tâm đến việc giải thích theo nghĩa đen của máy tính về việc kiểm tra xem có thứ gì là "NaN" hay không.


7

Trong khi câu trả lời của @chiborg là chính xác, có nhiều điều cần lưu ý hơn:

parseFloat('1.2geoff'); // => 1.2
isNaN(parseFloat('1.2geoff')); // => false
isNaN(parseFloat('.2geoff')); // => false
isNaN(parseFloat('geoff')); // => true

Điểm là, nếu bạn đang sử dụng phương pháp này để xác nhận đầu vào, kết quả sẽ khá tự do.

Vì vậy, có, bạn có thể sử dụng parseFloat(string)(hoặc trong trường hợp số đầy đủ parseInt(string, radix)'và sau đó bọc nó lại isNaN(), nhưng lưu ý đến gotcha với các số được đan xen với các ký tự không phải là số.


1
Hấp dẫn. Có cách nào để chống lại điều này và phát hiện ra rằng "1.2geoff" không thực sự là một chuỗi số hợp lệ?
Gabe Halsmer

2
Lưu ý rằng điều này chỉ xảy ra khi chuỗi bắt đầu bằng một số. parseFloat('test1.2')sẽ trở lại NaN.
Eduard Luca

6

Giải pháp đơn giản!

THẬT SỰ siêu đơn giản! Đây! Có phương pháp này!

function isReallyNaN(a) { return a !== a; };

Sử dụng đơn giản như:

if (!isReallyNaN(value)) { return doingStuff; }

Xem kiểm tra hiệu suấthere bằng cách sử dụng func vs.selected answer

Ngoài ra: Xem ví dụ dưới đây cho một vài triển khai thay thế.


Thí dụ:

function isReallyNaN(a) { return a !== a; };

var example = {
    'NaN': NaN,
    'an empty Objet': {},
    'a parse to NaN': parseFloat('$5.32'),
    'a non-empty Objet': { a: 1, b: 2 },
    'an empty Array': [],
    'a semi-passed parse': parseInt('5a5'),
    'a non-empty Array': [ 'a', 'b', 'c' ],
    'Math to NaN': Math.log(-1),
    'an undefined object': undefined
  }

for (x in example) {
    var answer = isReallyNaN(example[x]),
        strAnswer = answer.toString();
    $("table").append($("<tr />", { "class": strAnswer }).append($("<th />", {
        html: x
    }), $("<td />", {
        html: strAnswer
    })))
};
table { border-collapse: collapse; }
th, td { border: 1px solid; padding: 2px 5px; }
.true { color: red; }
.false { color: green; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<table></table>

Có một vài con đường thay thế mà bạn thực hiện để triển khai, nếu bạn không muốn sử dụng một phương thức được đặt tên thay thế và muốn đảm bảo nó có sẵn trên toàn cầu. Cảnh báo Những giải pháp này liên quan đến việc thay đổi các đối tượng bản địa và có thể không phải là giải pháp tốt nhất của bạn. Luôn luôn thận trọng và lưu ý rằng các Thư viện khác mà bạn có thể sử dụng có thể phụ thuộc vào mã gốc hoặc các thay đổi tương tự.

Thực hiện thay thế 1: Thay thế isNaNphương pháp bản địa .

//  Extremely simple. Just simply write the method.
window.isNaN = function(a) { return a !==a; }

Thực hiện thay thế 2: Nối vào đối tượng số
* Được đề xuất vì đây cũng là phần đa điền cho ECMA 5 đến 6

Number['isNaN'] || (Number.isNaN = function(a) { return a !== a });
//  Use as simple as
Number.isNaN(NaN)

Kiểm tra giải pháp thay thế nếu trống

Một phương thức cửa sổ đơn giản tôi đã viết bài kiểm tra đó nếu đối tượng là rỗng . Có một chút khác biệt ở chỗ nó không cung cấp nếu vật phẩm là "chính xác" NaN , nhưng tôi đoán rằng tôi sẽ ném nó lên vì nó cũng có thể hữu ích khi tìm kiếm các mặt hàng trống.

/** isEmpty(varried)
 *  Simple method for testing if item is "empty"
 **/
;(function() {
   function isEmpty(a) { return (!a || 0 >= a) || ("object" == typeof a && /\{\}|\[(null(,)*)*\]/.test(JSON.stringify(a))); };
   window.hasOwnProperty("empty")||(window.empty=isEmpty);
})();

Thí dụ:


Kiểm tra cực sâu nếu trống

Cái cuối cùng này đi sâu một chút, thậm chí kiểm tra xem một Object có đầy các Object trống không. Tôi chắc chắn rằng nó có chỗ để cải thiện và có thể có hố, nhưng cho đến nay, nó dường như bắt được hầu hết mọi thứ.


1
@ PaulD.Waite có thể là ứng dụng này, nhưng tôi không thấy câu trả lời được chấp nhận. Trên thực tế, tôi chỉ thấy khoảng 5 câu trả lời, nhưng tôi thấy nó nói rằng có 15
SpYk3HH

1
Bạn đang sử dụng ứng dụng nào?
Paul D. Chờ

2
@ PaulD.Waite SE cho android. trên galaxy s3
SpYk3HH

1
Aha. Tôi không có ứng dụng để tự tìm kiếm, nhưng đây là một liên kết đến câu trả lời được chấp nhận: stackoverflow.com/a/2652335/20578
Paul D. Waite

@ PaulD.Waite Ah, tôi hiểu rồi. Tôi cho rằng, trong câu trả lời trực tiếp chỉ cho câu hỏi trong chính nó, câu trả lời đó có thể đủ. Tôi đã đăng câu trả lời của mình lên một câu hỏi khác liên quan đến "Cách JS để kiểm tra xem có thực sự là" NaN "hay không, vì isNaNKHÔNG đáng tin cậy. Tôi đã được nhận xét ở đó và nói câu hỏi này sẽ phù hợp hơn với câu trả lời của tôi, do đó di chuyển nó ở đây. Đơn giản chỉ cần đưa một cái gì đó hữu ích / hữu ích ra khỏi vấn đề này sẽ xuất hiện trên một tìm kiếm của Google về vấn đề này is it NaN?. Về mặt lưu ý, câu trả lời của tôi sẽ hiệu quả hơn thường xuyên hơn câu trả lời được chọn.
SpYk3HH

5

Tôi chỉ muốn chia sẻ một lựa chọn khác, nó không nhất thiết phải tốt hơn những người khác ở đây, nhưng tôi nghĩ rằng nó đáng để xem xét:

function customIsNaN(x) { return (typeof x == 'number' && x != 0 && !x); }

Logic đằng sau điều này là mọi số ngoại trừ 0NaNđược chuyển sang true.

Tôi đã thực hiện một bài kiểm tra nhanh, và nó hoạt động tốt Number.isNaNnhư kiểm tra chính nó là sai. Cả ba hoạt động tốt hơnisNan

Kết quả

customIsNaN(NaN);            // true
customIsNaN(0/0);            // true
customIsNaN(+new Date('?')); // true

customIsNaN(0);          // false
customIsNaN(false);      // false
customIsNaN(null);       // false
customIsNaN(undefined);  // false
customIsNaN({});         // false
customIsNaN('');         // false

Có thể trở nên hữu ích nếu bạn muốn tránh các isNaNchức năng bị hỏng .


5

Nếu môi trường của bạn hỗ trợ ECMAScript 2015 , thì bạn có thể muốn sử dụng Number.isNaNđể đảm bảo rằng giá trị đó thực sự NaN.

Vấn đề với isNaNlà, nếu bạn sử dụng điều đó với dữ liệu không phải là số, sẽ có một vài quy tắc khó hiểu (theo MDN) được áp dụng. Ví dụ,

isNaN(NaN);       // true
isNaN(undefined); // true
isNaN({});        // true

Vì vậy, trong các môi trường được hỗ trợ ECMA Script 2015, bạn có thể muốn sử dụng

Number.isNaN(parseFloat('geoff'))

7
Môi trường của tôi chỉ hỗ trợ ECMAScript XP Home Edition :(
Paul D. Chờ

1
@ PaulD.Waite (Tôi hy vọng bạn có nghĩa là IE 6: D) Không có vấn đề :-) Chỉ cần nhớ rằng isNaNcó thể giúp bạn gặp rắc rối và ghi nhớ để sử dụng Number.isNaNtrong ECMAScript 2015 môi trường :-)
thefourtheye

5

NaN trong JavaScript là viết tắt của "Không phải là Số", mặc dù loại của nó thực sự là số.

typeof(NaN) // "number"

Để kiểm tra xem một biến có giá trị NaN hay không, chúng ta không thể đơn giản sử dụng hàm isNaN (), vì isNaN () có vấn đề sau, xem bên dưới:

var myVar = "A";
isNaN(myVar) // true, although "A" is not really of value NaN

Điều thực sự xảy ra ở đây là myVar hoàn toàn bị ép buộc vào một số:

var myVar = "A";
isNaN(Number(myVar)) // true. Number(myVar) is NaN here in fact

Nó thực sự có ý nghĩa, bởi vì "A" thực sự không phải là một con số. Nhưng những gì chúng tôi thực sự muốn kiểm tra là nếu myVar chính xác có giá trị NaN.

Vì vậy, isNaN () không thể giúp đỡ. Vậy thì chúng ta nên làm gì thay thế?

Trong trường hợp NaN là giá trị JavaScript duy nhất được đối xử không bằng chính nó, vì vậy chúng ta có thể kiểm tra sự bằng nhau của chính nó bằng cách sử dụng! ==

var myVar; // undefined
myVar !== myVar // false

var myVar = "A";
myVar !== myVar // false

var myVar = NaN
myVar !== myVar // true

Vì vậy, để kết luận , nếu đúng là một biến! == chính nó, thì biến này chính xác là giá trị NaN:

function isOfValueNaN(v) {
    return v !== v;
}

var myVar = "A";
isNaN(myVar); // true
isOfValueNaN(myVar); // false

4

Tôi sử dụng chức năng gạch dướiisNaN bởi vì trong JavaScript:

isNaN(undefined) 
-> true

Ít nhất, hãy chú ý đến gotcha đó.


10
Tôi bối rối. Tại sao isNaN trở lại đúng khi được thông qua undefinedlà hành vi không chính xác? Đó là sự thật undefinedkhông phải là một con số, phải không?
Xaxis

3
@Xaxis NaN không nên được coi là tương đương với không xác định, chúng đều là các giá trị đặc biệt với ý nghĩa cụ thể và khác nhau . Hãy xem xét điều này: Tôi có một giá trị nhưng tôi không nói nó là gì, có thể đó là một con số và có thể, tuy nhiên, theo quan điểm của bạn, nó không được xác định.
Corin

1
@Corin undefinedcó thể là một cái gì đó khác với NaN, tuy nhiên nó vẫn không phải là một con số isNaN(undefined)nên (và là)true
neuhaus

4

Có lẽ cũng thế này:

function isNaNCustom(value){
    return value.toString() === 'NaN' && 
           typeof value !== 'string' && 
           typeof value === 'number'
}

3

Có vẻ như isNaN () không được hỗ trợ trong Node.js.
Tôi đã làm việc xung quanh với

var value = 1;
if (parseFloat(stringValue)+"" !== "NaN") value = parseFloat(stringValue);

Chắc chắn, nhưng tôi đã không hỏi về Node.js.
Paul D. Chờ



2

Quy tắc là:

NaN != NaN

Vấn đề của hàm isNaN () là nó có thể trả về kết quả không mong muốn trong một số trường hợp:

isNaN('Hello')      //true
isNaN('2005/12/12') //true
isNaN(undefined)    //true
isNaN('NaN')        //true
isNaN(NaN)          //true
isNaN(0 / 0)        //true

Cách tốt hơn để kiểm tra xem giá trị có thực sự là NaN hay không là:

function is_nan(value) {
    return value != value
}

is_nan(parseFloat("geoff"))

1

Theo IEEE 754, tất cả các mối quan hệ liên quan đến NaN đều đánh giá là sai ngoại trừ! =. Do đó, ví dụ: (A> = B) = false và (A <= B) = false nếu A hoặc B hoặc cả hai là / là NaN.


1

Tôi đã viết câu trả lời này cho một câu hỏi khác trên StackOverflow khi một lần kiểm tra khác NaN == nullnhưng sau đó nó được đánh dấu là trùng lặp vì vậy tôi không muốn lãng phí công việc của mình.

Nhìn vào Mozilla Developer Network về NaN.


Câu trả lời ngắn

Chỉ sử dụng distance || 0khi bạn muốn chắc chắn rằng giá trị của bạn là một con số thích hợp hoặcisNaN() để kiểm tra nó.

Câu trả lời dài

NaN (Not-a-Number) là một đối tượng toàn cầu kỳ lạ trong javascript thường được trả về khi một số thao tác toán học thất bại.

Bạn muốn kiểm tra xem NaN == nullkết quả nào false. Hovewer thậm chí NaN == NaNkết quả vớifalse .

Một cách đơn giản để tìm hiểu xem biến NaNlà một hàm toàn cụcisNaN() .

Một điều khác x !== xchỉ đúng khi x là NaN. (cảm ơn đã nhắc nhở @ raphael-schweikert)

Nhưng tại sao câu trả lời ngắn làm việc?

Hãy cùng tìm hiểu.

Khi bạn gọi NaN == falsekết quả là false, cùng vớiNaN == true .

Ở đâu đó trong thông số kỹ thuật JavaScript có một bản ghi luôn có các giá trị sai, bao gồm:

  • NaN - Không phải là một con số
  • "" - chuỗi rỗng
  • false - sai
  • null - đối tượng null
  • undefined - các biến không xác định
  • 0 - số 0, bao gồm +0 và -0

1
Chỉ có cách đơn giản để tìm hiểu xem biến là NaN có phải là hàm toàn cầu isNaN () không - đúng; có một cách đơn giản khác: var xIsNaN = x !== x;Điều này chỉ mang lại đúng nếu x là NaN.
Raphael Schweikert

1

Một giải pháp khác được đề cập trong trang parseFloat của MDN

Nó cung cấp một chức năng lọc để phân tích cú pháp nghiêm ngặt

var filterFloat = function (value) {
    if(/^(\-|\+)?([0-9]+(\.[0-9]+)?|Infinity)$/
      .test(value))
      return Number(value);
  return NaN;
}


console.log(filterFloat('421'));               // 421
console.log(filterFloat('-421'));              // -421
console.log(filterFloat('+421'));              // 421
console.log(filterFloat('Infinity'));          // Infinity
console.log(filterFloat('1.61803398875'));     // 1.61803398875
console.log(filterFloat('421e+0'));            // NaN
console.log(filterFloat('421hop'));            // NaN
console.log(filterFloat('hop1.61803398875'));  // NaN

Và sau đó bạn có thể sử dụng isNaNđể kiểm tra nếu nó làNaN


1

Cách chính xác để kiểm tra là:

//takes care of boolen, undefined and empty

isNaN(x) || typeof(x) ==='boolean' || typeof(x) !=='undefined' || x!=='' ? 'is really a nan' : 'is a number'

1

Tôi đã tạo ra chức năng nhỏ này hoạt động như một bùa mê. Thay vì kiểm tra NaN có vẻ phản trực giác, bạn kiểm tra một số. Tôi khá chắc chắn rằng tôi không phải là người đầu tiên làm theo cách này, nhưng tôi nghĩ tôi sẽ chia sẻ.

function isNum(val){
    var absVal = Math.abs(val);
    var retval = false;
    if((absVal-absVal) == 0){
        retval = true
    }

    return retval;
}

1

Tìm cách khác, chỉ để cho vui.

function IsActuallyNaN(obj) {
  return [obj].includes(NaN);  
}

1

Câu trả lời của marksyzm hoạt động tốt, nhưng nó không trả về sai Infinityvì Infinity thực sự không phải là một con số.

tôi đã đưa ra một isNumberchức năng sẽ kiểm tra nếu nó là một số.

function isNumber(i) {
    return !isNaN(i && i !== true ? Number(i) : parseFloat(i)) && [Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY].indexOf(i) === -1;
}

console.log(isNumber(Infinity));
console.log(isNumber("asdf"));
console.log(isNumber(1.4));
console.log(isNumber(NaN));
console.log(isNumber(Number.MAX_VALUE));
console.log(isNumber("1.68"));

CẬP NHẬT: tôi nhận thấy rằng mã này thất bại đối với một số tham số, vì vậy tôi đã làm cho nó tốt hơn.

function isNumber(i) {//function for checking if parameter is number
if(!arguments.length) {
throw new SyntaxError("not enough arguments.");
	} else if(arguments.length > 1) {
throw new SyntaxError("too many arguments.");
	} else if([Number.NEGATIVE_INFINITY, Number.POSITIVE_INFINITY].indexOf(i) !== -1) {
throw new RangeError("number cannot be \xB1infinity.");
	} else if(typeof i === "object" && !(i instanceof RegExp) && !(i instanceof Number) && !(i === null)) {
throw new TypeError("parameter cannot be object/array.");
	} else if(i instanceof RegExp) {
throw new TypeError("parameter cannot be RegExp.");
	} else if(i == null || i === undefined) {
throw new ReferenceError("parameter is null or undefined.");
	} else {
return !isNaN(i && i !== true ? Number(i) : parseFloat(i)) && (i === i);
	}
}
console.log(isNumber(Infinity));
console.log(isNumber(this));
console.log(isNumber(/./ig));
console.log(isNumber(null));


Tiền đề của bạn là vô hạn về mặt kỹ thuật, không phải là một con số thiếu sót về mặt kỹ thuật: math.stackexchange.com/questions/36289/is-infinity-a-number . Từ việc tôi đọc các câu trả lời là vô hạn là một con số phụ thuộc vào ngữ cảnh.
Jon P

Tôi sẽ chuyển câu hỏi này sang câu hỏi khác
adddff

1
alert("1234567890.".indexOf(String.fromCharCode(mycharacter))>-1);

Đây không phải là thanh lịch. nhưng sau khi thử isNAN () tôi đã tìm đến giải pháp này, một giải pháp khác. Trong ví dụ này tôi cũng cho phép '.' bởi vì tôi đang đắp mặt nạ cho phao. Bạn cũng có thể đảo ngược điều này để đảm bảo không có số nào được sử dụng.

("1234567890".indexOf(String.fromCharCode(mycharacter))==-1)

Đây là một đánh giá ký tự đơn nhưng bạn cũng có thể lặp qua một chuỗi để kiểm tra bất kỳ số nào.


1

Bạn có thể kiểm tra NaN bằng chức năng javascript isNaN. Chỉ cần chuyển số hoặc giá trị cho hàm isNaN

isNaN(123) //false
isNaN(-1.23) //false
isNaN(5-2) //false
isNaN(0) //false
isNaN('123') //false
isNaN('Hello') //true
isNaN('2005/12/12') //true
isNaN('') //false
isNaN(true) //false
isNaN(undefined) //true
isNaN('NaN') //true
isNaN(NaN) //true
isNaN(0 / 0) //true

0

Chỉ cần chuyển đổi kết quả thành Chuỗi và so sánh với 'NaN'.

var val = Number("test");
if(String(val) === 'NaN') {
   console.log("true");
}

0

(NaN> = 0) ? ...... " Tôi không biết ".

function IsNotNumber( i ){
    if( i >= 0 ){ return false; }
    if( i <= 0 ){ return false; }
    return true;
}

Điều kiện chỉ thực hiện nếu THẬT .

Không phải trên FALSE .

Không phải trên " Tôi không biết ".


không hữu ích lắm nếu bạn tìm kiếm một cách rõ ràng các giá trị NaN mà tôi đang tìm kiếm điều ngược lại
liviu blidar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.