javascript - 在运行时监控和记录 JavaScript/TypeScript 中的 NaN 值?
问题描述
NaN
是否有任何方法可以在运行时跨应用程序的任何可能出现这些值的部分检测 - 或安全地防范 -值?
- A) 是否有安全的 linting 来警告
NaN
某些构造中可能出现的潜在值? - B)或者,某种解决方案可以在运行时监视执行的 JavaScript,检测并记录或警告它?- 类似于错误检测服务的工作方式?
例子
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
解决方案
没有简单的方法可以实现这一点。
没有简单的方法可以静态检测(对于 linter)。NaN
可能是乘法和除法等简单运算的结果,因此它可能发生在任何地方。
当然,从技术上讲,检测总是计算结果为的表达式是可能的NaN
,例如,如果您要键入0/0
. 但这可能不是您想要的。
据我所知,没有框架可以检测NaN
到运行时某处发生的情况。我相信要以您想要的方式实现这一点,您需要在 JS 引擎级别支持它。
您可以发明 hacky 解决方案,例如为算术运算创建函数,multiply
或将数字包装在覆盖该valueOf()
函数的对象中。但是它们都不能在任何情况下都起作用,并且它们会使您的代码不那么令人愉快。
最后NaN
是一个完全有效的数字。您会像检测任何其他值一样检测它。例如,如果你的算法不能处理负数,你也不能改变语言,让它告诉你什么时候有负数。相反,您必须以不会出现负值或编写大量检查/断言的方式设计代码。
推荐阅读
- android - 如何制作可在每个屏幕手机中使用的响应式 Android 应用程序?
- android - 无法解决:com.google.android.gms:play-services:16.0.1
- python - 在矢量化操作中调用 numpy 函数会影响性能吗?
- python - 将 html 代码从“字符串”复制到下一个“字符串”
- c++ - 防止调用某些 std 函数
- spring-mvc - 请帮助解释 Lombok 的 @AllArgsConstructor 和 spring 的 @RestController 的奇怪组合
- python-3.x - 如何修复错误:命令错误退出状态 1:python setup.py egg_info 安装 geograpy 包
- sql-server - 从 SQL Server Management Studio 连接到数据库服务器时出错
- powershell - 缺少双面 WIA 扫描属性
- spring-boot - 如何使用 Spring Boot jmsListener 为失败的消息配置 DLQ?