首页 > 解决方案 > 在运行时监控和记录 JavaScript/TypeScript 中的 NaN 值?

问题描述

NaN是否有任何方法可以在运行时跨应用程序的任何可能出现这些值的部分检测 - 或安全地防范 -值?

例子

NaN可能很难测试的场景的伪代码:

function undetectedNaN (): AssumeStrictDataTypes {
  // 1. Some algorithm ...
  // 2. NaN appears undetected ...
  // 3. Some algorithm ...
  // 4. Return: Broken but seeming legit value and data type
}

(假设它在一个更大的应用程序代码库中,其中添加检查isNaN()和验证单个值不是一种选择:它可能成本太高,不是必需的,不可能进行自动化测试等......)


2021/12 更新:补充我相当抽象的问题:在更实际的用例中,API 值不存在于数组结构中。大多数情况NaN可以通过更好的值/类型检查来解决。

function example (a, b) {
  return a[0] + b[0]
}

// undefined + undefined = NaN
const result = example([], []);

console.log(result);

其他一些NaN发生的可能性:

const testArray  = [];
const testObject = {};

testArray[0] + testArray[0] // NaN
testObject.X + testObject.X // NaN
undefined + undefined       // NaN
NaN + NaN                   // NaN

其他NaN可能更难跟踪的地方: 例如,如果它出现在运行时、某处、有时,并且不是可测试的返回值。

// Bitwise operators
~(NaN) // -1

// Conditionals
if (NaN > 1) {} // false

// Typecasting
!!NaN // false

标签: javascripttypescripterror-handlinglinthealth-monitoring

解决方案


没有简单的方法可以实现这一点。

没有简单的方法可以静态检测(对于 linter)。NaN可能是乘法和除法等简单运算的结果,因此它可能发生在任何地方。

当然,从技术上讲,检测总是计算结果为的表达式是可能的NaN,例如,如果您要键入0/0. 但这可能不是您想要的。

据我所知,没有框架可以检测NaN到运行时某处发生的情况。我相信要以您想要的方式实现这一点,您需要在 JS 引擎级别支持它。

您可以发明 hacky 解决方案,例如为算术运算创建函数,multiply或将数字包装在覆盖该valueOf()函数的对象中。但是它们都不能在任何情况下都起作用,并且它们会使您的代码不那么令人愉快。

最后NaN是一个完全有效的数字。您会像检测任何其他值一样检测它。例如,如果你的算法不能处理负数,你也不能改变语言,让它告诉你什么时候有负数。相反,您必须以不会出现负值或编写大量检查/断言的方式设计代码。


推荐阅读