Underscore: _.isNumberNaNはtrueを返したす

䜜成日 2011幎12月15日  Â·  38コメント  Â·  ゜ヌス: jashkenas/underscore

NaNは「NotaNumber」を衚すため、この堎合のisNumberチェックはfalseを返す必芁があるようです。 他の議論から、これは実際には意図的なものであるこずに気づきたした。 たぶん、ドキュメントはこの事実を明瀺的に反映する必芁がありたす。

enhancement fixed

最も参考になるコメント

さお、私は単玔な問題から始めたした。 文字列、数倀、堎合によっおはNaNの入力がありたす。 parseIntずisFiniteを䜿甚しおparseintが成功するかどうかをテストする、ベヌスJavaScriptの簡単な゜リュヌションがありたす。 単玔ですが、完党にクリヌンではなく、私の目暙を自明ではありたせん。 それで、私はこれらの皮類のタスクを実行するために私の完党に玠晎らしいgotoラむブラリを䜿甚するこずにしたした。 最初の怜査で、倀を取り、それが数倀であるかどうかを瀺す関数を芋぀けたした。これは、私の䞀般的な定矩では、私が欲しいず思うものです。

たず、これにより、ドキュメントに行を远加するこずで、ラむブラリのナヌザヌが最初にゞョブに適切な機胜を取埗するのにどのように圹立぀かがわかりたすか 次に、これが意味のある䟋をもう䞀床お願いしたす。

蚀語に぀いお知っおおくべきこずはすべお知っおいるようです。 だから、私の䞭孊2幎生の兄匟が私に䞎えるこずができる暗い解決策でブラむンドショットを吐き出すのではなく、玠晎らしいドキュメントを介しお私たちの残りの郚分を教育するその熟緎の䞀郚を䜿甚できるずいいかもしれたせん。 お時間をいただきありがずうございたす。

党おのコメント38件

そうです、それは故意です。 そしお、私はそれを明確に述べる必芁はないず思いたす。 これたでIEEE754浮動小数点を䜿甚したこずがある人なら誰でも、おそらくNaNが単なる別の浮動小数点倀であるこずを知っおいたす。

関連321での議論

私が䞀般的なWebタスクを実行しおいるずき、isNumberずいう名前の関数は、芋぀かった倀が「これは数倀ですか」ずいう䞀般的なナヌザヌ定矩に答えるかどうかを確認する良い方法のように思えたす。

さらに、NaN倀は、蚈算を劚げる倀を特定するのに圹立぀ように、最初に導入されたように思われたす。 仕様の粟神では、「これは数字ですか」ずいう質問をするず、正解のように芋えたす。 実際、それは「数ではない」ずいうこずです。 この質問に察する答えを真にしたい䞀般的な䟋を挙げおいただければ、ここで黙りたす:)

あなたはisFiniteを探しおいたす。これ

さお、私は単玔な問題から始めたした。 文字列、数倀、堎合によっおはNaNの入力がありたす。 parseIntずisFiniteを䜿甚しおparseintが成功するかどうかをテストする、ベヌスJavaScriptの簡単な゜リュヌションがありたす。 単玔ですが、完党にクリヌンではなく、私の目暙を自明ではありたせん。 それで、私はこれらの皮類のタスクを実行するために私の完党に玠晎らしいgotoラむブラリを䜿甚するこずにしたした。 最初の怜査で、倀を取り、それが数倀であるかどうかを瀺す関数を芋぀けたした。これは、私の䞀般的な定矩では、私が欲しいず思うものです。

たず、これにより、ドキュメントに行を远加するこずで、ラむブラリのナヌザヌが最初にゞョブに適切な機胜を取埗するのにどのように圹立぀かがわかりたすか 次に、これが意味のある䟋をもう䞀床お願いしたす。

蚀語に぀いお知っおおくべきこずはすべお知っおいるようです。 だから、私の䞭孊2幎生の兄匟が私に䞎えるこずができる暗い解決策でブラむンドショットを吐き出すのではなく、玠晎らしいドキュメントを介しお私たちの残りの郚分を教育するその熟緎の䞀郚を䜿甚できるずいいかもしれたせん。 お時間をいただきありがずうございたす。

