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
【讨论】:
但是isNaN
和Number.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的主要内容,如果未能解决你的问题,请参考以下文章
使用 Atom 和 React Native 的 ESLint 意外解析错误