source

ESLint 예기치 않은 isNaN 사용

manysource 2023. 8. 23. 21:52

ESLint 예기치 않은 isNaN 사용

저는 그것을 사용하려고 합니다.isNaNNode.js 모듈의 화살표 함수 안에 글로벌 함수가 있지만 다음 오류가 발생합니다.

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

내 코드는 다음과 같습니다.

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

module.exports = {
  isNumber,
};

제가 뭘 잘못하고 있는지 아세요?

PS: AirBnB 스타일 가이드를 사용하고 있습니다.

설명서에서 알 수 있듯이 을 사용합니다.

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

Airbnb의 문서 인용:

왜 그럴까요? 전세계적으로 NaN은 숫자가 아닌 사람들에게 숫자를 강요하고, 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

참고로, 이것은 IE에서 작동하지 않을 것입니다.브라우저 호환성을 확인하십시오.

알 수 없는 유형을 강제로 번호를 지정하면 javascript에서 예기치 않은 결과가 발생합니다. eslint 규칙은 숫자가 특정 NaN 값과 동일한지 확인하는 데만 사용해야 하는 isNaN으로 강제하지 못하도록 합니다.이것은 자바스크립트입니다.다음 함수 검사를 수행하면 숫자가 아닌 값을 강제로 숫자로 지정할 수 없습니다.

/**
 * Return true if the value can be evaluated as a Number.
 * @param {*} value
 * @param {boolean} finite - If true, treat non-finite numbers as invalid.
 */
const isNumeric = (value, finite = false) =>
  (typeof value === 'number' ||
    (typeof value === 'string' && value.trim() !== '')) &&
  (finite ? Number.isFinite(Number(value)) : !Number.isNaN(Number(value)));

테스트 사례: 다음을 사용하여 숫자로 전환할 수 있습니다.isNumeric(v) => typeof isNaN(v) === 'number'어떤 경우에 어떤 값을 직접 강요하지 못하는지 확인합니다(숫자() 또는 +문자열을 사용하면 동일한 문제가 발생함).

