Soooooo isNaN
はJavaScriptで明らかに壊れています。
isNaN('')
isNaN(' ')
isNaN(true)
isNaN(false)
isNaN([0])
それらがすべてに見えるとき偽を返す...数字ではない...
ECMAScript 6では、ドラフトに新しいNumber.isNaN
しかし、これも(imo)のように見えます。
期待する
Number.isNaN('RAWRRR')
文字列であり、数値に変換できないため、trueを返すには...ただし...
私が考えるものは...数字ではなく、確かに数字ではないようです...
http://people.mozilla.org/~jorendorff/es6-draft.html#sec-isfinite-number
MDNの例はこう言います:
Number.isNaN( "blabla"); //例これはisNaNに当てはまります。
これが「元のグローバルisNaNのより堅牢なバージョン」であることがわかりません。物事が数ではないかどうかを確認することができないとき。
これは、isNaNをチェックするだけでなく、実際の型チェックも行うことを意味します...これはばかげているようです...
http://people.mozilla.org/~jorendorff/es6-draft.html#sec-isnan-number
ここのES3ドラフトは基本的に、Number.NaNを除き、すべてが常に偽であると述べています。
他の誰かがこれが壊れていると思いますか、またはisNaNのポイントを理解していないだけですか?
isNaN()
とNumber.isNaN()
は両方とも、値がNaN
値を表すかどうかをテストします(または、isNaN()
の場合、数値型の値に変換できる)。言い換えれば、「NaN」は単に「この値は数値ではない」という意味ではなく、「この値は数値 IEEE-754による非数値」であることを具体的に意味します。
上記のすべてのテストでfalseが返される理由は、指定されたすべての値をNaN
ではない数値に変換できるためです。
Number('') // 0
Number(' ') // 0
Number(true) // 1
Number(false) // 0
Number([0]) // 0
isNaN()
が "壊れている"理由は、表面上は、値をテストするときに型変換が行われないはずだからです。それが、Number.isNaN()
が対処するように設計されている問題です。特に、Number.isNaN()
は、のみ値が数値型の値である場合、値をNaN
と比較しようとします。値NaN
のタイプは数値であるため、他のタイプは文字通り「数値ではない」場合でもfalseを返します。 isNaN()
および Number.isNaN()
については、それぞれのMDNドキュメントを参照してください。
値が数値型であるかどうかを単に確認したい場合は、その値がNaN
であっても、代わりにtypeof
を使用します。
typeof 'RAWRRR' === 'number' // false
いいえ、元のisNaN
は壊れています。 isNaN
のポイントを理解していません。
これらの関数の両方の目的は、何かがNaN
の値を持っているかどうかを判断することです。これは、something === NaN
は常にfalse
になるため、これをテストするために使用することはできません。 (サイドノート: something !== something
は、直感的ではありませんが、NaN
のテストです。
isNaN
が破損する理由は、値が実際にtrue
でない場合にNaN
を返すことができるからです。これは、最初に値を数値に強制するためです。
そう
isNaN("hello")
true
ですが、"hello"
はNaN
ではありません。
値が実際に有限数であるかどうかを確認する場合は、次を使用できます。
Number.isFinite(value)
値が有限数であるか、文字列表現であるかをテストする場合は、次を使用できます。
Number.isFinite(value) || (Number.isFinite(Number(value)) && typeof value === 'string')
2つの主な違いは、グローバルisNaN(x)
関数がパラメーターx
の数値への変換を実行することです。そう
_isNaN("blabla") === true
_
Number("blabla")
はNaN
になるため
ここには「数ではない」という2つの定義があり、それがおそらく混乱の原因です。 Number.isNaN(x)
は、IEEE 754浮動小数点仕様の非数の定義に対してのみtrueを返します。例:
_Number.isNaN(Math.sqrt(-1))
_
渡されるオブジェクトが数値型かどうかを判断するのとは対照的です。その方法は次のとおりです。
_typeof x === "number"
x === +x
Object.prototype.toString.call(x) === "[object Number]"
_
コメントで述べたように、isNaN()
とNumber.isNaN()
はどちらも、渡した値がNaN
の値と等しくないことを確認します。ここで重要なのは、NaN
は実際の値であり、評価結果ではないことです。 "blabla"
はString
であり、値は"blabla"
です。つまり、値"NaN"
ではありません。
もっともらしい解決策は次のようなことです:
Number.isNaN(Number("blabla")); //returns true.
基本的に、window.isNaN
は数値への型変換を実行し、それがNaNかどうかを確認します。一方、Number.isNaN
は引数を数値に変換しようとしません。基本的に、window.isNaN
とNumber.isNaN
はそのように機能すると考えることができます。
window.isNaN = function(n){
return Number(n) !== Number(n);
}
window.Number.isNaN = function(n){
return n !== n;
}
isNaN
またはwindow.
を呼び出すためにNumber.isNaN
を実際に使用する必要はないことに注意してください。むしろ、混乱を減らすために、同じ名前の2つのメソッドをより明確に区別するために使用しています。
〜ハッピーコーディング!
NaNはjavascriptでそれ自体と等しくない唯一の値であるため、次のように動作します。
Number.isNaN = Number.isNaN || function(value) {
return value !== value;
}
Per、MDN、 Math関数が失敗したときの戻り値は(NaN)です ですから、特定の値です。おそらく、より良い名前はMathFunctionFailed
だったでしょう。
何かが数値であるかどうかを判断するには、広範囲の非数値入力でうまく失敗する解析が必要で、数値と数値を表す文字列を正常に検出します。
function isNumber(v) {return Number.isNaN(parseFloat(v)); }
1。 Number.isNaN
alert(Number.isNaN('Hello')); // false
true
はHello
であり、そのNot A Number
であるため、string
を返しませんか?しかし、false
を返す理由を教えてください。
MDN docs 言う:
指定された値がNaNで、タイプがNumberの場合、true。それ以外の場合はfalse。
はいHello
値はNaN
ですが、タイプはstring
です。次のようにタイプを確認できます。
alert(typeof `Hello`); // string
使用法:
値がNaN
とtype
の両方であることを確認する場合に使用します。
2。 isNaN
alert(isNaN('Hello')); // true
MDN docs 言う:
指定された値がNaNの場合はtrue。それ以外の場合はfalse。
使用法:
値が単なるNaNであることを確認する場合に使用します。
3。 jQuery.isNumeric()
Jquery Docs 言います:
引数がJavaScript番号を表すかどうかを決定します。
alert($.isNumeric('Hello')); // false
alert($.isNumeric(3)); //true
使用法:
値が数値であるか、数値に変換できるかどうかを確認するときに使用します。
@phillは、他の応答で述べられているように、どちらも壊れていません。
_Number.isNaN
_はNumber
の数値またはインスタンスで機能するため、Number.isNaN(new Date(NaN))
でもfalseです。
一方、isNaN
はジェネリックであり、チェックする前にパラメータを数値に変換しようとします。
値がNaN
である(または含む)かどうかを判別する場合、この関数を使用できます。
_function valueIsNaN(value) {
// eslint-disable-next-line no-self-compare
return value !== value || typeof value == 'object' && Number.isNaN(value.valueOf());
}
_