isNaN()

値がNaNか否かを調べます。 この関数には欠陥があることに注意してください。

文法

isNaN(testValue)
引数 説明
testValue 調べる値を指定します。

説明

isNaN関数の必要性

NaNはJavaScript内で使用できる他の全ての値と異なり、 イコール演算子(=====)によって、NaNか否かを調べる事が出来ません。 何故なら、NaN == NaNNaN === NaNもfalseとして評価されるからです。 これが、isNaN関数が必要とされる理由です。

NaN値が生まれる原因

NaN値は、未定義または表現することの出来ない値での算術演算子の結果によって生成されます。 このような値は、必ずしもオーバーフローの状態を表すとは限りません。 NaNはまた、プリミティブ値ではない値を利用するために、 数値では無い値を強制的に数値にしようと試みた結果でもあります。

例えば、0を0で割り算した結果はNaNですが、 他の数値を0で割り算すると別の結果になります。

開発者を混乱させる特別なケースでの挙動

isNaN関数のとても早い時期の仕様のバージョンから、 非数値の引数に対するこの関数の挙動は開発者を混乱させるものでした。 isNaN関数へ、Number型ではない引数を指定した場合、 その値はまず強制的にNumberにされます。 その結果の値が、NaNか否かを検証するのに使用されます。 そのため、結果として強制的に数値型に変換させる正当な"非"数値の値は、 (特に空文字列とプリミティブ値である真偽値は、強制的に0または1にされます) 期待した通りではない戻り値"false"を返す可能性があります。 例えば絶対に数値では無い("not a number")空文字列の結果は、falseとなりますす。

この"not a number"という言い回しから来る混乱の元は、 IEEE-794の浮動小数点数値として数値を表現するという特別な意味を持つことに起因します。(翻訳に自信なし) この関数の問い合わせによる回答は、 "この値を強制的に数値にした場合、IEEE-794の'Not A Number'値になりますか?"と解釈するべきです。

ECMAScript(ES6)では、Number.isNaN()関数が含まれるようになります。 Number.isNaN(x)は、xがNaNか否かを検証する際に頼りになるでしょう。 ただし、Number.isNaNを使用したとしても、 単純に"not a number"では無く、NaNが意味する"正確な数値の意味"は残り続けます。(翻訳に自信なし) Number.isNaN以外の方法として、 変数xがNaNか否かを検証する際に、isNaNの信頼出来ない誤った判定(false positives)の結果を当てにするよりも、 式(x != x)とする方がより信頼出来ます。

"false positives"を"誤った判定"と翻訳しています。 "false positives"は、日本語にすると実際には医療の世界で使用される"偽陽性"と訳されるそうですが、 英語圏のプログラマはこのキーワードをよく使用するそうです。
詳細についてはbkブログさんの、誤った判定 - 学校では教えてくれないバッドノウハウ英語 #13 - bkブログを参照してください。

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

isNaN(true);      // false
isNaN(null);      // false
isNaN(37);        // false

// 文字列
isNaN("37");      // false: "37"は数値の37に変換され、NaNでは無いとされます。
isNaN("37.37");   // false: "37.37"は数値の37.37に変換され、NaNでは無いとされます。
isNaN("");        // false: 空文字列は0に変換され、NaNでは無いとされます。
isNaN(" ");       // false: スペースは0に変換され、NaNでは無いとされます。

// 日付
isNaN(new Date());                // false
isNaN(new Date().toString());     // true

// これが誤った判定であり、isNaNが全体的に信頼出来ない理由です。
// 訳注: false positivesを"誤った判定"と訳しています。
isNaN("blabla")   // true: "blabla"は内部で数値に変換されようとして、
                  // 解析に失敗しNaNが返されています。

仕様

ブラウザ互換性

デスクトップ
機能 Chrome Firefox
(Gecko)
IE Opera Safari
基本
モバイル
機能 Android Chrome for
Android
Firefox
Mobile
IE
Mobile
Opera
Mobile
Safari
Mobile
基本

関連項目

 Back to top

© 2017 Mozilla Contributors
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.

このページは、ページトップのURL先のMozilla Developer Network(以下、MDN)のコンテンツを翻訳した内容を基に構成されています。 構成について異なる点も含まれますので、下記の項目を確認し、必要に応じて元のコンテンツをご確認ください。 もし、誤訳などの間違いを見つけましたら、 @tomofまで教えていただければ幸いです。

  • 特定のブラウザに特化しすぎている情報やあまりにも古い情報、 または試験的に導入されているようなAPIや機能については、省略していることがあります。
  • 例やデモについて、実際にページ内で動作させる関係で一部ソースコードを変更している場合や、 その例で使用しているコンテンツの単語や文章などを日本人向けに変更しいてる場合があります。
  • MDNの更新頻度が高いため、元のコンテンツと比べ情報が古くなっている可能性があります。
  • "訳注:"などの断わりを入れた上で、日本人向けの情報の追記を行っている事があります。