ESLint 意外使用 isNaN

Posted

技术标签:

【中文标题】ESLint 意外使用 isNaN【英文标题】:ESLint Unexpected use of isNaN 【发布时间】:2018-03-22 12:17:35 【问题描述】:

我正在尝试在 Node.js 模块的箭头函数中使用 isNaN 全局函数,但出现此错误:

[eslint] Unexpected use of 'isNaN'. (no-restricted-globals)

这是我的代码:

const isNumber = value => !isNaN(parseFloat(value));

module.exports = 
  isNumber,
;

知道我做错了什么吗?

PS:我使用的是 AirBnB 风格指南。

【问题讨论】:

【参考方案1】:

作为documentation suggests,使用Number.isNaN

const isNumber = value => !Number.isNaN(Number(value));

引用 Airbnb 的文档:

为什么?全局 isNaN 将非数字强制转换为数字,返回 true 对于任何强制为 NaN 的东西。如果需要这种行为,请实现 明确的。

// bad
isNaN('1.2'); // false
isNaN('1.2.3'); // true

// good
Number.isNaN('1.2.3'); // false
Number.isNaN(Number('1.2.3')); // true

【讨论】:

但是isNaNNumber.isNaN不是同一个函数。例如isNaN('1a') true Number.isNaN('1a') false @rosencreuz 更像是不受欢迎的行为。这就是为什么上面的例子中有Number('1.2.3') 多么愚蠢的规则,关键是要强制输入一个数字,或者你不妨做一个typeof 检查。 我使用Number.isNaN(+'1.2.3'),如果你使用Number.isNaN,这只是一个额外的+ 我希望他们能删除这个,isNaN 和 Number.isNaN 有不同的行为。【参考方案2】:

仅供参考,这不适用于 IE。 检查浏览器兼容性处的here。

【讨论】:

【参考方案3】:

就我而言,我想将 5(整数)、5.4(十进制)、'5'、'5.4' 视为数字,但没有其他示例。

如果你有类似的要求,下面可能会更好:

const isNum = num => /^\d+$/.test(num) || /^\d+\.\d+$/.test(num);

//Check your variable if it is a number.
let myNum = 5;
console.log(isNum(myNum))

要包含负数:

const isNum = num => /^-?\d+$/.test(num) || /^-?\d+\.\d+$/.test(num);

这也将消除您全局使用 isNaN 的问题。 如果把 isNum 函数转换成普通的 ES5 函数,IE 浏览器上也能正常工作。

【讨论】:

【参考方案4】:

@Andy Gaskell isNumber('1.2.3') 返回true,您可能想要编辑您的答案并使用Number() 代替parseFloat()

    const isEmpty = value => typeof value === 'undefined' || value === null || value === false;
    const isNumeric = value => !isEmpty(value) && !Number.isNaN(Number(value));
  console.log(isNumeric('5')); // true
  console.log(isNumeric('-5')); // true
  console.log(isNumeric('5.5')); // true
  console.log(isNumeric('5.5.5')); // false
  console.log(isNumeric(null)); // false
  console.log(isNumeric(undefined)); // false

【讨论】:

我现在才注意到这个答案。我的答案已更新,谢谢!【参考方案5】:

对我来说,这很好用,并且 ESlint 没有任何问题

window.isNaN()

【讨论】:

使用 AirBnb 标准你应该得到: ESLint: 'window.isNaN' is limited to be used。请改用 Number.isNaN(无限制属性) @BartekMaciejewski Number.isNaN 的问题在于它们不是同一个函数。例如。 Number.isNaN('abc')false。而isNaN('abc')true 是的,我完全同意你的看法 - 只是想提一下,使用 window.isNan() 违反了其他 AirBnb 的配置(规则是 eslint.org/docs/rules/no-restricted-properties) @BartekMaciejewski 这很痛苦,不幸的是,由于这个问题,我不得不停用no-restricted-properties

以上是关于ESLint 意外使用 isNaN的主要内容,如果未能解决你的问题,请参考以下文章

eslint 解析错误:带有异步的意外令牌函数

JS 装饰器的 ESLint 意外字符“@”

使用 Atom 和 React Native 的 ESLint 意外解析错误

当“缩进”规则设置为“制表符”时,ESLint“意外的制表符”

ESLint:解析错误:意外令牌:

eslint“解析错误:JSX中的意外令牌”