describe('isNumeric', () => {
  it('evaluate "1" as numeric', () => {
    expect(isNumeric('1')).to.equal(true);
    expect(isNumeric('1', true)).to.equal(true);
  });
  it('evaluate "1.1" as numeric', () => {
    expect(isNumeric('1.1')).to.equal(true);
    expect(isNumeric('1.1', true)).to.equal(true);
  });
  it('evaluate "100.145864" as numeric', () => {
    expect(isNumeric('100.145864')).to.equal(true);
    expect(isNumeric('100.145864', true)).to.equal(true);
  });
  it('evaluate 1 as numeric', () => {
    expect(isNumeric(1)).to.equal(true);
    expect(isNumeric(1, true)).to.equal(true);
  });
  it('evaluate 1.1 as numeric', () => {
    expect(isNumeric(1.1)).to.equal(true);
    expect(isNumeric(1.1, true)).to.equal(true);
  });
  it('evaluate 100.145864 as numeric', () => {
    expect(isNumeric(100.145864)).to.equal(true);
    expect(isNumeric(100.145864, true)).to.equal(true);
  });
  it('evaluate "one" as non-numeric', () => {
    expect(isNumeric('one')).to.equal(false);
    expect(isNumeric('one', true)).to.equal(false);
  });
  it('evaluate undefined as non-numeric', () => {
    expect(isNumeric(undefined)).to.equal(false);
    expect(isNumeric(undefined, true)).to.equal(false);
  });
  it('evaluate null as non-numeric', () => {
    expect(isNumeric(null)).to.equal(false);
    expect(isNumeric(null, true)).to.equal(false);
  });
  it('evaluate NaN as non-numeric', () => {
    expect(isNumeric(NaN)).to.equal(false);
    expect(isNumeric(NaN, true)).to.equal(false);
  });
  it('evaluate true as non-numeric', () => {
    expect(isNumeric(true)).to.equal(false);
    expect(isNumeric(true, true)).to.equal(false);
  });
  it('evaluate false as non-numeric', () => {
    expect(isNumeric(false)).to.equal(false);
    expect(isNumeric(false, true)).to.equal(false);
  });
  it('evaluate an empty string as non-numeric', () => {
    expect(isNumeric('')).to.equal(false);
    expect(isNumeric('', true)).to.equal(false);
  });
  it('evaluate "100,2" as non-numeric', () => {
    expect(isNumeric('100,2')).to.equal(false);
    expect(isNumeric('100,2', true)).to.equal(false);
  });
  it('evaluate "1.1.1" as non-numeric', () => {
    expect(isNumeric('1.1.1')).to.equal(false);
    expect(isNumeric('1.1.1', true)).to.equal(false);
  });
  it('evaluate "123123 + 123123" as non-numeric', () => {
    expect(isNumeric('123123 + 123123')).to.equal(false);
    expect(isNumeric('123123 + 123123', true)).to.equal(false);
  });
  it('evaluate "123123 - 123123" as non-numeric', () => {
    expect(isNumeric('123123 - 123123')).to.equal(false);
    expect(isNumeric('123123 - 123123', true)).to.equal(false);
  });
  it('evaluate "123123 / 123123" as non-numeric', () => {
    expect(isNumeric('123123 / 123123')).to.equal(false);
    expect(isNumeric('123123 / 123123', true)).to.equal(false);
  });
  it('evaluate "123123 * 123123" as non-numeric', () => {
    expect(isNumeric('123123 * 123123')).to.equal(false);
    expect(isNumeric('123123 * 123123', true)).to.equal(false);
  });
  it('evaluate "  " as non-numeric', () => {
    expect(isNumeric('  ')).to.equal(false);
    expect(isNumeric('  ', true)).to.equal(false);
  });
  it('evaluate " " as non-numeric', () => {
    expect(isNumeric(' ')).to.equal(false);
    expect(isNumeric(' ', true)).to.equal(false);
  });
  it('evaluate Infinity as numeric', () => {
    expect(isNumeric(Infinity)).to.equal(true);
  });
  it('evaluate -Infinity as numeric', () => {
    expect(isNumeric(-Infinity)).to.equal(true);
  });
  it('evaluate Infinity as non-numeric with finite=true', () => {
    expect(isNumeric(Infinity, true)).to.equal(false);
  });
  it('evaluate -Infinity as non-numeric with finite=true', () => {
    expect(isNumeric(-Infinity, true)).to.equal(false);
  });
  it('evaluate Number.MAX_SAFE_INTEGER as numeric', () => {
    expect(isNumeric(Number.MAX_SAFE_INTEGER)).to.equal(true);
    expect(isNumeric(Number.MAX_SAFE_INTEGER, true)).to.equal(true);
  });
  it('evaluate Number.MIN_SAFE_INTEGER as numeric ', () => {
    expect(isNumeric(Number.MIN_SAFE_INTEGER)).to.equal(true);
    expect(isNumeric(Number.MIN_SAFE_INTEGER, true)).to.equal(true);
  });
  it('evaluate "1e3" as numeric ', () => {
    expect(isNumeric('1e3')).to.equal(true);
    expect(isNumeric('1e3', true)).to.equal(true);
  });
  it('evaluate "1e.3" as non-numeric ', () => {
    expect(isNumeric('1e.3')).to.equal(false);
    expect(isNumeric('1e.3', true)).to.equal(false);
  });
  it('evaluate "1e3.3" as non-numeric ', () => {
    expect(isNumeric('1e1.3')).to.equal(false);
    expect(isNumeric('1e1.3', true)).to.equal(false);
  });
  it('evaluate "1e" as non-numeric ', () => {
    expect(isNumeric('1e')).to.equal(false);
    expect(isNumeric('1e', true)).to.equal(false);
  });
  it('evaluate "1e0" as numeric ', () => {
    expect(isNumeric('1e0')).to.equal(true);
    expect(isNumeric('1e0', true)).to.equal(true);
  });
  it('evaluate "-1e3" as numeric ', () => {
    expect(isNumeric('-1e3')).to.equal(true);
    expect(isNumeric('-1e3', true)).to.equal(true);
  });
  it('evaluate an object as non-numeric ', () => {
    expect(isNumeric({})).to.equal(false);
    expect(isNumeric({}, true)).to.equal(false);
  });
});

또한 규칙에 대한 합법적인 사용 사례가 있거나 직접 사용하는 경우 eslint 구성 파일의 재정의 섹션에서 규칙을 비활성화할 수 있습니다.Number(value)또는+value규칙을 발동하지 않고 강요하는 것.

Trivia (@Noby Fujuoka 답변에서 제안한 REGEXP를 사용한 대체 버전, 제안된 테스트 사례를 통과하도록 업데이트됨)

const isNumeric = (value, finite = false) => (typeof value === 'number' || (typeof value === 'string' && /^(([\-]?[0-9]+)([\.e][0-9]+)?)$/.test(value))) && (finite ? Number.isFinite(Number(value)) : !Number.isNaN(value));

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN 의 NaN 동작입니다.

isNaN("NaN"); // true
isNaN(undefined); // true
isNaN({}); // true
isNaN("blabla"); // true
isNaN(true); // false, this is coerced to 1
isNaN(null); // false, this is coerced to 0
isNaN("37"); // false, this is coerced to 37
isNaN("37.37"); // false, this is coerced to 37.37
isNaN(""); // false, this is coerced to 0
isNaN(" "); // false, this is coerced to 0

제 경우에는 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 브라우저에서도 작동합니다.

저에게는 이것이 잘 작동했고 ESLint에 문제가 없었습니다.

window.isNaN()

언급URL : https://stackoverflow.com/questions/46677774/eslint-unexpected-use-of-isnan