SonarQube建议使用!== a而不是=== NaN

Jos*_*rdt 1 javascript nan sonarqube

有一个SonarQube JavaScript规则(javascript:S2688),它说使用a === NaN是一个bug,因为它总是如此false.

我同意这一点,但我认为使用它a !== a(这是由SonarQube建议)是一个非常糟糕的主意.这是一个有趣的JavaScript事实,但肯定不是"最佳实践".

怎么样Number.isNaN(a)?为什么这不是建议的解决方案?我错过了哪些差异或问题?

nnn*_*nnn 9

使用a === NaN是一个bug,因为它总是如此false.

行为不是错误,因为它是如何NaN定义工作的.但是如果你真的a === NaN在一个程序中使用过,那么将是一个错误,因为总是false结果.

a !== a相反......是一个非常糟糕的主意.这是一个有趣的JavaScript事实,但肯定不是"最佳实践".

我不同意你的"当然".由于原始全局isNaN()函数的问题(我将在稍后解释)a !== a,历史上是最好的测试方法NaN.事实上,使用该技术是一种非常普遍的做法,我希望绝大多数有经验的JavaScript开发人员都熟悉它.

NaN 唯一一个测试不等于自身的值.

怎么样isNaN(a)?为什么这不是建议的解决方案?我错过了哪些差异或问题?

原始的全局isNaN()函数 实际上并不测试它的参数是否正确NaN.它也不测试它的参数是否是其他非数字值.它的作用是首先尝试将其参数转换为数字,然后测试该转换的结果是否等于NaN.这种隐式转换意味着,即使字符串不等于该值,也会isNaN("test")返回.并返回,因为可以强制执行空字符串.如果您正在寻找那种行为,那么请使用.trueNaNisNaN("")false0isNaN()

因此,所有这一切都是ECMAScript 6/2015引入新功能的原因,Number.isNaN()该功能专门针对该值进行测试NaN,为老派提供了相同的结果a !== a.

正如评论中所建议的那样,对于不支持的旧浏览器(基本上是旧的IE)Number.isNaN(),如果你想要更清晰的东西a !== a而不介意更长的代码,你可以这样做:

typeof a == "number" && isNaN(a)
Run Code Online (Sandbox Code Playgroud)

......这是Number.isNaN()MDN建议的两种填料之一.(另一个只是使用a !== a.)