web-dev-qa-db-ja.com

JavaScriptが数値は数値ではないと言うのはなぜですか?

整数値を変数に設定することが期待されるJavaScriptコードがあります。

何かが壊れているので、alert(A);を実行しようとすると、NaNが返されます。 isNaN(A);はtrueを返します。しかし、alert(typeof(A));の場合、numberと表示されます。

では、どのようにして変数を同時に数値ではなく数値にすることができますか?たぶん私はNaNが本当に何であるかを誤解しましたか?


編集:回答のおかげで、私は間違っていたことがわかります。

  • NaNのタイプはNumberで、
  • NaNは「数値ではない」という意味であり、「タイプNumberでない」と同じではありません。
  • 0/0NaNの良い例です。これはまだ数値ですが、JavaScript(および他の誰も)はゼロをゼロで割った実際の値を何と言うことができます。一方、1/0は、InfinityではなくNaNを返します。
28

私が理解しているように、NaNNumberクラスの標識インスタンスであり、それが意味するところを正確に表しています。適切に表現できない数値結果です。そう 0/0NaNであるという意味では数値ではありませんが、型に関してはis a Numberです。

おそらくそれはNaRN(非表現可能数値)と呼ばれるべきでした。

21
Andrzej Doyle

変数があり、それに0/0の結果を割り当てる場合、変数は依然として数値型ですが、値は未定義です(数値ではありません)。これが発生する可能性のある他の条件がありますが、これはあなたが見ているものを示しています。

14
tvanfosson

オブジェクトのtypevalueを混同しています。 NaNは、タイプnumberのオブジェクトに割り当てることができる特定の値です。たとえば、ゼロによるゼロ除算の場合、または数値を文字列から変換しようとする場合数を表すものではありません。

1
Janick Bernet

W3Schoolsからのいくつかの定義:

無限大:正/負の無限大を表す数値

POSITIVE_INFINITYプロパティは無限大を表し、オーバーフローで返されます。 NEGATIVE_INFINITY、負の無限大を表します(オーバーフロー時に返されます)。

NaNプロパティは「非数」の値を表します。このプロパティは、値が有効な数値ではないことを示しています。

IsFinite()関数は、数値が有限の正当な数値であるかどうかを判別します。この関数は、値が+ infinity、-infinity、またはNaNの場合にfalseを返します。

いくつかのテスト:

 var n1 = 1/0;
  var n2 = 0/0;
  var n3 = (Number.MAX_VALUE)*2; //overflow

  var b1 = Number.POSITIVE_INFINITY == n1;
  var b2 = Number.POSITIVE_INFINITY == n2;
  var b2n = Number.NEGATIVE_INFINITY == n2;
  var b3 = Number.POSITIVE_INFINITY == n3;

  var msg = "n1=" + n1 + ", n2=" + n2 + ", n3=" + n3;

  msg += "<br/> n1 Is POSITIVE_INFINITY=" + b1;
  msg += "<br/> n2 Is POSITIVE_INFINITY=" + b2;
  msg += "<br/> n2 Is POSITIVE_INFINITY=" + b2n;
  msg += "<br/> n3 Is POSITIVE_INFINITY=" + b3;

  msg += "<br/> n1 IsFinite=" + isFinite(n1);
  msg += "<br/> n2 IsFinite=" + isFinite(n2);
  msg += "<br/> n3 IsFinite=" + isFinite(n3);


  msg += "<br/> n1 + n1 =" + (n1 + n1) ;
  msg += "<br/> n1 - n1 =" + (n1 - n1) ;
  msg += "<br/> n2 + n1 =" + (n2 + n1) ;

  document.write(msg);

ショー

n1=Infinity, n2=NaN, n3=Infinity
n1 Is POSITIVE_INFINITY=true
n2 Is POSITIVE_INFINITY=false
n2 Is POSITIVE_INFINITY=false
n3 Is POSITIVE_INFINITY=true
n1 IsFinite=false
n2 IsFinite=false
n3 IsFinite=false
n1 + n1 =Infinity
n1 - n1 =NaN
n1 - n1 =NaN
1
user347594

言われていることと同様に、例えば、文字列で分割すると思います。 NaNを返そうとしますが、それでも数値として扱います。

0
qw3n

ウィキペディアの記事 をチェックしてください。詳細があります。

0
Jørgen Fogh