javascriptのユーティリティー・ライブラリをアプリケーションに頻繁に使用することがあります。 開発プロセスをスピードアップするため、あるいは単に動作が確認されているユーティリティー機能が欲しいだけの場合もあるでしょう。
ユーティリティー・ライブラリを使って、変数が有効な数値かどうかを検証したことはありますか? 有効とは、その値がエラーを起こさないことや、NaN
のように予想外の結果を返さないことを意味します。 lodashやunderscoreに依存している場合、そのisNumber
関数を使いたくなるかもしれません。
では、isNumber
関数の lodash と underscore の実装を見てみましょう。
一般的なライブラリは、どちらも似たような実装をしています。 Javascriptのクラス名型の変数との文字列を比較します。
あなたはそれでいいと思うかもしれませんが、NaN
もJavascriptではNumberであることをご存知でしょうか? javascriptでのNaNは、値を表すNumberです。 Not-A-Number
となります。 ちょっとわかりにくいですね。
toString.call(NaN)
// ->
だから、isNumber
NaN
ではない数字かどうかをチェックする必要があります。
const isValidNumber = _.isNumber(obj) && !isNaN(obj)
では、isDate
関数はどうでしょうか。
new Date("31/1/2019")
new Date("test123")
のように、無効な Date オブジェクトを初期化しようとすると、問題が発生します。 結果として得られる値は、Dateオブジェクトではありますが、無効なDateオブジェクトとなります。 これにより、Date関連のロジックに不具合が生じる可能性があります。
const isValidDate = _.isDate(obj) && !isNaN(obj.getTime())
Recap: