क्या जावास्क्रिप्ट फ़ंक्शन से efundefined` या `null` को वापस करना बेहतर है?


98

मेरे पास एक फ़ंक्शन है जो मैंने लिखा है जो मूल रूप से इस तरह दिखता है:

function getNextCard(searchTerms) {
  // Setup Some Variables

  // Do a bunch of logic to pick the next card based on termed passed through what I'll call here as 'searchTerms' all of this logic is omitted because it's not important for my question.
  // ...

  // If we find a next card to give, than give it
  if (nextCardFound)
    return nextCardFound;

  // Otherwise - I'm returning undefined
  return undefined;
}

प्रश्न: क्या यहां "अशक्त" लौटना बेहतर होगा?

मैं जो कुछ भी वापस चाहता हूं उसे पास कर सकता हूं - जाहिर है ... मुझे यकीन नहीं था कि उपयोग करने के लिए सबसे अच्छी चीज क्या है।

इस फ़ंक्शन को कॉल करने वाला कोड अपरिभाषित से निपटना जानता है (यह वास्तव में कभी भी नहीं होगा जब तक कि कुछ बुरी तरह से गलत न हो)

यह प्रश्न पूछने का कारण यह है कि मैंने कहीं ऐसा कुछ सुना, जो "चर के लिए अपरिभाषित न हो" जैसा कुछ सुना हो - या कि यह डिबग करना कठिन बना देगा। तो, यह तथ्य कि मैं देख सकता हूं कि nullवापस पास हो जाता है, मुझे बताता है कि रिटर्न काम कर रहा है - लेकिन मूल रूप से इसके समान कार्य करता है undefined


प्रलेखन:

मोज़िला डॉक्स ने मेरे सवाल का जवाब नहीं दिया ... Google ने या तो नहीं किया: \

यह SO प्रश्न - क्या मैं यहाँ जानने की कोशिश कर रहा हूँ के लिए बहुत व्यापक था।


1
क्या यह एसओ प्रश्न का उत्तर नहीं देता है?
warkentien2

8
मेरी राय में, वापसी nullundefinedजावास्क्रिप्ट को ही छोड़ दें । हालांकि, कोई "बेहतर" नहीं है, इसलिए यह राय का विषय है।
फेलिक्स क्लिंग

@ warkentien2 धन्यवाद, यह मददगार था - लेकिन मैं अभी भी स्पष्ट नहीं हूं कि एक गटर समारोह से लौटने के लिए सम्मेलन क्या है।
जेरेमी इगलहार्ट

1
मैंने पढ़ा null"जैसा आप पूछ रहे हैं उसके लिए कोई उचित मूल्य नहीं है" और undefinedजैसा कि "आप जो पूछ रहे हैं, मैं उससे काम नहीं कर सकता"।
मार्टी

@ warkentien2 कि सवाल है, और एक मैं अपने जवाब में जुड़ा हुआ है, से संबंधित हैं, लेकिन दोनों पूछ हो रहे हैं क्या उन्हें और नहीं के बीच अंतर है जब एक का उपयोग करने के लिए या एक वापसी मान के रूप में अन्य।
chiliNUT

जवाबों:


37

मेरा तर्क है कि कोई सबसे अच्छा तरीका नहीं है, और यहां तक ​​कि मानक कार्य कभी-कभी एक या दूसरे को चुनते हैं।

उदाहरण के लिए:

  • [[प्रोटोटाइप]]

    साधारण वस्तुओं में एक [[प्रोटोटाइप]] आंतरिक स्लॉट होता है, जो यह निर्धारित करता है कि उन्हें किस अन्य वस्तु से विरासत में मिला है। बेशक, यह कहने का एक तरीका होना चाहिए कि कोई वस्तु किसी अन्य से विरासत में नहीं मिलती है। इस मामले में, "ऐसी कोई वस्तु नहीं है" का उपयोग करके प्रतिनिधित्व किया जाता है null

  • Object.getOwnPropertyDescriptor

    यह एक संपत्ति विवरणक, अर्थात्, एक वस्तु है जो एक संपत्ति (उदाहरण के लिए मूल्य, योग्यता, गणना और विन्यास) का वर्णन करता है लौटने की उम्मीद है। हालांकि, संपत्ति मौजूद नहीं हो सकती है। इस मामले में, "ऐसी कोई संपत्ति नहीं है" का उपयोग करके प्रतिनिधित्व किया जाता है undefined

  • document.getElementById

    यह दिए गए आईडी के साथ तत्व को वापस करने की उम्मीद है। हालाँकि, उस आईडी के साथ कोई तत्व नहीं हो सकता है। इस मामले में, "ऐसा कोई तत्व नहीं है" का उपयोग करके प्रतिनिधित्व किया जाता है null

इसलिए आप जो चाहें पसंद करें या अपने विशिष्ट मामले के लिए अधिक समझदारी चुनें।


3
इसे पढ़ने के बाद मैंने void 0इस उत्तर के भविष्य के दर्शकों के लिए तकनीक का सुझाव देने का फैसला किया । मैंने अपनी बात को और स्पष्ट करने के लिए कुछ कोड भी जोड़े। आपके उत्तर के लिए धन्यवाद!
जेरेमी इगलहार्ट

114

अपरिभाषित आम तौर पर एक ऐसी चीज को संदर्भित करता है जिसे अभी तक एक मूल्य (अभी तक) नहीं सौंपा गया है। नल से तात्पर्य किसी ऐसी चीज से है जिसका कोई मूल्य नहीं है। उस स्थिति में, मैं एक अशक्त लौटने की सलाह दूंगा। ध्यान दें कि बिना किसी निर्दिष्ट रिटर्न वैल्यू के एक फंक्शन अव्यवस्थित रूप से अपरिभाषित रिटर्न देता है।

ECMAScript2015 कल्पना से

4.3.10 अपरिभाषित मूल्य

जब एक चर को एक मान नहीं सौंपा गया है तो आदिम मूल्य का उपयोग किया जाता है

4.3.12 शून्य मान

आदिम मूल्य जो किसी भी वस्तु मूल्य के जानबूझकर अनुपस्थिति का प्रतिनिधित्व करता है

http://www.ecma-international.org/ecma-262/6.0/#sec-terms-and-definitions-undefined-type

आगे की पढाई:

जावास्क्रिप्ट में अशक्त या अपरिभाषित का उपयोग कब किया जाता है?


1
हां, अपरिभाषित वह मूल्य है जिसका उपयोग तब किया जाता है जब एक चर को एक मान नहीं सौंपा गया हो। वास्तव में ऐसा क्यों होता है कि आपको किसी फ़ंक्शन में अपरिभाषित नहीं लौटना चाहिए?
ओरोल

1
@ ओरीओल, मेरे दिमाग में, चूंकि एक शून्य फ़ंक्शन अपरिभाषित लौटता है, इसलिए उस प्रकार के कार्यों के लिए एक आरक्षित मूल्य है, ताकि किसी फ़ंक्शन के रिटर्न मूल्य को संभालने के दौरान, नल मुझे बताए कि यह अशक्त लौटने का फैसला किया है, जबकि अपरिभाषित मुझे यह बताता है या तो अनिर्धारित लौटने का फैसला किया, या यह कुछ भी वापस नहीं करने का फैसला किया, लेकिन मैं निश्चित रूप से नहीं जानता कि कौन। इसके अलावा, अगर मैं कर रहा हूं, तो मैं var x=someFunc();जानबूझकर एक्सए मूल्य प्रदान कर रहा हूं, और इसके बजाय यह कोई भी परीक्षण पास नहीं करेगा जो इंगित करता है कि यह (या नहीं हो सकता है) एक मूल्य सौंपा गया है। बस imho
chiliNUT

यह स्वीकृत उत्तर होना चाहिए। इस तरह इसका उपयोग कल्पना में किया जाना था
जिंक

1
मैं इसे इस तरह से नहीं पढ़ता हूं। मैंने इसे इस रूप में पढ़ा: यदि आप एक चर को परिभाषित करते हैं, लेकिन इसे आरंभ नहीं करते हैं, तो इसके बजाय अपरिभाषित का प्रारंभिक मूल्य होगा। नल को प्रोग्रामर द्वारा जानबूझकर इंगित करने के लिए उपयोग किया जाना चाहिए कि एक चर खाली है। IMHO अपरिभाषित को प्रोग्रामर द्वारा किसी चर को नहीं सौंपा जाना चाहिए, इसका उपयोग करने के लिए इसे js इंजन पर छोड़ दें। शब्द "ऑब्जेक्ट" का मूल्य भ्रामक है, क्योंकि जेएस में भी आदिम
ऑटोबॉक्सिंग के

1
हाँ, यह समझ में आता है। निष्पक्ष होने के लिए, nullजब तक आप एक के साथ चिपके रहते हैं, तब तक मुझे एक का उपयोग करने में कोई आपत्ति नहीं है ( जब तक कि मैं अधिक उपयोग किया जाता हूं ), लेकिन मूल्य के अभाव को इंगित करने के लिए 2 मान होना (जो भी "प्रकार") हमेशा भ्रमित होता है
सर्जियो रोसस

39

मैं आपको दोनों के बीच चयन करने के बारे में अपनी व्यक्तिगत राय दूंगा।

मेरा सरल सवाल है: क्या मूल्य, किसी अन्य इनपुट / राज्य / संदर्भ को कुछ के लिए परिभाषित किया जा सकता है?

अगर जवाब हां है तो nullदूसरे उपयोग करें undefined। आम तौर पर किसी वस्तु को लौटाने वाले किसी भी फ़ंक्शन को वापस आना चाहिए nullजब इच्छित वस्तु मौजूद नहीं होती है। क्योंकि यह एक और इनपुट / राज्य / संदर्भ दिया जा सकता है।

nullकिसी दिए गए इनपुट / राज्य / संदर्भ के लिए मूल्य की अनुपस्थिति का प्रतिनिधित्व करता है। इसका तात्पर्य यह है कि मूल्य की अवधारणा आपके आवेदन के संदर्भ में ही मौजूद है लेकिन अनुपस्थित हो सकती है। आपके उदाहरण में अगले कार्ड की अवधारणा मौजूद है लेकिन कार्ड स्वयं मौजूद नहीं हो सकता है। nullइस्तेमाल किया जाना चाहिए।

undefinedनिहितार्थ आपके आवेदन के संदर्भ में उस मूल्य के अर्थ की अनुपस्थिति का प्रतिनिधित्व करता है। उदाहरण के लिए, यदि मैं userदिए गए गुणों के साथ किसी वस्तु में हेरफेर करता हूं और मैं संपत्ति तक पहुंचने का प्रयास करता हूं pikatchu। इस संपत्ति का मूल्य निर्धारित किया जाना चाहिए undefinedक्योंकि मेरे संदर्भ में इस तरह की संपत्ति होने का कोई मतलब नहीं है।


1
यह मेरे लिए सच है बजता है। आईएमओ शुद्ध कार्यों को वापस लौटना चाहिए null, जबकि साइड-इफेक्ट्स वाले फ़ंक्शन वापस आने चाहिए undefined, जब एक कार्यात्मक प्रोग्रामर की तरह सोच रहे हों।
जेक

4

undefinedकुछ ऐसा नहीं है जिसे आपको असाइन करना चाहिए। आप इसके अलावा कुछ और वापस करने पर विचार कर सकते हैं undefined। आपके मामले में, यहां तक ​​कि अगर आप कुछ भी वापस नहीं करते हैं, तो परिणाम undefinedपहले से ही होगा । इसलिए, मैं nullइसके बजाय साथ जाने का सुझाव दूंगा।

इस नमूने पर विचार करें,

function getSomething() {
     // .. do something
     return undefined;
}

function doSomething() {
     // .. I'm not gonna return anything.
}

var a = getSomething();
var b = doSomething();

ऊपर नमूना परिणाम में a === b, जो है undefined। अंतर यह है कि आप 1 स्टेटमेंट निष्पादन को बचाते हैं।


@ ऑरोल का मतलब है, undefinedसौंपा जाना नहीं है। मूल्यों के बिना सभी घोषित चर पहले से ही हैं undefined
choz

@choz & @Oriol - जैसा कि @chiliNUT द्वारा पहले उल्लेख किया गया है "ध्यान दें कि कोई निर्दिष्ट रिटर्न वैल्यू वाला कोई फ़ंक्शन अप्रत्यक्ष रूप से अपरिभाषित रिटर्न नहीं देता है।" - यह सच है क्योंकि (function(){ /* code */ })()कंसोल में रिटर्न अशक्त है।
जेरेमी इगलहार्ट

@JeremyIglehart कोड वास्तव में कुछ भी वापस नहीं करता है। और फिर, यह undefinedमेरे क्रोम और फ़ायरफ़ॉक्स कंसोल पर देता है।
choz

ठीक है मैं आपकी बात नहीं समझ पाया। हां, यदि आप स्पष्ट रूप से कुछ भी नहीं लौटाते हैं, तो अपरिभाषित को अनुमानित रूप से वापस कर दिया जाएगा। लेकिन वह बात क्यों है?
ओरोल

1
@ ऑरिओल, मुझे लगता है कि @choz क्या कहना चाह रहा था (जैसा कि कुछ अन्य लोगों ने भी इस सवाल पर उल्लेख किया है) कि अगर मैं वापस लौटना चाहता हूं undefinedतो अगर कुछ और नहीं लौटता है - तो मुझे इसकी आवश्यकता नहीं है क्योंकि फ़ंक्शन का डिफ़ॉल्ट व्यवहार यदि आप कुछ भी नहीं लौटाते अपरिभाषित लौटने के लिए है - वे सिर्फ यह कह रहे हैं कि इसकी आवश्यकता नहीं है। इसके अलावा ... मुझे पसंद है कि आपको बिल्ट-इन गेट्टर फ़ंक्शंस के बारे में क्या कहना है। कृपया अपना उत्तर उस प्रभाव पर दें और मैं इसे स्वीकार करूंगा।
जेरेमी इगलहार्ट

3

इस बात पर निर्भर करता है कि यू को लौटे मूल्य के साथ क्या करने की आवश्यकता है।

टाइपोफ़ नल एक वस्तु देता है। उस वस्तु का अपरिभाषित मूल्य होता है

टाइपो अपरिभाषित रिटर्न अपरिभाषित


व्यक्तिगत रूप से मैं आमतौर पर अशक्त का उपयोग करता हूं।
Dan

4
"उस वस्तु का अपरिभाषित मूल्य है" नहीं यह नहीं है और यह एक वस्तु नहीं है, यह अशक्त है। typeofआवश्यक रूप से सही डेटा प्रकार के मान को वापस नहीं करता है, इसका एक नक्शा है जो डेटा प्रकारों को लेबल पर मैप करता है और संबंधित लेबल को वापस करता है।
फेलिक्स क्लिंग

भरोसा मत करो typeof, अपने नाम के बावजूद यह मूल्य का प्रकार नहीं बताता है।
ओरोल

2

यहां एक उदाहरण दिया गया है, जहां undefinedइससे अधिक अर्थ है null:

मैं JSON.parseइसके अपवाद को बदलने के लिए एक आवरण समारोह का उपयोग करता हूं undefined:

// parses s as JSON if possible and returns undefined otherwise
// return undefined iff s is not a string or not parseable as JSON; undefined is not a valid JSON value https://stackoverflow.com/a/14946821/524504
function JSON_parse_or_undefined(s) {
    if ("string" !== typeof s) return undefined

    try {
        const p = JSON.parse(s)
        return p
    } catch (x){}

    return undefined
}

ध्यान दें कि nullJSON में मान्य undefinedनहीं है।


मैं देखता हूं कि आप वहां क्या कर रहे हैं - और मैं यह नहीं कह सकता कि आप गलत हैं - क्योंकि एक मायने में मुझे लगता है कि आप यहां ऐसा कर सकते हैं और यह ठीक होगा। मेरे पास एक अलग पैटर्न है जो मैं इस ऑपरेशन को करने के लिए उपयोग करता हूं जो मुझे बेहतर लगता है क्योंकि मैं एक "सत्यापन" चरण के बाद करता हूं। मुझे ऐसा लगता है कि मान वापस करने के साथ यह सत्यापन मिला हुआ है। यहाँ मैं क्या कर रहा हूँ let getStringOrJSON = value => { try { value = JSON.parse(value); } catch(e) { return value; } return value; };:। अब, मुझे यकीन है कि दोनों रिटर्न अलग-अलग तरीके से संभाले जा सकते हैं, और जेएस गोल्फ प्रतियोगिता नहीं जीत सकते। यह काम करता हैं।
जेरेमी इगलहार्ट

1

पहला उत्तर सही है। उनका सैद्धांतिक रूप से अलग अर्थ है। हालांकि यह हमेशा स्पष्ट नहीं होता है कि किसको उठाना है।

मैं अपने विकास में अशक्त का उपयोग करता हूं, हालांकि मुझे लगता है कि यह पूरी तरह से व्यक्तिपरक चीज है।

मैं उस का उपयोग ज्यादातर क्योंकि:

  1. अपरिभाषित चर को पुराने ब्राउज़रों में अधिलेखित किया जा सकता है, इसलिए इसे वापस करना थोड़ा अधिक जटिल है। यह वही समस्या आपको typeof var === 'undefined'फ़ंक्शन परिणाम प्राप्त करते समय उपयोग करने के लिए मजबूर करती है । संपर्क

  2. अन्य भाषाएं व्यापक रूप से शून्य का उपयोग करती हैं, उनमें से बहुत से अपरिभाषित भी नहीं हैं (उदाहरण के लिए php)। जब भाषाओं के बीच तेज़ी से अदला-बदली होती है, तो मुझे इस तरह की स्थिरता मिलती है।


1

मुझे लगता है कि यह बहुत ही बहस का विषय है कि क्या उपयोग किया जाए। मैं ऐसा कोड पसंद करता हूं जो शब्दार्थ रूप से यथासंभव सटीक हो, इसलिए मुझे लगता undefinedहै कि इस मामले में उचित है।

मुझे लगता है कि nullअसाइनमेंट का अर्थ है "कुछ भी नहीं करने के लिए एक चर सेट"। यह undefinedअर्थ के विपरीत है "यह बात बिल्कुल नहीं है"

जैसा कि पिछले उत्तर में बताया गया है, वापसी undefinedके मुद्दे हैं, और यह पूरी तरह से आपके ऊपर है कि क्या आपको परेशान करता है। यह मुझे परेशान नहीं करेगा।


2
लेकिन document.getElementById('iDoNotExist')रिटर्न null, भले ही अर्थ "यह बात बिल्कुल नहीं है" के करीब है। यदि मानक विधियां करते हैं, तो ओपी क्यों नहीं?
ओरोल

@ ओरियल मुझे वास्तव में आपका तर्क सबसे अधिक पसंद है। कृपया इस आशय का उत्तर दें और मैं इसे स्वीकार करूंगा। (यदि आवश्यक हो तो मैं कुछ संपादन भी जोड़ सकता हूं)
जेरेमी इगलहार्ट

ये @ ओरियोल, यही कारण है कि मैं वास्तव में क्यू / ए साइटों पर भी बहस का आनंद लेता हूं। काउंटर उदाहरण प्राप्त करना वास्तव में अच्छा है। और आपने एक अच्छा प्रदान किया है।
रयान लाबॉकेन

1

मैं तर्क दूंगा कि इस मामले में, nullलौटाया जाना चाहिए।

यदि आप सैद्धांतिक कंप्यूटर विज्ञान के दृष्टिकोण से प्रश्न पर विचार करते हैं तो अनिर्धारित गैर-समाप्ति / गैर-कम्प्यूटेबिलिटी (यानी आंशिक फ़ंक्शन के अपरिभाषित बिंदु xके लिए प्लेसहोल्डर जो अक्सर लिखा जाता है ) को इंगित करने के लिए उपयोग किया जाता है । ff(x) = ⊥

getNextCardहालांकि लगता है कि अगले कार्ड की गणना करने में सक्षम है (यदि यह मौजूद है) और अगले कार्ड नहीं होने पर भी गणना करने में सक्षम हो। दूसरे शब्दों में, फ़ंक्शन कुल है क्योंकि यह हर इनपुट के लिए समाप्त होता है।

कहा जा रहा है, सार्थक परिणाम के बिना एक विशेष मूल्य संकेतन समाप्ति (अर्थात "इस इनपुट के लिए मैं कोई कार्ड नहीं लौटा सकता") की आवश्यकता है और यह मेरे लिए nullनहीं है undefined


टिप्पणियाँ:

आप कुछ अन्य टाइप की गई भाषाओं में इस तर्क के लिए कुछ समर्थन देख सकते हैं, जहाँ सार्थक परिणाम के बिना समाप्ति को एक विकल्प प्रकार का उपयोग करके व्यक्त किया जाता है (कभी-कभी इसे अशक्त प्रकार भी कहा जाता है )। एक उदाहरण यह है के लिए है हो सकता है कि में हास्केल

दूसरी ओर, हम निश्चित रूप से नहीं जानते कि undefinedजावास्क्रिप्ट का वास्तव में क्या मतलब है। तो, अपरिभाषित के लिए सादृश्य थोड़ा कठिन है। इसके अलावा, चूंकि हम हमेशा कुल कार्यों के साथ काम करना चाहते हैं, यह कहने के लिए कि " undefinedएक समारोह से वापस कभी नहीं "। जो थोड़ा सख्त लग रहा है, क्योंकि यह उन undefinedसंपत्तियों / चरों के उपयोग को सीमित कर देगा, जिन्हें सेट नहीं किया गया है।

अंत में, मेरी व्यक्तिगत पसंद कभी नहीं है undefinedजहां मैं वापस लौट सकता हूं nullऔर मैं यह भी तर्क दूंगा कि यह बेहतर कोडिंग सम्मेलन है (क्योंकि अन्य चीजों x !== nullकी तुलना में कम है typeof x !== 'undefined')।


-1

यदि आप अपने कोड को क्रैश नहीं करना चाहते हैं तो मेरे अनुभव के अनुसार मेरी व्यक्तिगत राय अपरिभाषित और अशक्त नहीं है। कम से कम मैं व्यक्तिगत रूप से इससे बचता। जावास्क्रिप्ट में बहुत सारे कार्य हैं जो अपरिभाषित हैं और ठीक है हमें इसका उपयोग करना होगा। लेकिन जब आप अपना कोड डिज़ाइन करते हैं तो उसका उपयोग नहीं करते हैं। हमेशा कुछ "false"कम से कम वापस करना महत्वपूर्ण है । यदि आपके पास उदाहरण के लिए एक सरणी है और आप उस पर मैप करते हैं। लौटना अच्छा नहीं है [undefined, undefined.....]या बस undefined। यदि आप मूल सरणी के प्रकार को रखते हैं तो बेहतर है। उदाहरण:

 const mapper:Map <string[],boolean[]>  
['i', 'dont', 'use', 'null or undefined'] -> [false, true, false, true, false]
or ['', dont, '', '', use] 
or al the stuff above and then filter(v => v)
that will keep all undefined and null out

ये तो कमाल की सोच है। मैं इससे बचने के लिए हर समय कोशिश करता हूं। क्योंकि nullया undefinedआपके कोड को आसानी से क्रैश कर सकता है

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