【问题标题】:Understanding underscore's implementation of isNaN理解 underscore 的 isNaN 实现
【发布时间】:2013-02-17 00:53:15
【问题描述】:

取自 underscore.js 源代码:

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

他们为什么这样做?上述实现是否等同于:

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

如果是,为什么是“更复杂”的版本?如果不是,行为差异是什么?

【问题讨论】:

  • 或者更简单,原生的isNaN函数...
  • @Kolink 取自 Underscore 文档:“注意:这与原生 isNaN 函数不同,如果变量未定义,它也会返回 true”
  • @Kolink isNaN(undefined) 是真的。
  • 就像isNaN("NaN")...
  • “不是数字”函数的目的是不是要找出变量是否不是数字?

标签: javascript numbers underscore.js nan


【解决方案1】:

_.isNaN(new Number(NaN)) 返回真。

那是by design

var n = new Number(NaN);
console.log(_.isNaN(n), n!==n); // logs true, false

【讨论】:

  • 如今Number.isNaN()也将如此。
  • @Pointy Number.isNaN(new Number(NaN)) 从 Chrome 26.0.1410.65 和 FireFox 21 开始返回 false
  • @Andbdrew 是的,这就是我的意思 - Number.isNaN() 仅在其参数是原始类型“数字”(不是“数字”)并且是特殊的“NaN”常量时才返回 true。跨度>
【解决方案2】:

宿主环境(例如网络浏览器环境)可能会引入其他不等于自身的值。 _.isNumber(obj) 部分确保输入是数字值,因此 _.isNaN 仅在传递 NaN 值时返回 true

【讨论】:

  • 您有没有引入不等于自身的值的主机环境示例?
  • @Randomblue 不。我从未听说过这样的值,因此 可能
  • 好的。不过,聪明的想法是,理论上主机环境会推迟所有的赌注。
【解决方案3】:

如果 + 之前没有给 + 任何值,JavaScript 引擎将尝试将该变量转换为 Number。如果它是有效的,它会给你 Number 否则它会返回 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
}

如果我在某处错了,请有人纠正我..

【讨论】:

  • JavaScript 中没有整数。 +"1.5e-1"
  • @Bergi 上述函数是否因 +"1.5e-1" 而失败?是的,Integer 而不是 Number 是 Typo.. 我同意.. 你在 javaScript 中怎么称呼 0.1..?
  • 不,但0.15 是一个非整数、普通 number 的示例 :-)
  • @Bergi 请查看我更新的答案。它是否值得被拒绝:-)。我认为以上任何解释都没有错
【解决方案4】:

我找到了 _.isNaN 的一个案例 如果你传递一个对象,它会显示与原生不同的结果

_.isNaN({}) => false
//but
isNaN({}) => true

【讨论】:

    猜你喜欢
    • 2013-05-07
    • 2013-04-27
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 2020-04-03
    • 2021-07-01
    • 2019-03-22
    • 2015-11-30
    相关资源
    最近更新 更多