ESLint意外使用isNaN


154

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

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

这是我的代码:

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

module.exports = {
  isNumber,
};

关于我做错了什么的主意吗?

PS:我正在使用AirBnB样式指南。

Answers:


281

文档所示,请使用Number.isNaN

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

引用Airbnb的文档:

为什么?全局isNaN将非数字强制转换为数字,对于任何强制NaN的结果均返回true。如果需要此行为,请使其明确。

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

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

28
但是isNaNNumber.isNaN功能不一样。例如 isNaN('1a') true Number.isNaN('1a') false
rosencreuz

3
@rosencreuz更像不良行为。这就是Number('1.2.3')上面示例中的原因。
Patrick Portal

2
多么愚蠢的规则,最重要的是要强迫一个数字,否则您最好只做一个typeof检查。
多米尼克'18

我使用的Number.isNaN(+'1.2.3')+如果您使用的话,这是一个额外的选择Number.isNaN
易卜拉欣


3

@Andy Gaskell isNumber('1.2.3')return 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

我现在才注意到这个答案。我的答案已经更新,谢谢!
Andy Gaskell

1

就我而言,我想将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浏览器上运行。


0

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

window.isNaN()


使用AirBnb标准,您应该获得:ESLint:'window.isNaN'被限制使用。请改用Number.isNaN(无限制属性)
Bartek Maciejewski

@BartekMaciejewski Number.isNaN的问题在于它们不是相同的功能。例如。Number.isNaN('abc')false。而isNaN('abc')true
Yoannes盖斯勒

是的,我完全同意你的看法-只是想提一提,用window.isNan()对付其他Airbnb的配置(该规则是eslint.org/docs/rules/no-restricted-properties
鲍尔泰克Maciejewski

@BartekMaciejewski这很痛苦,no-restricted-properties由于这个问题,我很遗憾不得不停用该功能
Yoannes Geissler
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.