29

Google Closure Librarygoog.math.isFiniteNumberの関数に出会いました。それが行うことは、与えられた数が有限であるかどうかをチェックすることです。NaN

基礎となるコードは次のとおりです。

goog.math.isFiniteNumber = function(num) {
  return isFinite(num) && !isNaN(num);
};

そのため、最初にネイティブ関数を使用して数値が有限かどうかをチェックし、次に数値が を使用してisFiniteいないことを確認するために追加のチェックを行います。NaNisNaN

ただし、isFinite引数が の場合は既に false を返しますNaN。では、check for にはどのような利点があるのisNaNでしょうか。

4

5 に答える 5

21

唯一の違いは次のとおりです。

!isNan(1/0) // --> true
isFinite(1/0) // --> false

isNaN は、引数が数値かどうかをチェックします。無限大 (+/-) も数値であるため、isNaN チェックには合格しますが、isFinite チェックには合格しません。

** 数値として解析できる文字列 ("2"、"3.14") があると、isNaN は false を返すことに注意してください。

お役に立てれば。

PS: user1170379 の回答はほぼ完璧でした。

于 2013-05-30T15:47:49.313 に答える
2

これを読んだ後、あなたは[なぜ?]と推論するかもしれません:

NaN は、渡された値が無限かどうかをチェックしません。入力 val が "Type: Number" の最終結果に評価されるかどうかをチェックします。isNaN(string) が受け入れられるため、次のようになります: isNaN("3.14") //false (これは true を意味し、指定されたトークンは型 Number に正常にダック変換されます)

(x/y); のような単純な数学演算であっても、入力値がたまたま未解決のブルート ナンバーである可能性があることは理解できます。これにより、(+/-無限大)の数値が得られる可能性があります。

ここで x=1、y=0; (1/0) を意味します。次に、isNaN(x/y) は最初に isNaN(1/0) に評価されます。それから isNaN(infinity) //false へ。(1/0)=infinity は "number" 型であるため、typeof(1/0) //"number" isNaN は false を返す必要があります。

最終結果の数が期待される場所に「無限」を入れたくありません。

于 2012-01-26T00:11:30.083 に答える
1

おそらく私が実装したのと同じ理由で(isfinite(num) && isfinite(-num))、チェックしたにもかかわらず、「-nan」をデータベースに入れることについて不平を言うmysqlからエラーが発生していましたisfinite(field)...

このテーマに関する有用な記事はhttp://jacksondunstan.com/articles/983で、最適化を提供しています((d*0.0)==0.0)

于 2011-09-20T23:25:53.737 に答える
-5

isFiniteこのように機能した場合isFiniteNumber、isFiniteNumber を記述する理由はありません。おそらく、NaN を有限として扱うブラウザがどこかにあるでしょう。

于 2011-04-16T23:02:54.850 に答える