My days of...

生活のことなど、がんばろう

JavaScriptで数値かどうかを検証したい場合、isNaNやisFiniteはどうだろう?

JavaScriptで値が数値かどうか判断するには、

isNaN か isFinite 関数があるので使おう、との紹介を読んで使おうと思ったらわりと使いにくいものでした。

developer.mozilla.org

developer.mozilla.org

isNaNの使用例として、

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

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

// strings
isNaN("37"); // false: "37" は非数でない数値 37 に変換される
isNaN("37.37"); // false: "37.37" は非数でない数値 37.37 に変換される
isNaN("37,5"); // true
isNaN('123ABC'); // true: parseInt("123ABC") の結果は 123、 然し Number("123ABC") の結果は NaN
isNaN(""); // false: 空文字列は非数でない 0 に変換される
isNaN(" "); // false: 半角スペースからなる文字列は非数でない 0 に変換される

// dates
isNaN(new Date()); // false
isNaN(new Date().toString()); // true

// isNaN が信頼性に欠ける理由となる誤検出の例
isNaN("blabla") // true: "blabla" が数値に変換される。
// 数値への変換が失敗し NaN が返される。

 と説明がなされています。また注意として、true/falseに対しても0/1が返されることから、

 この関数は、「この値を数値型に型強制した場合、IEEE-754 における 'Not A Number' という値になりますか?」という質問に答えるものとして解釈すべきです。

 なのだそうです。isFinite() も同様な感じで、isFinite(true/false) はtrueを返します。isFinite([2]) としてもtrueでした。

整数かどうかだけならNumber.isInteger()を利用した方が良さそう

Number.isInteger(1) // true
Number.isInteger("1") // false
Number.isInteger([1]) // false
Number.isInteger(true) // false
Number.isInteger({}) // false

Number.isFinite()  であれば整数以外もいけそう。

Number.isFinite(2.3); // true
Number.isFinite([1]); // false
Number.isFinite({3:4}); // false
Number.isFinite("2"); // false
Number.isFinite(1==2); // false
Number.isFinite(true); // false

それ以外は正規表現を利用して確認するのがいいかも。

 

JavaScript コードレシピ集

JavaScript コードレシピ集

 
これからWebをはじめる人のHTML&CSS、JavaScriptのきほんのきほん

これからWebをはじめる人のHTML&CSS、JavaScriptのきほんのきほん