ESLint isNaN का अप्रत्याशित उपयोग


154

मैं isNaNNode.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 के प्रलेखन का हवाला देते हुए:

क्यों? वैश्विक एनएएनएन संख्याओं के लिए गैर-संख्याओं को जमा करता है, जो कि NaN के लिए coerces कि किसी भी चीज़ के लिए सही है। यदि यह व्यवहार वांछित है, तो इसे स्पष्ट करें।

// 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')ऊपर के उदाहरण में है।
पैट्रिक पोर्टल

2
क्या मूर्खतापूर्ण नियम है, पूरे बिंदु को एक संख्या के लिए बाध्य करना है या आप बस एक typeofचेक कर सकते हैं।
डोमिनिक

यदि आप उपयोग करते हैं तो मैं Number.isNaN(+'1.2.3')केवल एक अतिरिक्त उपयोग करता हूं+Number.isNaN
इब्राहिम

16

FYI करें, यह IE के लिए काम नहीं करेगा। ब्राउज़र संगतता पर यहां देखें ।


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

मैंने अभी इस जवाब पर ध्यान दिया। मेरा उत्तर अपडेट कर दिया गया है, धन्यवाद!
एंडी गास्केल

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 के config के खिलाफ है (नियम है eslint.org/docs/rules/no-restricted-properties )
Bartek Maciejewski

@BartekMaciejewski यह एक दर्द है, मुझे दुर्भाग्य no-restricted-propertiesसे इस मुद्दे की वजह से निष्क्रिय करना पड़ा
Yoannes Geissler
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.