@jashkenasの考えに興味がありたす。 私は䟮蟱的たたは軜蔑的に聞こえる぀もりはありたせん。 私は時々そのように倖れるこずを知っおいたす。 これらの簡単な答えを出しお、問題がどのように解決されないかを目で芋お、問題をよりよく瀺す方向に䌚話を進めようずしおいるのは事実だず思いたす。

たず、これにより、ドキュメントに行を远加するこずで、ラむブラリのナヌザヌが最初にゞョブに適切な機胜を取埗するのにどのように圹立぀かがわかりたすか

おそらく、確かに。

次に、これが意味のある䟋をもう䞀床お願いしたす。

[[Class]] == "Number"のテスト それは明らかなはずです、それは数字ず䞀臎したす。 自然数、敎数、有限数、実数、有理数など、期埅しおいたサブセットではないかもしれたせんが、確かにすべおの数です。

ずはいえ、ドキュメントに綿毛を远加しすぎるず害を及がす堎合がありたす。 しかし、私はこれがその時の1぀ではないず思いたす。 これは、珟圚の状態で、数倀の抜象的な抂念の解釈が矛盟しおいる可胜性がある開発者にずっお圹立぀可胜性がありたす。 あなたの堎合のように、あなたがテストしたいセットのメンタルモデルをすでに確立しおいお、それからそのテストを実行するために_珟れた_関数を芋぀けたした。 +1 、ただし@jashkenasの考えにはただ興味がありたす。

はい- NaNが枡されたずきに、 _.isNumberがtrueたたはfalseどちらを返すかはたったくわかりたせん。 私は確かにそれを詊さずに芚えおいたせん。 䞊蚘のコミットのドキュメントにメモを远加したした。 ありがずう。

みんなありがずう。 他の誰かがこの同じ問題に遭遇しないかもしれないこずを知っおうれしいです。

これは間違いなく、セマンティクスが技術的事実よりも優先されるべき堎合のように思われたす。 はい、NaNはいく぀かの仕様によるず数字かもしれたせん。 しかし、私が䜕かを尋ねるず、「あなたは番号ですか」ずいう質問がありたす。 そしおそれは「私は数ではない」ず蚀っおいるので、私はそれを信じるべきです。 Not a Number – NaN –間違いなくNumberではありたせん...そしおisNumberはfalseを返す必芁がありたす。

人間にずっお意味のあるものを修正するのではなく、ドキュメントにGotchaを配眮するず、コヌディングにかかる​​時間が短瞮され、ドキュメントをじっくりず芋぀める時間が長くなりたす。

これを再考しおもらえたすか

@contentfree  NaNはfloatのメンバヌです。 JSのすべおの数倀は浮動小数点数です。 私はそれがNaNを圌らが埗るのず同じくらいの数になるず思いたす。 NaNは、「私は数字ではない」ずいう意味ではありたせん。 これは、非数倀の数倀衚珟です。 事件は私の本で閉じられたした。 NaN / Infinity / -Infinity数倀をテストする堎合は、 isFinite䜿甚したす。

死んだ銬を倒すのではなく...

どうしお
obj instanceOf Number

javascript仕様にすでに存圚する必芁なアクションを実行するためのより読みやすい方法がある堎合は、未知の調査に時間を無駄にしない限りラむブラリを䜿甚せずにその方法で実行するようです。

これを意味的に正しく修正する぀もりがない堎合は、ラむブラリから無駄なオヌバヌヘッドず頭痛の皮を取り陀くだけでよいず私は投祚したす。

instanceof挔算子はオブゞェクトに察しおのみ機胜し、プリミティブに察しおは機胜したせん new Number(5) instanceof Number == true; 5 instanceof Number == false 。 たた、ブラりザのフレヌム間では機胜したせん。 [[Class]]を経由しおチェックObject::toStringされ、䞀般的に受け入れられおJavaScriptで最も信頌性の高いタむプのチェック方法であるこずが。

ラむブラリをより䟿利にするための+1ず、同じむンスタンスでJavaScriptを初めお䜿甚するナヌザヌを教育したす。

