underscore.js ソースから取得:
_.isNaN = function(obj) {
return _.isNumber(obj) && obj != +obj;
};
なぜ彼らはこのようにしたのですか?上記の実装は次と同等ですか:
_.isNaN = function(obj) {
return obj !== obj;
};
もしそうなら、なぜ「より複雑な」バージョンなのですか? そうでない場合、動作の違いは何ですか?
underscore.js ソースから取得:
_.isNaN = function(obj) {
return _.isNumber(obj) && obj != +obj;
};
なぜ彼らはこのようにしたのですか?上記の実装は次と同等ですか:
_.isNaN = function(obj) {
return obj !== obj;
};
もしそうなら、なぜ「より複雑な」バージョンなのですか? そうでない場合、動作の違いは何ですか?
_.isNaN(new Number(NaN))
true を返します。
これは設計によるものです。
var n = new Number(NaN);
console.log(_.isNaN(n), n!==n); // logs true, false
ホスト環境 (例: Web ブラウザー環境) は、それ自体とは異なる他の値を導入する場合があります。この_.isNumber(obj)
部分は、入力が数値であることを確認するため、値が渡された場合に_.isNaN
のみ戻ります。true
NaN
+の前に値がない値の前に+が指定されている場合、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
}
私がどこか間違っていたら誰かが私を訂正します。
_.isNaN のケースを 1 つ見つけました。そこにオブジェクトを渡すと、ネイティブの結果とは異なる結果が表示されます
_.isNaN({}) => false
//but
isNaN({}) => true