2016-09-14 11 views
4

私は最近、次のコードに出くわした:JavaScriptの数値の自己平等

function baseClamp(number, lower, upper) { 
    if (number === number) { 
    if (upper !== undefined) { 
     number = number <= upper ? number : upper; 
    } 
    if (lower !== undefined) { 
     number = number >= lower ? number : lower; 
    } 
    } 
    return number; 
} 

条件を関数の先頭には、興味深いものです。

if (number === number) { 

私はChromeで次のようにテストした:

var number = undefined; 
number === number 
true 
number = null 
number === number 
true 
number = NaN 
number === number 
false 

number === numberは単にNaNのために確認するか、そこにもっとあるでしょうか?

+1

これは確かに 'NaN'をチェックします。 isNaNはちょっと...壊れているので、これは最も簡単なチェックの1つです。 – vlaz

+0

[通常、NaNとNaNをNaNと比較すると、つまり、double equalsまたはtriple equalsのいずれかを使用すると、IEEE 754によればfalseと評価されます。](https://developer.mozilla.org/en-US/docs/Web/JavaScript/ Equality_comparisons_and_sameness) – Xotic750

+0

私はこれが(提供された投稿の)重複であることに同意しません。回答は重複するかもしれませんが、質問は全く異なって言います。 http://blog.stackoverflow.com/2010/11/dr-strangedupe-or-how-i-learned-to-stop-worrying-and-love-duplication/を参照してください。検索エンジンを使用してその特定のタイトルを見ると、他の質問をクリックすることはほとんどありません。交換の – Hakkar

答えて

1

NaNは、ECMAscriptで唯一の値であり、それ自体は同じではありません。

この機能はMath.min(Math.max(number, lower), upper)に相当し、同じように動作するようです。 numberNaNの場合、処理はスキップされます。

function baseClamp(number, lower, upper) { 
 
    if (number === number) { 
 
    if (upper !== undefined) { 
 
     number = number <= upper ? number : upper; 
 
    } 
 
    if (lower !== undefined) { 
 
     number = number >= lower ? number : lower; 
 
    } 
 
    } 
 
    return number; 
 
} 
 

 
function mathClamp(number, lower, upper) { 
 
    return Math.min(Math.max(number, lower), upper); 
 
} 
 

 
console.log([-10, 0, 10, NaN].map(it => [baseClamp(it, 0, 10), mathClamp(it, 0, 10)]));

2

number === numbernumberNaNない場合は、単純にチェックします。 NaNはそれ自身と等しくない唯一の値です。現代のブラウザでは!Number.isNaN(number)MDN docs参照)で置き換えることができます。

+0

:私は同意します。私はロダシュは自己が適合性をチェックするのと同じであると信じている。 – vlaz