在Javascript中比较NaN值是否相等

GOT*_*O 0 61 javascript comparison equality nan

我需要在Javascript中比较两个数值相等.值也可以NaN.我想出了这段代码:

if (val1 == val2 || isNaN(val1) && isNaN(val2)) ...
Run Code Online (Sandbox Code Playgroud)

这工作正常,但它看起来很臃肿.我想让它更简洁.有任何想法吗?

Thi*_*ter 51

if(val1 == val2 || (isNaN(val1) && isNaN(val2)))
Run Code Online (Sandbox Code Playgroud)

没什么可改进的.只需添加括号即可让每个人都清楚.

  • 我会用一条评论解释为什么`NaN === NaN`会返回true. (9认同)

dav*_*ers 23

避免isNaN.它的行为具有误导性:

isNaN(undefined) // true
Run Code Online (Sandbox Code Playgroud)

_.isNaN(来自Underscore.js)是一个优雅的函数,其行为符合预期:

// Is the given value `NaN`?
// 
// `NaN` is the only value for which `===` is not reflexive.
_.isNaN = function(obj) {
  return obj !== obj;
};

_.isNaN(undefined) // false
_.isNaN(0/0) // true
Run Code Online (Sandbox Code Playgroud)

  • `isNaN(undefined)`是'true`有什么问题?`undefined`**不是数字**.这对你来说似乎有些误导? (9认同)
  • @trejder:NaN和undefined是不同的值.不同的值*类型*,甚至. (5认同)
  • @davidchambers:是的.哪个不改变这个事实,'undefined`*不是*数字.这导致我们得出一个结论,即`isNaN(undefined)`*应该*返回`true`.事实上,"NaN"和"undefined"是不同的值和不同的值类型,不会改变我的状态.因为这是完全不同的故事.或者指出我,我错了. (5认同)
  • @trejder:我们对于NaN应该回答哪个问题有不同的想法.你相信`isNaN(x)`应该等于`!isNumber(x)`,而我建议它应该告诉我们x的值是否恰好是NaN.如果想知道某个值是否不是数字,则首选`Object.prototype.toString.call(x)!=='[object Number]',因为它不允许进行竞争解释. (4认同)
  • @drigoangelo:如果你很乐意写'if(x!== x)`并确信你团队的所有当前和未来的成员都能理解它的作用,那很好.如果没有,那么有一个能回答问题的函数会很好:_这个值是否为NaN?_不幸的是,内置的isNaN不是那个函数. (2认同)

小智 8

尝试使用Object.is(),它确定两个值是否是相同的值.如果满足下列条件之一,则两个值相同:

都未定义

都是空的

两者都是真的或都是假的

两个相同长度的字符串,具有相同顺序的相同字符

两个相同的对象

数字和数字

两者都是+0

两者都是-0

两个NaN

例如,Object.is(NaN,NaN)=> true

请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is


Esa*_*ija 5

if ( val1 === val2 )

如果其中一个或两个都NaN将评估为false.

也, NaN !== NaN


Joa*_*son 5

无论比较方法如何,NaN永远不会与自身相等,所以我能想到的唯一更简洁的问题解决方案是创建一个带有描述性名称的函数调用来进行这种相当特殊的比较,并使用你的比较函数代码而不是.

这也有利于在您确定undefined也应该等于undefined的那一天本地化算法的更改.


Gra*_*hao 5

只要您知道这两个变量是数字的,您可以尝试:

if (val1 + '' == val2 + '')
Run Code Online (Sandbox Code Playgroud)

它将两个值转换为字符串.一个有趣的答案,但它应该工作.:)