JavaScript 数字自相等

Hak*_*kar 5 javascript numbers nan lodash

我最近遇到了以下代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

函数开头的条件很有趣。

  if (number === number) {
Run Code Online (Sandbox Code Playgroud)

我在 Chrome 中测试了以下内容:

var number = undefined;
number === number
true
number = null
number === number
true
number = NaN
number === number
false
Run Code Online (Sandbox Code Playgroud)

number === number简单地检查 NaN 还是还有更多内容?

ssu*_*ube 2

NaN是 ECMAscript 中唯一不等于自身的值。

这个函数等效Math.min(Math.max(number, lower), upper)并且看起来行为相同。number如果是,它将跳过任何处理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;
}

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)]));
Run Code Online (Sandbox Code Playgroud)