JavaScriptで数値がNaNであることをどのように確認しますか?


415

私はFirefoxのJavaScriptコンソールでそれを試してみましたが、次のステートメントはどちらもtrueを返しません。

parseFloat('geoff') == NaN;

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

5
:あなたの実際の目標は、数字をチェックする場合は読む価値 stackoverflow.com/questions/18082/...
ポール・


1
@Gothdo:確かですが、値ではなく、数値がNaNであることを確認する方法を尋ねました。
ポールD.ウェイト

3
@ PaulD.Waiteはい、しかし、「変数がJavaScriptでナンかどうかを確認する方法」のようなものをグーグルするとき、多くの人々がここに来ます。
のMichałPerłakowski

PaulD.Waite同意しますが、@ Gothdoと同じ懸念があります。多くの人々は、「JSの値がNaNであるかどうかを確認する方法」という意図でこの質問にたどり着きます。同じ答えについてmjohnsonengrのコメントを確認できます。ところで、私もモデレーターの注意のためにこの質問にフラグを付けました。
deddude

回答:


582

このコードを試してください:

isNaN(parseFloat("geoff"))

数値ではなく値がNaNであるかどうかを確認するには、こちらを参照してください:JavaScriptでNaNをテストするにはどうすればよいですか?


8
paseFloatは必要ですか?
rahul

23
空の文字列をとして解釈するNaN場合は、はい。(いつも言っているわけではありません。)
ポールD.ウェイト

1
もし私があなたがそれを変数に割り当てるとしたら、条件変数!==変数を使用してください。仕様書に記載
ecma262 /#

3
isNaN(parseFloat("geoff")) // true isNaN(parseFloat("10geo")) // false これはどのように役立ちますか?
プラシャント

これは、w3schools.com
jsref /

146

私はこのテクニックに出会ったばかりですが、これはかなり単純な「効果的な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


27
効果的ですが直感的ではありません。この種のコードを維持したくありません。
osa 14

35
直感に反するのはコードではなく、NaNです。
Jazzy

20
@DanMこれはバグではなく、NaNの標準IEE754動作です。これは、CPUでの実装方法であり、浮動小数点を使用する世界のすべてのプログラミング言語で予想される動作です。
Tarmil 2014

4
@ターミル正式に指摘!これは本当に興味深いです。NaNの不平等な奇妙さはJavascriptの問題だといつも思っていました。
Dan M

2
NaN ===ナン; // false。これはJavaScriptの既知のバグです。isNanは新しいメソッドです。
atilkan 2017

52

このコードを使用してください:

isNaN('geoff');

MDNのドキュメントを参照isNaN()

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

1
多分それは私だけかもしれませんが、NaNの考えは、NaN値を作成するときに混乱しvar value = 0/0;var value2= String("123 131");このようなものvar value3 = "abcd";もNaN値です。
Nick Pineda 2016年

@NickPinedaなんで?
シンジャイ

44

Number型の値がaかどうかに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;
}

詳細については、この回答を確認してください。


6
「isNan()」を使用するだけでなく、完全に詳細な回答を提供してくれてありがとう。これは、Googleでこの質問を見つけたときにまさに探していたものです。
mjohnsonengr 2015年

1
「...上記のケースで間違った結果を出していました」間違っているとは言えません。違うのは、グローバルisNaNが最初に引数を数値に変換するためです。
Felix Kling 2016年

1
@FelixKling更新された回答を確認してください。ありがとう。
doudeddude 2016年

1
isNaN( "lorem ipsum"); // ES5で真実がわくわくした
Nick Pineda

2
@NickPineda感じはとても相互的ですが、ついにMDNはこのように説明できます "isNaN関数への引数がタイプNumberでない場合、値は最初に数値に強制変換されます。次に、結果の値がテストされ、それがNaN。」
deddude

16

NaNは、そのようにテストできない特別な値です。共有したいのはこれです

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

これは、NaN値に対してのみ trueを返し、テストの安全な方法です。同じ変数が互いに等しくないかどうかをテストすることは明らかに意味がないので、関数でラップするか、少なくともコメントする必要があります。


1
それは完全に信頼できる方法ではありません。仕様に従って。変数==変数がNaNかどうかを確認するための最も信頼性の高い方法である!
allsyed

1
これについては上記の私の回答を参照してください^
Jazzy

14

次のisNaN(value)理由により、グローバル関数呼び出しを使用する必要があります。

  • クロスブラウザをサポートしています
  • ドキュメンテーションについてはisNaNを参照してください

例:

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

これがお役に立てば幸いです。


1
うん、isNaN('') //falseしかしparseInt('') //NaN。同じことがについて言えnullます。
サイレントペンギン


9

'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

