私はよく次のようなことをします。
delay = delay || 24; // default delay of 24 hours
0 || 24 === 24
しかし、実際には の代わりに0 と を許可したいのです0
。
コマンドラインからユーザー入力を取得する、またはどこからでも入力を取得し、同じロジックを実行して、ゼロのみを真実として扱うのが最善のパターンであると考えています。私が見つけた最良のパターンは、まさにそれを行うことだと思います:
delay = (delay === 0 ? delay : (delay || 24));
まず、 のようなことを許可しますが'abc'
、これは本当に間違っています。しかし、私が早く入れると、それはすり抜けてしまいます。これも間違っています+
. null
第二に、非常に醜いです。なぜなら、利用可能な言語ツールでエレガントなことをするのではなく、言語の欠陥を明らかに回避しているためです。そしてひどく読めません。私は1行の思考で何かをしていて、実際の1行のコードでそれをやりたいと思っています(このような技術的な1行ではありません)。しかし、私が持っていた他のほとんどのアイデアはさらに醜くなります。
delay = typeof delay === 'number' ? delay : 24; // but typeof NaN === 'number', so
delay = (!isNaN(delay) && typeof delay === 'number') ? delay : 24;
これは実際には文字列で機能することに注意してください-受け入れることに興味がある場合は""
、
str = typeof str === 'string' ? str : 'default';
穴がなくNaN
、これはインテリジェントに読み取り可能であるため、文字列がある場合はそれを使用し、そうでない場合はデフォルトを使用します。
またはこのルート:
delay = !isNaN(+delay) ? delay : 24; // fails on null
delay = !Number.isNaN(+delay) ? delay : 24; // still fails on null
// same thing with null check, now way uglier than we started
だから私はまだハッキーな三項論理とブール論理の方が好きです。はい、私は要約された 1 行のソリューションを探しています。なぜなら、JS にはパターンがたくさんあり、他の多くの言語で優れていることは、JS でよく認識され、読みやすく、明確であるためです。しかし、私は初心者で、良いパターンを学ぼうとしているので、この質問です.
要件をより明確にするには:
0
に行く必要があります0
。undefined
に行く必要があります24
。typeof
を除いて、下のすべての実際の数値は自分自身に移動する必要がありNaN
ます。- と を意図的に異なる方法で処理する JS コードを使用することはほとんどないため、に
null
行く必要があると強く感じています。このままの方がいいような気がします。24
null
undefined
- これはパターンにより厳密に従うため、
NaN
行くべきだと少し感じます。偽物はデフォルトにすべきです。24
||
'abc'
24 に移動する必要があります - 私の実際のアプリケーションでは、これはユーザー入力であり、ユーザーは間違って入力してはいけません。たとえば、電子メールです。'123abc'
へ24
の変換はキャッチしますが、Number
キャッチparseInt
しません。メールは数字で始めることができると私は信じているので、これはこれがキャッチされるべきものであることを強調しています.
アンダースコアまたはロダッシュの回答は 、特に、2 ~ 3 行の関数を記述する代わりに「賢く」なろうと私に教えてくれた人には受け入れられます。これらのライブラリが存在するのは、世界中の多くのコード ベースの多くの場所で同じことを実行する単純な 2 ~ 3 行の関数が多数存在するためです。たとえば、_.readNumber
. そのような方法が存在せず、一般的な十分な要件を思いつくことができる場合は、自分で投票リクエストを送信し、この質問への回答として投稿します. これは私が JS で気に入っていることです。これらのユーティリティ メソッドを作成する必要があります。私は特にユーザー入力を扱っているので、もう少し特殊な関数を作成して commander.js に送信する方が良いかもしれません。