JSLint कहते हैं "लापता मूलांक पैरामीटर"


538

मैंने इस जावास्क्रिप्ट कोड पर JSLint चलाया और यह कहा:

लाइन 32 की समस्या पर समस्या 30: मूलांक का पैरामीटर गुम होना।

यह प्रश्न में कोड है:

imageIndex = parseInt(id.substring(id.length - 1))-1;

यहाँ क्या गलत है?

जवाबों:


967

हमेशा parseInt के साथ मूलांक पास करने के लिए एक अच्छा अभ्यास है -

parseInt(string, radix)

दशमलव के लिए -

parseInt(id.substring(id.length - 1), 10)

यदि मूलांक पैरामीटर को छोड़ दिया जाता है, तो जावास्क्रिप्ट निम्नलिखित मानता है:

  • यदि स्ट्रिंग "0x" से शुरू होती है, तो मूलांक 16 (हेक्साडेसिमल) है
  • यदि स्ट्रिंग "0" से शुरू होती है, तो मूलांक 8 (अष्टक) है। यह सुविधा पदावनत है
  • यदि स्ट्रिंग किसी अन्य मान से शुरू होती है, तो मूलांक 10 है (दशमलव)

( संदर्भ )


7
इसकी ध्वनियों से, डिफ़ॉल्ट IS 10. यदि यह 0x या 0 से शुरू नहीं होता है, तो यह 10 के मूलांक से चूकता है। लेकिन मूलांक को निर्दिष्ट करने का सबसे अच्छा अभ्यास है, भले ही यह डिफ़ॉल्ट मान हो, जैसे array.map फ़ंक्शन के लिए "यह" की परिभाषा निर्दिष्ट करना।
molson504x

81
इतना अनुचित है कि तर्क से ... मूलांक तर्क के मूलांक का प्रतिनिधित्व करने के लिए तीसरा पैराम होना चाहिए
निशांत

6
अन्य टिप्पणीकारों से सहमत हैं। डिफ़ॉल्ट 10 होने पर मूलांक मान प्रदान करना अच्छा क्यों है? यह आम सम्मेलन को टाल देता है।
रिचर्ड क्लेटन

9
मूलांक के रूप में 10 Redundant radix parameter
जोड़कर

2
@ निशांत: radixतर्क एक संख्यात्मक मान है, न कि संख्यात्मक मान का एक स्ट्रिंग प्रतिनिधित्व, इसलिए निर्दिष्ट करने के लिए कोई मूलांक नहीं है।
21

79

इस चेतावनी से बचने के लिए, उपयोग करने के बजाय:

parseInt("999", 10);

आप इसे इसके द्वारा प्रतिस्थापित कर सकते हैं:

Number("999");


ध्यान दें कि parseInt और संख्या में अलग-अलग व्यवहार हैं , लेकिन कुछ मामलों में, एक दूसरे को बदल सकता है।


4
वहाँ भी बीच बड़ा प्रदर्शन मतभेद हैं parseIntऔर Number। यहां एक पुराना प्रदर्शन परीक्षण है
जोश अनगर

3
क्रोम 77: Number()6x की तुलना में तेज हैparseInt()
ज़नॉन

1
यह साफ सुथरा है जो ठीक काम करता है।
thanos.a

43

मैं इस सवाल का ठीक से जवाब नहीं दे रहा हूं, लेकिन मुझे लगता है कि इससे स्पष्ट होता है कि हमें मूलांक क्यों बताना चाहिए

MDN प्रलेखन पर हम पढ़ सकते हैं कि:

यदि मूलांक अपरिभाषित या 0 (या अनुपस्थित) है, तो जावास्क्रिप्ट निम्नलिखित मानता है:

  • [...]
  • यदि इनपुट स्ट्रिंग "0" से शुरू होती है, तो मूलांक आठ (अष्टक) या 10 (दशमलव) है। वास्तव में जो मूलांक चुना गया है वह कार्यान्वयन-निर्भर है। ECMAScript 5 निर्दिष्ट करता है कि 10 (दशमलव) का उपयोग किया जाता है, लेकिन सभी ब्राउज़र अभी तक इसका समर्थन नहीं करते हैं। इस कारण हमेशा parIInt का उपयोग करते समय एक मूलांक निर्दिष्ट करें।
  • [...]

स्रोत: MDN parseInt ()


1
हां, लेकिन टाइपस्क्रिप्ट कंपाइलर इसे सम्मिलित करेगा, तो आपको परेशान क्यों होना चाहिए?
स्पॉक

2
@Spock क्योंकि TSLint की शिकायत है कि यह वहां नहीं है। और खरगोश के छेद के नीचे हम जाते हैं ...
msanford

हाँ सच है .. इसीलिए मैं इस लिंट नियम को अक्षम करता हूँ। अभी भी समझ में नहीं आता है कि एक वैकल्पिक पैरामीटर एक लिंट शिकायत की यात्रा क्यों करता है .. ओह अच्छी तरह से
Spock

4
@Spock हमेशा इस पैरामीटर को पाठक के भ्रम को खत्म करने और पूर्वानुमानित व्यवहार की गारंटी के लिए निर्दिष्ट करता है। जब एक मूलांक निर्दिष्ट नहीं किया जाता है तो अलग-अलग कार्यान्वयन अलग-अलग परिणाम उत्पन्न करते हैं, आमतौर पर मान को डिफ़ॉल्ट रूप से 10. संदर्भ
एंड्रयू लैम

27