提案
_.isNumberobject、[isFinite];

これにより、isFiniteがおそらく最初に求めおいたものであるこずを孊びながら、この萜ずし穎に巻き蟌たれたずきに、珟圚の実装にtrueを簡単に远加できたす。

私の2c

@ nickl-興味深いアむデアですが、その堎合は単にisFiniteを䜿甚しないのはなぜですか

あるいは、 _.isNaNすでに存圚するため、察称性のために_.isFinite远加できる可胜性がありたす。

_.isFinite = function (value) {
  return value > -1 / 0 && value < 1 / 0;
};

@kitcambridge

私が予枬する唯䞀の問題は、文字列が有限の「0x0」、「0xF」、「2」などずしお枡されるこずです。したがっお、䜕があっおも、_。isNumberたたは同等のものず組み合わせる必芁がありたす。

_.isFinite = function (obj) {
  return obj > -1/0 && obj < 1/0 && _.isNumber(obj);
};

数倀テストにval === + valを䜿甚するこずで、5文字を削るこずができたす。

_.isFinite = function (obj) {
  return obj > -1/0 && obj < 1/0 && obj === +obj;
};

@octatone確かに、それは公平だず思いたす...技術的には、これらの文字列は数倀比范で䜿甚できるため有限ですむンタプリタはそれらを数倀に匷制する必芁がありたすが、提案は既存のアンダヌスコアタむプチェック関数ずより䞀貫性がありたす。

既存の_.isValidDateずむンラむンであり、isFinite匕数を混同しない_、isValidNumberはどうですか

@ nickl-

NaNおよびInfinity有効な数倀です。 この関数にisValidNumberずいう名前を付けるず、その目的が混乱するのでしょうか。それずも、isNumberの名前をisValidNumberに倉曎するずいうこずですか。

NaNおよびInfinity有効な数倀です。 この関数にisValidNumberずいう名前を付けるず、その目的が混乱するず思いたす。

同意したす。

名前の倉曎は蚀わなかった...

私もその_.isNumber(NaN) === trueを知っお驚いた。

@contentfreeのhttps://github.com/jashkenas/underscore/issues/406#issuecomment-4144992に同意する傟向があるず思いたす。 ゜フトりェア゚ンゞニアリングでは、この特定のケヌスの原則である「驚き最小の原則」もありたす。 ;-)

そしお、これほど倚くの人々がそれに぀いお混乱しおいるのを芋た埌、非ハヌドコアjs-codersの人間がその名前を芋たずきに期埅するこずを関数に実行させるこずは理にかなっおいるず思いたす。

ちょうど私の小さな2¢ ™

_.isNaNも混乱を招きたす。 ドキュメント内

泚これは、ネむティブのisNaN関数ず同じではありたせん。この関数は、undefinedなど、他の倚くの非数倀に察しおもtrueを返したす。

通垞の意味では、 undefinedは確かに非数です。

私は意味論的建蚭性に投祚したす、 isNumber == Not a number笑。 浮動小数点倀のチェックに぀いお詳しく説明する必芁がある堎合は、他の方法で行うず思いたすか

私は意味論的建蚭性に投祚したす、

いや、 -Infinity 、 Infinity 、 Object(2)同じように、 [[Class]]数字です。 これは、関数もオブゞェクトであるように、開発者が孊ぶこずの1぀です。 このメ゜ッドの範囲倖である番号に察しお䜕らかの圢匏の怜蚌を実行する必芁がある可胜性がありたす。 䟋えば、それはより倧きいです-1未満Math.pow(2,32) 、たたは敎数。 -Infinity 、 InfinityたたはNaN堎合、バリデヌタヌずしお_.isFiniteを䜿甚したす。 同様に、 _.isDateは、日付オブゞェクトが有効な日付を衚しおいるかどうかを怜蚌したせん。

「seealsoisFinite」および「seealso«䜕かが実際に䜿甚できる数倀であるかどうかを刀断する方法を列挙する゚ッセむ」でドキュメントを曎新するのはどうですか

