整数値を変数に設定することが期待されるJavaScriptコードがあります。
何かが壊れているので、alert(A);
を実行しようとすると、NaN
が返されます。 isNaN(A);
はtrueを返します。しかし、alert(typeof(A));
の場合、number
と表示されます。
では、どのようにして変数を同時に数値ではなく数値にすることができますか?たぶん私はNaNが本当に何であるかを誤解しましたか?
編集:回答のおかげで、私は間違っていたことがわかります。
NaN
のタイプはNumber
で、NaN
は「数値ではない」という意味であり、「タイプNumber
でない」と同じではありません。0/0
はNaN
の良い例です。これはまだ数値ですが、JavaScript(および他の誰も)はゼロをゼロで割った実際の値を何と言うことができます。一方、1/0
は、Infinity
ではなくNaN
を返します。私が理解しているように、NaN
はNumber
クラスの標識インスタンスであり、それが意味するところを正確に表しています。適切に表現できない数値結果です。そう 0/0
はNaN
であるという意味では数値ではありませんが、型に関してはis a Number
です。
おそらくそれはNaRN(非表現可能数値)と呼ばれるべきでした。
変数があり、それに0/0の結果を割り当てる場合、変数は依然として数値型ですが、値は未定義です(数値ではありません)。これが発生する可能性のある他の条件がありますが、これはあなたが見ているものを示しています。
オブジェクトのtypeとvalueを混同しています。 NaN
は、タイプnumber
のオブジェクトに割り当てることができる特定の値です。たとえば、ゼロによるゼロ除算の場合、または数値を文字列から変換しようとする場合数を表すものではありません。
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
言われていることと同様に、例えば、文字列で分割すると思います。 NaNを返そうとしますが、それでも数値として扱います。
ウィキペディアの記事 をチェックしてください。詳細があります。