web-dev-qa-db-ja.com

isNaN()よりも壊れているNumber.IsNaN()

Soooooo isNaNはJavaScriptで明らかに壊れています。

isNaN('')
isNaN('   ')
isNaN(true)
isNaN(false)
isNaN([0])

それらがすべてに見えるとき偽を返す...数字ではない...

ECMAScript 6では、ドラフトに新しいNumber.isNaNしかし、これも(imo)のように見えます。

期待する

Number.isNaN('RAWRRR')

文字列であり、数値に変換できないため、trueを返すには...ただし...

enter image description here

私が考えるものは...数字ではなく、確かに数字ではないようです...

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のポイントを理解していないだけですか?

47
Phill

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
89
BoltClock

いいえ、元の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')
19
JLRishe

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]"
_
7
Tom Fenech

コメントで述べたように、isNaN()Number.isNaN()はどちらも、渡した値がNaNの値と等しくないことを確認します。ここで重要なのは、NaNは実際の値であり、評価結果ではないことです。 "blabla"Stringであり、値は"blabla"です。つまり、値"NaN"ではありません。

もっともらしい解決策は次のようなことです:

Number.isNaN(Number("blabla")); //returns true.
5
kaspermoerch

基本的に、window.isNaNは数値への型変換を実行し、それがNaNかどうかを確認します。一方、Number.isNaNは引数を数値に変換しようとしません。基本的に、window.isNaNNumber.isNaNはそのように機能すると考えることができます。

window.isNaN = function(n){
    return Number(n) !== Number(n);
}

window.Number.isNaN = function(n){
    return n !== n;
}

isNaNまたはwindow.を呼び出すためにNumber.isNaNを実際に使用する必要はないことに注意してください。むしろ、混乱を減らすために、同じ名前の2つのメソッドをより明確に区別するために使用しています。

〜ハッピーコーディング!

3
Jack Giffin

NaNはjavascriptでそれ自体と等しくない唯一の値であるため、次のように動作します。

Number.isNaN = Number.isNaN || function(value) {     
    return value !== value;
}
1
sendon1982

Per、MDN、 Math関数が失敗したときの戻り値は(NaN)です ですから、特定の値です。おそらく、より良い名前はMathFunctionFailedだったでしょう。

何かが数値であるかどうかを判断するには、広範囲の非数値入力でうまく失敗する解析が必要で、数値と数値を表す文字列を正常に検出します。

function isNumber(v) {return Number.isNaN(parseFloat(v)); }

1
George

1。 Number.isNaN

alert(Number.isNaN('Hello')); // false 

trueHelloであり、そのNot A Numberであるため、stringを返しませんか?しかし、falseを返す理由を教えてください。

MDN docs 言う:

指定された値がNaNで、タイプがNumberの場合、true。それ以外の場合はfalse。

はいHello値はNaNですが、タイプはstringです。次のようにタイプを確認できます。

alert(typeof `Hello`);  // string

使用法:

値がNaNtypeの両方であることを確認する場合に使用します。

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

使用法:

値が数値であるか、数値に変換できるかどうかを確認するときに使用します。

参照

0
stom

@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());
}
_
0
aMarCruz