@michaelficarra仕様では、NaNは非垞に数倀型であるこずを私は知っおいたす。 しかし、プログラマヌが尋ねるずきに考えおいるのは、これが数字なのかずいうこずですか

私たちのほずんどが知りたいのは、ほずんどの堎合、これを基本的な算術に䜿甚できるかどうかです。 したがっお、isNumberx&& isFinitexに移動する必芁がありたす。 そしお、それは倧䞈倫だず思いたす。 しかし、それは新しいプログラマヌにずっお倧きな萜ずし穎であり、よく読めたせん。

厳密に英語の芳点からは、isNumberずいうテストからtrueを返すNot a NumberNaNはたったく意味がありたせん。 これは、isNumericたたはisNumericTypeずいう名前の方が適切ではないでしょうか。

少なくずも人々がこれに最初に盎面したずき、これがバグを远加し、倚くの時間を浪費するこずは間違いありたせん。

したがっお、isNumberx&& isFinitexに移動する必芁がありたす。

最近、 _.isFinite実装をES6Number.isFiniteに埓うように
これにより、倀が数倀プリミティブであり、有限であり、この䞀般的なケヌスを凊理する必芁がありたす。

他の[[Class]]チェックメ゜ッドず䞀臎する_.isNumberの動䜜を倉曎する必芁はありたせん。

厳密に英語の芳点からは、isNumberずいうテストからtrueを返すNot a NumberNaNはたったく意味がありたせん。 これは、isNumericたたはisNumericTypeずいう名前の方が適切ではないでしょうか。

怜蚌、 _.isNumber 、および_.isDateに関する私のコメントを参照し

@ jdalton_.isDateで䞀定の動䜜に぀いおは正しいです。 そしお、皆さんはアンダヌスコアを䜿っお玠晎らしい仕事をしおいるので、決定は本圓にあなた次第だず思いたす。

しかし、それは非垞に盎感に反しおいるように思われるので、数字ではないず呌ばれるものは数字です。

@Walms 100同意したす。 この堎合、NaNが_技術的に_数倀であるずするず、プログラマヌず盎感はステヌトメントの絶察的な「正確さ」を無効にする必芁があるず思いたす。

しかし、それは非垞に盎感に反しおいるように思われるので、数字ではないず呌ばれるものは数字です。

その意味で、それはよりもはやカりンタヌ盎感的である_.isNumber返すtrue 、数字のオブゞェクトに察しおObject(2)の型であるこずをobject 

これらは[[Class]]メ゜ッドです。 たぶん、それはドキュメントでもっず明確にする必芁がありたす。

私はすでに、 _.isFinite ES6 Number.isFinite埓わせるずいう実行可胜な代替案を提案したした。 基本的なis-number必芁な堎合は、 typeof x == 'number'たす。 倀がNaN 、 Infinity 、たたは-Infinityでないこずを怜蚌する必芁がある堎合は、 Infinityすべおの[[Class]] Number 、次に_.isFiniteが行く方法です。

よりきめ现かい数倀メ゜ッドに぀いおは、アンダヌスコア-寄皿を参照しおください。 _.isNumeric 、 _.isInteger 、 _.isZero 、 _.isEven 、 _.isOdd 、 _.isFloat 、 _.isNegative 、 _.isPositive 。

@jdalton最埌の2぀のコメントは、これが混乱しおいるず思う理由を明確にするのに本圓に圹立ったず思いたす。

_.isNumberの前にisが付いおいるずいう事実によっお、_。isNumberにコンテキストが䞎えられおいるこずは、最初はわかりたせんでした。぀たり、タむプチェックでした。 このコンテキストでは、あなたは完党に正しいです。_。isNumberがNaNに察しおfalseを返すこずは意味がありたせん。

しかし、アンダヌスコア-contribずisFiniteはこのコンテキストを壊しおいるようです。 最初はisですが、タむプではなく倀を怜蚎しおいたす。 そしお、これは私が混乱しおいるず思うずころです。関数名からコンテキストを決定する明確な方法がありたせん。

これはすべお、これを修正する方法が芋圓たらないず蚀っおいたした。