編集:私はちょうどこのしかし...偽の値から別の問題に気づいた(そして実際のbooleanとして真)に渡されたNumber()として復帰0!その場合...代わりにparseFloatが毎回機能します。だからそれにフォールバック:

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

そして、それは一見すべてをカバーしています。ロダッシュより90%遅い速度でベンチマークしました_.isNaNが、それはすべてのNaNをカバーするわけではありません。

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

明確にするために、私は「Not a Number」であるものの人間の文字通りの解釈を担当し、lodashは何かが「NaN」であるかどうかをチェックするコンピュータの文字通りの解釈を担当します。


7

@chiborgの答えは正しいですが、注意すべきことが他にもあります。

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

つまり、このメソッドを入力の検証に使用している場合、結果はかなり自由になります。

したがって、はいparseFloat(string)(または、完全な数値parseInt(string, radix)の場合は'を使用してから、でラップすることisNaN()ができますが、数値以外の文字と絡み合った数値の問題に注意してください。


1
面白い。これに対抗して「1.2geoff」が実際に有効な数値文字列ではないことを検出する方法はありますか?
Gabe Halsmer、2013年

2
これは、文字列数字で始まる場合にのみ発生することに注意してください。parseFloat('test1.2')戻りNaNます。
Eduard Luca

6

シンプルなソリューション!

本当に超簡単!ここに!この方法があります!

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

次のように簡単に使用してください:

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

hereこの関数を使用したパフォーマンステスト参照してください。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>

別の方法で名前を付けたメソッドを使用せず、よりグローバルに利用できるようにしたい場合は、実装のために取る代替パスがいくつかあります。警告これらのソリューションはネイティブオブジェクトの変更を伴うものであり、最善のソリューションではない場合があります。常に注意を払い、使用する可能性のある他のライブラリがネイティブコードまたは同様の変更に依存している可能性があることに注意してください。

代替実装1:ネイティブisNaNメソッドを置き換えます。

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

代替実装2:数値オブジェクトに追加
* ECMA 5〜6のポリフィルでもあるため推奨

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

空の場合の代替ソリューションテスト

オブジェクトが空かどうかをテストするために書いた簡単なウィンドウメソッド。項目が「正確に」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);
})();

例:


空かどうかの非常に詳細なチェック

最後の1つは、オブジェクトが空のオブジェクトでいっぱいかどうかをチェックする場合でも、少し深くなります。きっと改善の余地があり、ピットの可能性はあると思いますが、今のところほとんどすべてを捕らえているようです。


1
@ PaulD.Waiteこのアプリかもしれませんが、受け入れられた回答が表示されません。実際、5つの回答しか表示されませんが、15があると表示されています
SpYk3HH

1
どのアプリを使用していますか?
Paul D. Waite、2015年

2
@ PaulD.Waiteアンドロイド用のSE 1つ。銀河s3で
SpYk3HH 2015年

1
あは。私は自分自身を見てアプリを持っていないが、ここでは受け入れ答えへのリンクがあります:stackoverflow.com/a/2652335/20578
ポールD.ウェイト

@ PaulD.Waiteああ、なるほど。私は、質問自体への直接的な回答としては、それ自体で十分だと思います。isNaN信頼性が低いため、「JSが「本当に」NaNかどうかを確認するJSの方法」に関連して、別の質問に回答を投稿しました。私はそこでコメントされ、この質問は私の回答に適しているので、ここに移動します。この問題に関連して役立つ/有用なものを単に置くだけで、当面の問題のGoogle検索でポップアップしis it NaN?ます。余談ですが、私の回答は、選択した回答よりも頻繁に正確になります。
SpYk3HH 2015年

5

私は別の選択肢を共有したいだけです。ここで他の選択肢よりも優れているとは限りませんが、一見の価値があると思います。

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

この背後にある論理は、0NaNを除くすべての数値がtrueです。

私は簡単なテストを行いましたが、それは Number.isNaNそれ自体がfalseかかをチェックするのと同じを示します。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機能を避けたい場合に役立つかもしれません。


5

ご使用の環境がECMAScript 2015をサポートNumber.isNaNしている場合、値を本当に確認するために使用することができますNaN

問題isNaNは、それを非数値データで使用する場合(MDNに従って)混乱するルールがほとんど適用されないことです。例えば、

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

したがって、ECMA Script 2015がサポートされている環境では、

Number.isNaN(parseFloat('geoff'))

7
私の環境はECMAScript XP Home Editionのみをサポートしています:(
Paul D. Waite

1
@ PaulD.Waite(IE 6を意味isNaNしていると思います:D)問題ありません:-)問題が発生する可能性があることを覚えておいてNumber.isNaN、ECMAScript 2015環境での使用を忘れないでください:-)
thefourtheye

