【JavaScript】parseInt()とNumber()の違い

プログラミング

はじめに

parseInt(true)NaNになるのに、isNaN(true)falseになる理由が分からなかった

isNaN()

これ

isNaN()
isNaN() 関数は引数が NaN (非数)かどうかを判定します。isNaN 関数の型強制は興味深いルールを持つことに注意してください。値が非数かどうかを判定する代用方法として、ECMAScript 2015 で定義されている Number.isNaN() が使用できます。

こいつは、引数が数値型でない場合に、暗黙的な型強制が発生する

// これは true (= NaN)
isNaN('true')
isNaN('false')
// でもこうすると false
isNaN(true)
isNaN(false)

数値に型強制されるってことは、こういうことだよな と思った。が間違い。

// 結果は NaN
parseInt(true)
parseInt(false)

「はじめに」の答え

数値型への型強制は、parseInt()じゃなくてNumber()だよねって話

parseInt()とNumber()の違い

parseInt()は、文字列の数字部分を取り出し、数値に変換する

Number()は、文字列の意味を解釈し、数値に変換する。無理な時はNaNを返す

実際の挙動

parseInt("123Abc"); // 123
parseInt("101", 2); // 5 (二進数)
parseInt("2e3"); // 2

Number("123Abc"); // NaN
Number("101", 2); // 101
Number("2e3"); // 2000 (2 x 10^3)

Number("101", 2)がエラーにならないのも気持ち悪い

まとめ

Numberオブジェクトは、割と罠。

こういうのとか

var a = new Number('123');
var b = Number('123');

a === 123; // false
b === 123; // true

a instanceof Number; // true
b instanceof Number; // false

参考

Number
Number JavaScript オブジェクトは、数値に作用するラッパーオブジェクトです。Number オブジェクトは、Number() コンストラクタを用いて生成します。プリミティブ型オブジェクト number は Number() 関数を用いて生成します。
JavaScriptの数値チェックについてハマったのでメモ - Qiita
はじめに こんにちは、普段は業務で求人系サービスの開発や社内向けツールの開発を行なっている@taku-0728です。 今回はJavaScriptの数値チェックについてまとめました。 調べると多くの記事がヒットしますが、true/...

コメント

タイトルとURLをコピーしました