JavaScript数字自相等

时间:2016-09-14 15:25:51

标签: javascript numbers lodash nan

我最近遇到了以下代码:

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还是还有更多内容?

2 个答案:

答案 0 :(得分:2)

number === number只检查number是否不是NaNNaN是唯一不等于自身的值。

在现代浏览器中,

number === number可以替换为!Number.isNaN(number)(请参阅MDN docs)。

答案 1 :(得分:1)

NaN是ECMAscript中唯一不相等的值。

此功能相当于Math.min(Math.max(number, lower), upper),似乎表现相同。如果numberNaN,则会跳过任何处理。

&#13;
&#13;
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)]));
&#13;
&#13;
&#13;