5

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

4

私はアンダースコアのisNaN関数を使用しています。

isNaN(undefined) 
-> true

少なくとも、その落とし穴に注意してください。


10
よくわかりません。isNaNが渡されたときにtrueを返すのはなぜundefined正しくない動作なのでしょうか?undefined数字ではないのは本当ですか?
Xaxis 2013

3
@Xaxis NaNはundefinedと同等であると見なすべきではありません。これらは両方とも特定の意味を持つ異なる値です。これを考慮してください。私は値を持っていますが、それが何であるかを言っていません。おそらくそれは数値であり、それでもあなたの観点からは、それは未定義ではありません。
Corin

1
@Corinはとundefinedは異なる場合がありますがNaN、それでも数値ではないため、そうであるisNaN(undefined)必要があります(true
実際にそう


3

isNaN()は、そのままではNode.jsでサポートされていないようです。
私は一緒に働きました

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

もちろん、Node.jsについては尋ねていません。
ポールD.ウェイト2013


2
NaN === NaN;        // false
Number.NaN === NaN; // false
isNaN(NaN);         // true
isNaN(Number.NaN);  // true

等価演算子(==および===)を使用して、NaNに対して値をテストすることはできません。

Mozillaドキュメントを見てください。グローバルNaNプロパティはNot-A-Numbeを表す値です。

最善の方法は、NaNをチェックするための組み込み関数である「isNaN()」を使用することです。すべてのブラウザがこの方法をサポートしています。


2

ルールは:

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"))

1

IEEE 754によれば、!=を除き、NaNを含むすべての関係はfalseと評価されます。したがって、たとえば、AまたはB、あるいはその両方がNaNの場合、(A> = B)= falseおよび(A <= B)= falseとなります。


1

私は別の質問にこの回答を書きました StackOverflowでチェックしましたNaN == nullが、重複としてマークされたので、仕事を無駄にしたくありません。

見る Mozillaの開発者ネットワークについてNaN


簡潔な答え

使うだけ distance || 0値が適切な数値であるisNaN()ことを確認したり、値を確認したりときにします。

長い答え

NaN(Not-a-Number)は、数学演算が失敗したときに頻繁に返されるJavaScriptの奇妙なグローバルオブジェクトです。

NaN == null結果がどうなるかを確認したかったのfalseです。HovewerはNaN == NaNfalse

変数がNaNグローバル関数かどうかを確認する簡単な方法isNaN()

もう一つは x !== x、xがNaNの場合にのみ当てはまることです。(@ raphael-schweikertへの通知に感謝)

しかし、なぜ短い答えが機能したのですか?

確認してみましょう。

NaN == false結果を呼び出すとfalse、と同じNaN == trueです。

仕様のどこかに、JavaScriptには常にfalse値を持つレコードがあります。

  • NaN -非数
  • "" -空の文字列
  • false -ブールfalse
  • null -nullオブジェクト
  • undefined -未定義の変数
  • 0 -+0と-0を含む数値0

1
「変数がNaNかどうかを確認する唯一の簡単な方法は、グローバル関数isNaN()です」–真ではありません。別の簡単な方法があります。var xIsNaN = x !== x;これは、xがの場合にのみtrueになりますNaN
Raphael Schweikert 2015年

1

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


1

正確な確認方法は次のとおりです。

//takes care of boolen, undefined and empty

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

1

魅力のように機能するこの小さな関数を作成しました。直感に反するNaNをチェックする代わりに、数値をチェックします。この方法を最初に行うのは自分ではないと確信していますが、共有したいと思いました。

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

    return retval;
}


1

markyzmの答えはうまくいきますが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));


あなたの前提は、無限は技術的に数ではなく技術的に欠陥があるということではありません:math.stackexchange.com/questions/36289/is-infinity-a-number。答えを読んだところ、無限大の数は文脈に依存するということです。
Jon P

私は別の質問にこれを移動するつもりだ
adddff

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

これはエレガントではありません。しかしisNAN()を試した後、私は別の選択肢であるこの解決策に到達しました。この例では、「。」も許可しました。私はフロートをマスキングしているからです。これを逆にして、番号が使用されていないことを確認することもできます。

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

これは1文字の評価ですが、文字列をループして数値をチェックすることもできます。


1

isNaN JavaScript関数を使用してNaNを確認できます。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

結果を文字列に変換し、「NaN」と比較するだけです。

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

0

である(NaNに> = 0)?...... " 私は知りません "。

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

条件は、TRUEの場合にのみ実行されます。

FALSEではありません。

わからない」ではありません


反対を探す代わりに、明示的にNaN値を探す場合は、あまり役に立ちません
liviu blidar
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.