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

คำตอบ:


282

ในฐานะที่เป็นเอกสารที่แสดงให้เห็นNumber.isNaNการใช้งาน

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

การอ้างอิงเอกสารของ Airbnb:

ทำไม? global isNaN ทำการ coerces ไม่ใช่ตัวเลขให้เป็นตัวเลขและคืนค่าจริงสำหรับทุกสิ่งที่ coNo ไปที่ 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

28
แต่isNaNและNumber.isNaNไม่ใช่ฟังก์ชั่นเดียวกัน ตัวอย่างเช่น isNaN('1a') true Number.isNaN('1a') false
rosencreuz

3
@rosencreuz ชอบพฤติกรรมที่ไม่พึงประสงค์มากขึ้น นั่นเป็นสาเหตุที่มีอยู่Number('1.2.3')ในตัวอย่างด้านบน
Patrick Portal

2
สิ่งที่เป็นกฎโง่จุดทั้งหมดคือการบีบบังคับให้ตัวเลขหรือคุณอาจทำเพียงtypeofตรวจสอบ
Dominic

ฉันใช้Number.isNaN(+'1.2.3')ซึ่งเป็นพิเศษ+ถ้าคุณใช้Number.isNaN
Ibraheem


3

@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

ฉันเพิ่งสังเกตเห็นคำตอบนี้ในขณะนี้ คำตอบของฉันได้รับการปรับปรุงขอขอบคุณ!
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 Geissler

ใช่ฉันเห็นด้วยกับคุณโดยสิ้นเชิง - แค่อยากพูดถึงว่าการใช้window.isNan()ขัดต่อการกำหนดค่าของ AirBnb อื่น ๆ (กฎคือeslint.org/docs/rules/no-restricted-properties )
Bartek Maciejewski

@BartekMaciejewski นี่เป็นความเจ็บปวดฉันโชคไม่ดีที่ต้องปิดการใช้งานno-restricted-propertiesเนื่องจากปัญหานี้
Yoannes Geissler
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.