私はこれをFirefoxのJavaScriptコンソールで試しただけですが、次の文はどちらもtrueを返しません。
parseFloat('geoff') == NaN;
parseFloat('geoff') == Number.NaN;
このコードを試してください:
isNaN(parseFloat("geoff"))
any valueが単なる数字ではなくNaNであるかどうかをチェックするには、こちらを参照してください。 JavascriptでNaNをテストするにはどうしますか?
私はこのテクニックに出会ったばかりの Effective JavaScript それはとても簡単です:
NaNはそれ自体とは異なるものとして扱われる唯一のJavaScript値なので、値がそれ自体と等しいかどうかをチェックすることで、値がNaNであるかどうかを常にテストできます。
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
@allsyedがコメントするまでこれを理解していませんでしたが、これはECMAの仕様に含まれています: https://tc39.github.io/ecma262/#sec-isnan-number
このコードを使用してください:
isNaN('geoff');
MDNの isNaN()
のドキュメントを参照してください 。
alert ( isNaN('abcd')); // alerts true
alert ( isNaN('2.0')); // alerts false
alert ( isNaN(2.0)); // alerts false
タイプ Number の値がNaN
であるかどうかをテストする限り、グローバル関数isNaN
が機能します
isNaN(any-Number);
JSのすべてのタイプで機能する一般的なアプローチでは、次のいずれかを使用できます。
ECMAScript-5ユーザーの場合:
#1
if(x !== x) {
console.info('x is NaN.');
}
else {
console.info('x is NOT a NaN.');
}
ECMAScript-6を使用している場合:
#2
Number.isNaN(x);
ECMAScript 5と6の両方で一貫性を保つために、これも使用できます 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;
}
詳細については This Answer を確認してください。
NaNはそのようにテストできない特別な値です。私がちょうど共有したかった面白いことはこれです
var nanValue = NaN;
if(nanValue !== nanValue) // Returns true!
alert('nanValue is NaN');
これはNaN値に対してtrue only を返します。これは安全なテスト方法です。同じ変数が互いに等しくないかどうかをテストすることは明らかに意味がありません。
グローバルなisNaN(value)
関数呼び出しを使うべきです。
例:
isNaN('geoff'); // true
isNaN('3'); // false
これがお役に立てば幸いです。
ES6 以降、Object.is(..)
は2つの値の絶対等価性をテストするために使用できる新しいユーティリティです。
var a = 3 / 'bar';
Object.is(a, NaN); // true
'1.2geoff'
が解析される問題を修正するには、代わりにNumber()
パーサーを使用してください。
これよりもむしろ:
parseFloat('1.2geoff'); // => 1.2
isNaN(parseFloat('1.2geoff')); // => false
isNaN(parseFloat('.2geoff')); // => false
isNaN(parseFloat('geoff')); // => true
これを行う:
Number('1.2geoff'); // => NaN
isNaN(Number('1.2geoff')); // => true
isNaN(Number('.2geoff')); // => true
isNaN(Number('geoff')); // => true
編集:私はちょうどこれから別の問題に気づいた...偽の値(そして本当のブール値としてtrue)が0
としてreturn Number()
に渡される!その場合は... parseFloatが代わりに毎回動作します。だからそれに頼る:
function definitelyNaN (val) {
return isNaN(val && val !== true ? Number(val) : parseFloat(val));
}
そしてそれは一見すべてをカバーしています。私はそれをlodashの_.isNaN
よりも90%遅い速度でベンチマークしましたが、その場合はすべてのNaNをカバーするわけではありません。
http://jsperf.com/own-isnan-vs-underscore-lodash-isnan
明確にするために、私のものは「数字ではない」ものの人間の文字通りの解釈を引き受け、lodash'sは何かが「NaN」であるかどうかのチェックのコンピュータ文字通りの解釈を引き受けます。
@chiborgの答えはIS正しいですが、注意すべき点が他にもあります。
parseFloat('1.2geoff'); // => 1.2
isNaN(parseFloat('1.2geoff')); // => false
isNaN(parseFloat('.2geoff')); // => false
isNaN(parseFloat('geoff')); // => true
つまり、このメソッドを入力の検証に使用している場合、結果はかなり自由度が高くなります。
ですから、parseFloat(string)
を使うこともできますし(あるいはフルナンバーの場合はparseInt(string, radix)
'、それからそれをisNaN()
でラップすることもできますが、数字以外の文字と絡み合っていることに注意してください。
本当に超シンプル!ここに!この方法があります。
function isReallyNaN(a) { return a !== a; };
と同じくらい簡単に使用します。
if (!isReallyNaN(value)) { return doingStuff; }
パフォーマンステストを見る here この関数を使うvs selected answer
また、いくつかの代替実装については、以下の最初の例を参照してください。
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>
別の名前付きメソッドを使用したくない場合、そしてそれがよりグローバルに利用可能であることを保証したい場合、あなたが実装のためにとる2つの代替パスがあります。 警告これらの解決策はネイティブオブジェクトを変更することを含み、あなたの最善の解決策ではないかもしれません。常に注意を払い、あなたが使用するかもしれない他のライブラリがネイティブコードまたは同様の変更に依存するかもしれないことに注意してください。
isNaN
メソッドを置き換えます。// 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)
代替解 空の場合はテスト
オブジェクトが空であるかどうかをテストする簡単なウィンドウメソッド。 itemが "正確に" NaNであるかどうかがわからないという点で少し異なりますが、空を探すときにも役立つ場合があるので、これをスローします。アイテム.
/** 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);
})();
;(function() {
function isEmpty(a) { return !a || void 0 === a || a !== a || 0 >= a || "object" == typeof a && /\{\}|\[(null(,)*)*\]/.test(JSON.stringify(a)); };
window.hasOwnProperty("empty")||(window.empty=isEmpty);
})();
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': new Array(),
'an empty Array w/ 9 len': new Array(9),
'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 = empty(example[x]),
strAnswer = answer.toString();
$("#t1").append(
$("<tr />", { "class": strAnswer }).append(
$("<th />", { html: x }),
$("<td />", { html: strAnswer.toUpperCase() })
)
)
};
function isReallyNaN(a) { return a !== a; };
for(x in example){var answer=isReallyNaN(example[x]),strAnswer=answer.toString();$("#t2").append($("<tr />",{"class":strAnswer}).append($("<th />",{html:x}),$("<td />",{html:strAnswer.toUpperCase()})))};
table { border-collapse: collapse; float: left; }
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 id="t1"><thead><tr><th colspan="2">isEmpty()</th></tr></thead><thead><tr><th>Value Type</th><th>Bool Return</th></tr></thead></table>
<table id="t2"><thead><tr><th colspan="2">isReallyNaN()</th></tr></thead><thead><tr><th>Value Type</th><th>Bool Return</th></tr></thead></table>
オブジェクトが空白のオブジェクトでいっぱいになっていないかどうかを確認しても、この最後の部分は少し深くなります。私はそれが改善の余地と可能なピットを持っていると確信しています、しかしこれまでのところ、それはほとんどすべてを捉えるように見えます。
function isEmpty(a) {
if (!a || 0 >= a) return !0;
if ("object" == typeof a) {
var b = JSON.stringify(a).replace(/"[^"]*":(0|"0*"|false|null|\{\}|\[(null(,)?)*\]),?/g, '').replace(/"[^"]*":\{\},?/g, '');
if ( /^$|\{\}|\[\]/.test(b) ) return !0;
else if (a instanceof Array) {
b = b.replace(/(0|"0*"|false|null|\{\}|\[(null(,)?)*\]),?/g, '');
if ( /^$|\{\}|\[\]/.test(b) ) return !0;
}
}
return false;
}
window.hasOwnProperty("empty")||(window.empty=isEmpty);
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': new Array(),
'an empty Array w/ 9 len': new Array(9),
'a semi-passed parse': parseInt('5a5'),
'a non-empty Array': [ 'a', 'b', 'c' ],
'Math to NaN': Math.log(-1),
'an undefined object': undefined,
'Object Full of Empty Items': { 1: '', 2: [], 3: {}, 4: false, 5:new Array(3), 6: NaN, 7: null, 8: void 0, 9: 0, 10: '0', 11: { 6: NaN, 7: null, 8: void 0 } },
'Array Full of Empty Items': ["",[],{},false,[null,null,null],null,null,null,0,"0",{"6":null,"7":null}]
}
for (x in example) {
var answer = empty(example[x]),
strAnswer = answer.toString();
$("#t1").append(
$("<tr />", { "class": strAnswer }).append(
$("<th />", { html: x }),
$("<td />", { html: strAnswer.toUpperCase() })
)
)
};
function isReallyNaN(a) { return a !== a; };
for(x in example){var answer=isReallyNaN(example[x]),strAnswer=answer.toString();$("#t2").append($("<tr />",{"class":strAnswer}).append($("<th />",{html:x}),$("<td />",{html:strAnswer.toUpperCase()})))};
table { border-collapse: collapse; float: left; }
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 id="t1"><thead><tr><th colspan="2">isEmpty()</th></tr></thead><thead><tr><th>Value Type</th><th>Bool Return</th></tr></thead></table>
<table id="t2"><thead><tr><th colspan="2">isReallyNaN()</th></tr></thead><thead><tr><th>Value Type</th><th>Bool Return</th></tr></thead></table>
あなたの環境がECMAScript 2015 をサポートしている場合、値が本当にNaN
であることを確認するために Number.isNaN
を使用することをお勧めします。
isNaN
の問題は/です。 数値以外のデータでそれを使用する場合、(MDNによるような)混乱しやすい規則はほとんど適用されません。 例えば、
isNaN(NaN); // true
isNaN(undefined); // true
isNaN({}); // true
そのため、ECMA Script 2015でサポートされている環境では、次のようにします。
Number.isNaN(parseFloat('geoff'))
JavaScriptのNaNは、その型は実際には数値ですが、 "Not A Number"を表します。
typeof(NaN) // "number"
変数の値がNaNであるかどうかを確認するために、関数isNaN()を単純に使用することはできません。isNaN()には次のような問題があるためです。
var myVar = "A";
isNaN(myVar) // true, although "A" is not really of value NaN
ここで実際に起こることは、myVarが暗黙的に数値に強制されているということです。
var myVar = "A";
isNaN(Number(myVar)) // true. Number(myVar) is NaN here in fact
「A」は実際には数値ではないので、実際には意味があります。しかし、私たちが本当にチェックしたいのは、myVarが正確にNaNであるかどうかです。
だからisNaN()は役に立ちません。それでは、代わりに何をすればいいですか。
NaNがそれ自体とは異なる扱いを受ける唯一のJavaScript値であることを踏まえると、!==を使用してそれ自体が等しいことを確認できます。
var myVar; // undefined
myVar !== myVar // false
var myVar = "A";
myVar !== myVar // false
var myVar = NaN
myVar !== myVar // true
結論として、 、それが変数!==それ自体であることが真実であるならば、この変数はまさに値NaNである:
function isOfValueNaN(v) {
return v !== v;
}
var myVar = "A";
isNaN(myVar); // true
isOfValueNaN(myVar); // false
他の選択肢を共有したいのですが、必ずしも他の選択肢よりも優れているわけではありませんが、検討する価値があると思います。
function customIsNaN(x) { return (typeof x == 'number' && x != 0 && !x); }
この背後にある論理は、0
とNaN
を除くすべての数字がtrue
にキャストされることです。
私は簡単なテストをしました、そしてそれはNumber.isNaN
と同じくらいよく、そしてそれ自身に対して偽をチェックするのと同じくらいよく機能します。 3つすべてがisNan
よりもパフォーマンスが優れています
結果
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
あなたが壊れたisNaN
関数を避けたいならば役に立つかもしれません。
function isNotANumber(n) {
if (typeof n !== 'number') {
return true;
}
return n !== n;
}
IsNaN()はそのままでNode.jsでサポートされていないようです。
私は一緒に仕事をしました
var value = 1;
if (parseFloat(stringValue)+"" !== "NaN") value = parseFloat(stringValue);
確認する正確な方法は次のとおりです。
//takes care of boolen, undefined and empty
isNaN(x) || typeof(x) ==='boolean' || typeof(x) !=='undefined' || x!=='' ? 'is really a nan' : 'is a number'
NaN === NaN; // false
Number.NaN === NaN; // false
isNaN(NaN); // true
isNaN(Number.NaN); // true
等号演算子(==および===)を使用してNaNに対して値をテストすることはできません。
Mozilla Documentation グローバルなNaNプロパティはNot-A-Numbe を表す値です。
最善の方法はNaNをチェックするための組み込み関数である 'isNaN()'を使うことです。すべてのブラウザはこの方法をサポートしています。
たぶんこれも:
function isNaNCustom(value){
return value.toString() === 'NaN' &&
typeof value !== 'string' &&
typeof value === 'number'
}
marksyzmの答えはうまくいきますが、Infinityは技術的に数値ではないため、Infinity
に対してfalseを返しません。
私はそれが数字かどうかをチェックするisNumber
関数を思い付きました。
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"));
更新:私はこのコードがいくつかのパラメータで失敗することに気づいたので、私はそれをより良くしました。
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);
これはエレガントではありません。しかしisNAN()を試した後、私はこの解決策にたどり着きました。この例では、 '。'も許可しました。フロートを隠しているからです。数字を使用しないようにするために、これを逆にすることもできます。
("1234567890".indexOf(String.fromCharCode(mycharacter))==-1)
これは1文字の評価ですが、文字列をループ処理して数値をチェックすることもできます。
(NaN> = 0) ?...... " わからない ".
function IsNotNumber( i ){
if( i >= 0 ){ return false; }
if( i <= 0 ){ return false; }
return true;
}
_ true _ の場合にのみ条件が実行されます。
_ false _ にはありません。
" わからない "にはありません。
ちょうど楽しみのために、別の方法を見つけました。
function IsActuallyNaN(obj) {
return [obj].includes(NaN);
}
私は StackOverflow で別の質問に対してこの答えを書きましたが、ここでNaN == null
は別のチェックを行いますが、それが重複としてマークされたので仕事を無駄にしたくありません。
NaN
については Mozilla Developer Network をご覧ください。
値が適切な数値であることを確認したい場合はdistance || 0
、それをチェックする場合はisNaN()
を使用してください。
NaN(Not-a-Number)は、いくつかの数学的操作が失敗したときに頻繁に返されるjavascriptの奇妙なグローバルオブジェクトです。
あなたはNaN == null
が結果としてfalse
であるかどうかをチェックしたいと思いました。 NaN == NaN
の結果でさえfalse
を持つ必要があります。
変数がNaN
かどうかを調べる簡単な方法は、グローバル関数isNaN()
です。
もう1つはx !== x
で、これはxがNaNの場合にのみ当てはまります。 (@ raphael-schweikertに思い出させてくれてありがとう)
確認してみましょう。
NaN == false
を呼び出すと、NaN == true
と同じ結果がfalse
になります。
仕様のどこかにJavaScriptには常にfalseの値を持つレコードがあります。
NaN
- 非数""
- 空の文字列false
- ブール値のfalsenull
- nullオブジェクトundefined
- 未定義の変数0
- +0と-0を含む数値0IEEE 754によると、NaNを含むすべての関係は、!=を除いてfalseと評価されます。したがって、例えば、AまたはBまたは両方がNaNである場合、(A> = B)=偽および(A <= B)=偽である。
規則は以下のとおりです。
NaN != NaN
IsNaN()関数の問題は、場合によっては予期しない結果を返す可能性があることです。
isNaN('Hello') //true
isNaN('2005/12/12') //true
isNaN(undefined) //true
isNaN('NaN') //true
isNaN(NaN) //true
isNaN(0 / 0) //true
値が本当にNaNであるかどうかを確認するためのより良い方法は、次のとおりです。
function is_nan(value) {
return value != value
}
is_nan(parseFloat("geoff"))
別の解決策は MDNのparseFloatページに記載されています
厳密な構文解析を行うためのフィルタ機能を提供します。
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
そしてisNaN
を使ってそれがNaN
であるかどうかを調べることができます
私は魅力のように機能するこの小さな機能を作成しました。直感に反するように思われるNaNをチェックする代わりに、番号をチェックします。私はこのようにして最初にやるわけではないと確信していますが、私は分かち合うと思いました。
function isNum(val){
var absVal = Math.abs(val);
var retval = false;
if((absVal-absVal) == 0){
retval = true
}
return retval;
}
結果を文字列に変換して 'NaN'と比較するだけです。
var val = Number("test");
if(String(val) === 'NaN') {
console.log("true");
}