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;
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;
Câu trả lời:
Hãy thử mã này:
isNaN(parseFloat("geoff"))
Để kiểm tra xem có 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?
NaN
, thì có. (Tôi không nói bạn sẽ luôn như vậy.)
isNaN(parseFloat("geoff")) // true
isNaN(parseFloat("10geo")) // false
Cái này hữu ích như thế nào?
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
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
var value = 0/0;
và 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.
Theo như một giá trị của Số loại sẽ được kiểm tra xem nó có phải là một NaN
hay không, hàm toàn cục isNaN
sẽ 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.
isNaN
chuyển đổi đối số thành giá trị số trước.
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.
Bạn nên sử dụng isNaN(value)
lệnh gọi hàm toàn cục , bởi vì:
Ví dụ:
isNaN('geoff'); // true
isNaN('3'); // false
Tôi hy vọng điều này sẽ giúp bạn.
isNaN('') //false
nhưng parseInt('') //NaN
. Điều tương tự có thể được nói cho null
.
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
Để 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 _.isNaN
như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.
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ố.
parseFloat('test1.2')
sẽ trở lại NaN
.
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ế.
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ự.
isNaN
phương pháp bản địa .// Extremely simple. Just simply write the method.
window.isNaN = function(a) { return a !==a; }
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);
})();
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ứ.
isNaN
KHÔ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.
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ừ 0
và NaN
đượ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.isNaN
như 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 isNaN
chức năng bị hỏng .
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 isNaN
là, 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'))
isNaN
có thể giúp bạn gặp rắc rối và ghi nhớ để sử dụng Number.isNaN
trong ECMAScript 2015 môi trường :-)
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
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 đó.
undefined
là hành vi không chính xác? Đó là sự thật undefined
không phải là một con số, phải không?
undefined
có 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
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);
function isNotANumber(n) {
if (typeof n !== 'number') {
return true;
}
return n !== n;
}
NaN === NaN; // false
Number.NaN === NaN; // false
isNaN(NaN); // true
isNaN(Number.NaN); // true
Toán tử đẳng thức (== và ===) không thể được sử dụng để kiểm tra giá trị đối với NaN.
Nhìn vào Tài liệu Mozilla Thuộc tính NaN toàn cầu là một giá trị đại diện cho Không-A-Numbe
Cách tốt nhất là sử dụng 'isNaN ()' là hàm buit-in để kiểm tra NaN. Tất cả các trình duyệt hỗ trợ cách ..
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"))
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.
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 == null
như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
.
Chỉ sử dụng distance || 0
khi 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ó.
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 == null
kết quả nào false
. Hovewer thậm chí NaN == NaN
kết quả vớifalse
.
Một cách đơn giản để tìm hiểu xem biến NaN
là một hàm toàn cụcisNaN()
.
Một điều khác x !== x
chỉ đúng khi x là NaN. (cảm ơn đã nhắc nhở @ raphael-schweikert)
Hãy cùng tìm hiểu.
Khi bạn gọi NaN == false
kế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ỗngfalse
- sainull
- đối tượng nullundefined
- các biến không xác định0
- số 0, bao gồm +0 và -0var xIsNaN = x !== x;
Điều này chỉ mang lại đúng nếu x là NaN
.
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
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'
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;
}
Tìm cách khác, chỉ để cho vui.
function IsActuallyNaN(obj) {
return [obj].includes(NaN);
}
Câu trả lời của marksyzm hoạt động tốt, nhưng nó không trả về sai Infinity
vì Infinity thực sự không phải là một con số.
tôi đã đưa ra một isNumber
chứ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));
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.
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
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");
}
Là (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 ".