一部のプロジェクトでは、一部のデータを検証し、数学演算で使用できる JavaScript の数値であることをできる限り確認する必要がありました。
jQuery、および他のいくつかの JavaScript ライブラリには、通常 isNumeric と呼ばれるそのような関数が既に含まれています。答えとして広く受け入れられているstackoverflowに関する投稿もあります。これは、前述のライブラリが使用しているのと同じ一般的なルーチンです。
function isNumber(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
}
初めての投稿で、そのスレッドに返信できませんでした。受け入れられた投稿で私が抱えていた問題は、私が行っていたいくつかの作業に影響を与えるいくつかのまれなケースがあるように見えるということでした.
まず、上記のコードは、引数が長さ 1 の配列であり、その単一の要素が上記のロジックによって数値と見なされる型である場合に true を返します。私の意見では、配列の場合は数値ではありません。
この問題を軽減するために、ロジックから配列を割引するチェックを追加しました
function isNumber(n) {
return Object.prototype.toString.call(n) !== '[object Array]' &&!isNaN(parseFloat(n)) && isFinite(n);
}
もちろん、Array.isArray
代わりに使用することもできますObject.prototype.toString.call(n) !== '[object Array]'
編集:$.isArray
配列の一般的なテストを反映するようにコードを変更しました。または、jqueryまたはプロトタイプを使用することもできますObject.isArray
私の 2 番目の問題は、負の 16 進数の整数リテラル文字列 ("-0xA" -> -10) が数値としてカウントされていないことでした。ただし、正の 16 進整数リテラル文字列 ("0xA" -> 10) は数値として扱われていました。どちらも有効な数値である必要がありました。
次に、これを考慮してロジックを修正しました。
function isNumber(n) {
return Object.prototype.toString.call(n) !== '[object Array]' &&!isNaN(parseFloat(n)) && isFinite(n.toString().replace(/^-/, ''));
}
関数が呼び出されるたびに正規表現が作成されることが心配な場合は、次のようにクロージャー内で書き直すことができます。
isNumber = (function () {
var rx = /^-/;
return function (n) {
return Object.prototype.toString.call(n) !== '[object Array]' && !isNaN(parseFloat(n)) && isFinite(n.toString().replace(rx, ''));
};
}());
次に、CMSの+30 個のテスト ケースを取得し、jsfiddleでのテストを複製して、追加のテスト ケースと上記のソリューションを追加しました。
すべてが期待どおりに機能しているようで、問題は発生していません。コード上または理論上の問題はありますか?
広く受け入れられている/使用されている回答に取って代わるものではないかもしれませんが、これが isNumeric 関数の結果として期待されているものである場合は、これが役立つことを願っています.
EDIT : Bergiが指摘したように、数値と見なされる可能性のあるオブジェクトは他にもあり、ブラックリストよりもホワイトリストに登録することをお勧めします。これを念頭に置いて、私は基準に追加します。
isNumeric 関数で数値または文字列のみを考慮したい
これを念頭に置いて、使用する方が良いでしょう
function isNumber(n) {
return (Object.prototype.toString.call(n) === '[object Number]' || Object.prototype.toString.call(n) === '[object String]') &&!isNaN(parseFloat(n)) && isFinite(n.toString().replace(/^-/, ''));
}
これはテスト 22 として追加されました