回答:
if (result == Number.POSITIVE_INFINITY || result == Number.NEGATIVE_INFINITY)
{
// ...
}
isFinite
処理方法に応じて、代わりに関数を使用できますNaN
。あなたの番号が、またはの場合にをisFinite
返しfalse
ます。POSITIVE_INFINITY
NEGATIVE_INFINITY
NaN
if (isFinite(result))
{
// ...
}
Infinity
プロパティは読み取り専用ではないため、再定義できます。たとえば、"true"とvar x = 42; Infinity = 42; alert(x === Infinity);
表示されます。(確かにあいまいなケースだ、と再定義することを決定誰、などが奇数物事が起こることを期待すべきである。)Infinity
NaN
Number.(POSITIVE|NEGATIVE)_INFINITY
読み取り専用ではないという事実を無視すると、厳密モードでInfinity
は読み取り専用になります。また、-?1/0
私があなたに提示したケースはどうですか?とにかく、ほとんどの場合、isFinite
代わりに使用する必要があります。
Number.POSITIVE_INFINITY
でNumber.NEGATIVE_INFINITY
は読み取り専用です(Chrome8、FF3.6、IE8でテスト済み)。の使用1/0
は問題なく動作しますが、実際にテストしようとしているのはコードのメンテナにとってそれほど明白ではありません。isFinite
ほとんどの場合、使用することがより良い方法であることに同意します-それが私の回答でそれを述べた理由です-しかし、OPのみが要件を満たすかどうかを決定できます。
Object.defineProperty
およびで再定義できます__defineGetter__
。Infinity
一方、ある厳密モードにおいて非構成。
シンプルn === n+1
またはn === n/0
機能:
function isInfinite(n) {
return n === n/0;
}
ネイティブisFinite()
が数値への入力を強制することに注意してください。isFinite([])
とisFinite(null)
両方true
の例です。
n === n+1
2 ^ 53より大きいすべての数値、つまり1e30に対してtrueと評価されます。分割ハックは、NaNと-Infinityでも機能します。ただし、LukeHの回答により、コードが読みやすくなります。
n+1
できず、丸められる可能性があります。まあ、整数でも丸め誤差の影響を受けます。ところで、私はあなたのコードが「数学に耐える」とは思わない、ただ試してくださいn === n/-0
。+/- infで実数を完成させる場合、基礎となるゼロシーケンスが正であると見なされない限り、制限は明確に定義されません。
ではES6
、Number.isFinite()
メソッドは渡された値が有限数かどうかを判断します。
Number.isFinite(Infinity); // false
Number.isFinite(NaN); // false
Number.isFinite(-Infinity); // false
Number.isFinite(0); // true
Number.isFinite(2e64); // true
読みやすさだけでなく、さまざまな防御的コーディングの理由でLodashを使用するのが好きです。ES6 は素晴らしく、数値以外の値に関する問題はありませんが、ES6が不可能な場合は、lodashがすでにあるか、コードを簡潔にする必要があります:_ . isFiniteNumber.isFinite
_.isFinite(Infinity); // false
_.isFinite(NaN); // false
_.isFinite(-Infinity); // false
_.isFinite(null); // false
_.isFinite(3); // true
_.isFinite('3'); // true
値がNaN
またはInfinity
タイプであるかどうかを確認する必要があるが、文字列を有効な結果として渡すシナリオに遭遇しました。多くのテキスト文字列はfalse-positiveを生成するのでNaN
、それを回避する簡単な解決策を作りました:
const testInput = input => input + "" === "NaN" || input + "" === "Infinity";
上記のコードは値を文字列に変換し、それらがNaNまたはInfinityと完全に等しいかどうかをチェックします(負の無限大の場合は別のケースを追加する必要があります)。
そう:
testInput(1/0); // true
testInput(parseInt("String")); // true
testInput("String"); // false
NaN
などの、
toString()
代わりに使ったらもっと幸せになりますか?これにより一貫性のない結果が生じる可能性がある理由、またはこの方法が推奨されない理由について、自由に投票または理由を述べてください。これまでのところ、それは答えを探している人のためのオプションを追加するものであり、これが危険で不安定であるなどの具体的な理由はありません
ウィンドウでisFiniteを使用できますisFinite(123)
:
次のような関数を書くことができます:
function isInfinite(num) {
return !isFinite(num);
}
そして次のように使用します:
isInfinite(null); //false
isInfinite(1); //false
isInfinite(0); //false
isInfinite(0.00); //false
isInfinite(NaN); //true
isInfinite(-1.797693134862316E+308); //true
isInfinite(Infinity); //true
isInfinite(-Infinity); //true
isInfinite(+Infinity); //true
isInfinite(undefined); //true
あなたもできるNumber.isFinit
値があまりにもナンバーで、チェックするための、より正確である場合もチェックされ電子undefined
とnull
等...
または、次のようにポリフィルできます。
Number.isFinite = Number.isFinite || function(value) {
return typeof value === 'number' && isFinite(value);
}
Number.(POSITIVE|NEGATIVE)_INFINITY
のではなく、-?Infinity
か-?1/0
?