ここでの問題は、数字には盎感的でないこずがいく぀かあるずいうこずだず思いたす。 ただし、それらは䞀貫した方法で動䜜したす。 この堎合、䞀貫性を䜎くするこずで_.isNumberより盎感的にするこずができ、最終的には他の堎合には盎感的でなくなりたす。

ここにいく぀かの具䜓的な䟋がありたす

# If you add two Numbers together you always get another Number back
# This function should always return true no matter what you pass it
closedUnderAddition = (a, b) -> !isNumber(a) || !isNumber(b) || isNumber(a + b)

closedUnderAddition(1,1) == true
closedUnderAddition(Number.MAX_INT,2**970) == true # false if isNumber checks finiteness

# If you divide two Numbers you always get another Number back
closedUnderDivision = (a, b) -> !isNumber(a) || !isNumber(b) || isNumber(a / b)

closedUnderDivision(1, 2) == true
closedUnderDivision(1, 0) == true # false if isNumber checks finiteness
closedUnderDivision(0, 0) == true # false if isNumber checks finiteness or NaN-ness

# Anything you cast to a Number is a Number
castsToNumber = (x) -> isNumber(Number(x))

castsToNumber(1) == true
castsToNumber(Infinity) == true # false if isNumber checks finiteness
castsToNumber("bees") == true # false if isNumber checks finiteness or NaN-ness
castsToNumber("3") == true

michaelficarraが蚀ったように

NaNは「私は数ではない」ずいう意味ではありたせん。 これは、非数倀の数倀衚珟です。

蚀い換えれば、「数字」ず数字がありたす。 NaNは「数」ではないかもしれたせんが、Infinity、-Infinity、および-0のようなばかげたものず䞀緒に絶察に数です。 ただし、ワむルドでりヌリヌであるず同時に、Numberの定矩は明確に指定されおおり、䞀貫しお動䜜したす。

䞀方、「数字」は明確に定矩されおいない抂念であり、話しおいる盞手に応じお、䞊蚘のいずれかたたはたったく含たれない可胜性があり、数倀文字列、ブヌル、真倜䞭など、あらゆる皮類のものが含たれる可胜性がありたす。 それは問題ありたせんが、すべおの人の定矩に準拠した゜リュヌションはありたせん。

そのため、これは本質的にドキュメントの問題だず思いたす。

たた、「数字」は他の人の蚀葉のように芋えなくなりたしたか

良い点、@ sgentle。 前者は客芳的な尺床であるのに察し、私たちは盎感性よりも䞀貫性に投祚したすが、このスレッドが瀺すように盎感的であるこずに党員が同意するわけではありたせん。

NaNを「数字ではない」ずしお扱わないでください。 NaNは特別な倀です。

NaNを「数字ではない」ずしお扱わないでください。 NaNは特別な倀です。

ええ、でもそれは「数字ではない」ず呌ばれおいたす。
私にずっおそれはこのようなものです
var _false = "true";
ええ、あなたは_falseが真であるこずを孊ぶこずができたすが、それは正圓な理由もなく混乱しおいたす。

@Walmsそれは悪い名前ですが、それはJSのせいではありたせん。 それを「NaN」ず名付けた男を非難するかもしれたせん。 http://en.wikipedia.org/wiki/NaN

ああ、私は_.isNumber(NaN)がfalseを返すこずを望みたす...これが理由であるこずに気付くたで、ここで深刻な頭をかきむしりたした。

if (isNaN(Number(value))) {
  alert('Number required.');
}

@pspi同意したした。 _.isNumber() _semantic_の意味で正しく動䜜させるこずは、私が実際にそれを䜿甚するこずは決しおないこずを意味したす。 ._isFinite()は、私が期埅するように機胜する関数のようです。

そしおもちろん、これを投皿した翌日、匕数が数倀ではないにもかかわらず、 _.isFinite('1')がtrueであるこずがわかりたした。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡

関連する問題

jdalton picture jdalton  Â·  4コメント

acl0056 picture acl0056  Â·  5コメント

xiaoliwang picture xiaoliwang  Â·  3コメント

danilopolani picture danilopolani  Â·  5コメント

zackschuster picture zackschuster  Â·  5コメント