7

underscore.js ソースから取得:

_.isNaN = function(obj) {
  return _.isNumber(obj) && obj != +obj;
};

なぜ彼らはこのようにしたのですか?上記の実装は次と同等ですか:

_.isNaN = function(obj) {
  return obj !== obj;
};

もしそうなら、なぜ「より複雑な」バージョンなのですか? そうでない場合、動作の違いは何ですか?

4

4 に答える 4

4

_.isNaN(new Number(NaN))true を返します。

これは設計によるものです

var n = new Number(NaN);
console.log(_.isNaN(n), n!==n); // logs true, false
于 2013-03-02T15:31:59.653 に答える
1

ホスト環境 (例: Web ブラウザー環境) は、それ自体とは異なる他の値を導入する場合があります。この_.isNumber(obj)部分は、入力が数値であることを確認するため、値が渡された場合に_.isNaNのみ戻ります。trueNaN

于 2013-03-02T15:52:21.753 に答える
0

+の前に値がない値の前に+が指定されている場合、JavaScriptエンジンはその変数を数値に変換しようとします。有効な場合は数値を返し、それ以外の場合はNaNを返します。例えば

 + "1" // is equal to integer value 1
 + "a1" // will be NaN because "a1" is not a valid number

上記の場合

 +"a1" != "a1" // true, so this is not a number, one case is satisfied
 +"1" == "1" // true, so it is number

別の単純なケースは、以下の式がこの出力を与える理由です。

 console.log("Why I am " + typeof + "");
 // returns "Why I am number"

+""は0だからです。

数字かどうかを確認したい場合は、以下の機能を使用できます

function isNumber(a){ 
   /* first method : */  return (+a == a);
   /* second method : */  return (+(+a) >= 0);
   // And so many other exists
}

私がどこか間違っていたら誰かが私を訂正します。

于 2013-03-02T15:56:41.010 に答える
0

_.isNaN のケースを 1 つ見つけました。そこにオブジェクトを渡すと、ネイティブの結果とは異なる結果が表示されます

_.isNaN({}) => false
//but
isNaN({}) => true
于 2016-03-24T13:33:25.727 に答える