यदि आप उस परीक्षण को छोड़ना चाहते हैं तो आप इस नियम को बंद कर सकते हैं।

सम्मिलित करें:

radix: false

फ़ाइल rulesमें " " गुण के अंतर्गत tslint.json

यह करने की अनुशंसा नहीं की जाती है यदि आप इस अपवाद को नहीं समझते हैं।


1
मैं इसका उपयोग करने जा रहा हूं क्योंकि कोड बिना मूलांक के ठीक चलता है
विलियम

22

अपने जेएस फ़ाइल के शीर्ष पर निम्नलिखित को जोड़ने से जेएसहिंट को मूलांक चेतावनी को दबाने के लिए कहा जाएगा:

/*jshint -W065 */

इसे भी देखें: http://jshint.com/docs/#options


2
यह किस जशन विकल्प के अनुरूप है? मैं अपने संपादक में jshint चलाने के लिए SublimeLint का उपयोग कर रहा हूं, और यह केवल विकल्प का एक हैश लेता है: इसकी सेटिंग के लिए मूल्य जोड़े, इसलिए मुझे नहीं लगता कि मैं आपके "-W065" सुझाव को लागू कर सकता हूं।
दिहद्राल जूल 9'13

5
आप "-W065": trueएक .jshintrcफ़ाइल में उपयोग कर सकते हैं , जैसे ।
अलेक्सांद्रेज़ेज़

29
-1 कृपया ऐसा न करें, बस उस मूलांक को जोड़ें जिसमें आप छलांग लगाना चाहते हैं
जुआन मेंडेस

अधिक दृढ़ता से टाइप की गई भाषा, संकलक अनुकूलन के लिए अधिक अवसर, यही वजह है कि यह चेतावनी फेंक रहा है।
होल्डऑफहंगर

3
आधुनिक JS में, IMO मूलांक जोड़ने से वास्तव में यह अधिक स्पष्ट हो जाता है कि फ़ंक्शन क्या कर रहा है। यदि आप फ़ंक्शन हस्ताक्षर नहीं जानते हैं, तो यह उस स्थिति में है जहां आप डिफ़ॉल्ट रूप से जाने की उम्मीद कर सकते हैं। इसका कोई मतलब नहीं है कि आपको एक मूलांक बताना होगा।
चार्ल्स ऑफेनबैकर

5

मैंने इसे स्ट्रिंग बदलने के लिए सिर्फ + फू का उपयोग करके हल किया।

ध्यान रखें कि यह पठनीयता (गंदे फिक्स) के लिए बहुत अच्छा नहीं है।

console.log( +'1' )
// 1 (int)

3

आप बस इस लाइन को अपने parseInt लाइन के ठीक ऊपर जोड़ सकते हैं:

// eslint-disable-next-line

यह अगली पंक्ति के लिए एस्लिंट चेक को अक्षम कर देगा। इसका उपयोग करें यदि आपको केवल एक या दो लाइनों को छोड़ना है।


2

बस एक खाली स्ट्रिंग को मूलांक स्थान में रखें, क्योंकि parseInt () दो तर्क देते हैं:

parseInt (स्ट्रिंग, मूलांक);

string करने का मान। यदि स्ट्रिंग तर्क एक स्ट्रिंग नहीं है, तो इसे एक स्ट्रिंग में बदल दिया जाता है (ToString अमूर्त ऑपरेशन का उपयोग करके)। स्ट्रिंग तर्क में प्रमुख व्हाट्सएप को अनदेखा किया जाता है।

मूलांक 2 और 36 के बीच एक पूर्णांक जो उपर्युक्त स्ट्रिंग के मूलांक (गणितीय अंक प्रणाली में आधार) का प्रतिनिधित्व करता है। आमतौर पर मनुष्यों द्वारा उपयोग किए जाने वाले दशमलव अंक प्रणाली के लिए 10 निर्दिष्ट करें। पाठक के भ्रम को खत्म करने और अनुमानित व्यवहार की गारंटी के लिए हमेशा इस पैरामीटर को निर्दिष्ट करें। जब एक मूलांक निर्दिष्ट नहीं किया जाता है, तो अलग-अलग कार्यान्वयन अलग-अलग परिणाम उत्पन्न करते हैं, आमतौर पर मान 10 तक डिफ़ॉल्ट होता है।

imageIndex = parseInt (id.substring (id.length - 1)) - 1;
imageIndex = parseInt(id.substring(id.length - 1), '')-1;


1

बस अपने कस्टम नियम को .eslintrc में जोड़ें जो उस तरह दिखता है "radix": "off" और आप इस अनुरक्षण अनैन्सरी चेतावनी से मुक्त होंगे। यह एस्लिंट लिंटर के लिए है।


1

ECMAScript 5 से पहले, parseInt () ने भी ऑक्टोडेट किया हुआ ऑक्टल शाब्दिक, जिसके कारण समस्याएं पैदा हुईं क्योंकि कई डेवलपर्स ने माना कि एक अग्रणी 0 को अनदेखा किया जाएगा।

इसलिए इसके बजाय:

var num = parseInt("071");      // 57

यह करो:

var num = parseInt("071", 10);  // 71

var num = parseInt("071", 8);

var num = parseFloat(someValue); 

संदर्भ


0

substringफ़ंक्शन का उपयोग करने के बजाय आप उपयोग कर सकते हैं.slice()

    imageIndex = parseInt(id.slice(-1)) - 1;

यहां, स्लाइस में -1 इंगित करता है कि आखिरी इंडेक्स से स्लाइस शुरू करना है।

धन्यवाद।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.