जावास्क्रिप्ट में `null` मान क्यों है?


116

जावास्क्रिप्ट में, दो मूल्य हैं जो मूल रूप से कहते हैं 'मैं मौजूद नहीं हूं' - undefinedऔर null

एक संपत्ति जिसके लिए एक प्रोग्रामर ने कुछ भी नहीं सौंपा है undefined, लेकिन एक संपत्ति बनने के लिए null, nullउसे स्पष्ट रूप से सौंपा जाना चाहिए।

मैंने एक बार सोचा था कि इसके लिए एक आवश्यकता थी nullक्योंकि undefinedएक आदिम मूल्य और nullएक वस्तु है। यह नहीं होगा, भले ही typeof nullउपज होगी 'object': वास्तव में, दोनों ही आदिम मूल्य हैं - जिसका अर्थ है कि न तो undefinedऔर न ही nullएक निर्माता फ़ंक्शन से लौटाया जा सकता है, क्योंकि दोनों को एक खाली वस्तु में बदल दिया जाएगा (किसी को निर्माणकर्ताओं में विफलता की घोषणा करने के लिए एक त्रुटि फेंकनी होगी)।

वे दोनों falseबूलियन संदर्भों में भी मूल्यांकन करते हैं । एकमात्र वास्तविक अंतर जो मैं सोच सकता हूं, वह यह है कि एक मूल्यांकन करता है NaN, दूसरा 0संख्यात्मक संदर्भों में।

तो दोनों क्यों है undefinedऔर nullअगर यह सिर्फ उन प्रोग्रामर्स को भ्रमित करता है जो गलत तरीके से चेक nullकर रहे हैं, तो यह पता लगाने की कोशिश कर रहे हैं कि संपत्ति सेट की गई है या नहीं?

मैं जानना चाहता हूं कि क्या किसी के पास एक उचित उदाहरण है जहां इसका उपयोग करना आवश्यक है nullजो undefinedइसके बजाय का उपयोग करके व्यक्त नहीं किया जा सकता है ।

तो आम सहमति यह प्रतीत होती है कि undefined'ऐसी कोई संपत्ति नहीं है' का nullअर्थ है कि 'संपत्ति मौजूद नहीं है, लेकिन कोई मूल्य नहीं है'।

मैं उसके साथ रह सकता था यदि जावास्क्रिप्ट कार्यान्वयन वास्तव में इस व्यवहार को लागू करेगा - लेकिन undefinedयह पूरी तरह से वैध आदिम मूल्य है, इसलिए इसे आसानी से इस अनुबंध को तोड़ने के लिए मौजूदा गुणों को सौंपा जा सकता है। इसलिए, यदि आप यह सुनिश्चित करना चाहते हैं कि यदि कोई संपत्ति मौजूद है, तो आपको inऑपरेटर या hasOwnProperty()वैसे भी उपयोग करना होगा । तो एक बार फिर से: अलग-अलग मूल्यों के लिए व्यावहारिक उपयोग क्या है undefinedऔर null?

मैं वास्तव में उपयोग करता undefinedहूं जब मैं गुणों के मूल्यों को अब उपयोग में नहीं लेना चाहता हूं, लेकिन जो मैं नहीं करना चाहता हूं delete। क्या मुझे nullइसके बजाय उपयोग करना चाहिए ?


3
अपने अंतिम प्रश्न का उत्तर देने के लिए: नहीं, आपको गुणों की स्थापना नहीं करनी चाहिए undefined
शोग

4
"अपरिभाषित" आदिम मूल्य "अपरिभाषित" के साथ वैश्विक दायरे में एक चर है। चर के लिए एक और मूल्य को परिभाषित करना संभव है: {अपरिभाषित = "हैलो"; चेतावनी (अपरिभाषित);} एक के लिए परीक्षण करने के लिए और अधिक विश्वसनीय तरीका अपरिभाषित: {अगर (typeof myVar === "अनिर्धारित") चेतावनी ( "अपरिभाषित")}
कुछ

1
खंड 4.3.9 - 12 को ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf के लिए अपरिभाषित / अशक्त, और 15.1.1.3 को "वैश्विक स्तर पर अपरिभाषित" चर के लिए देखें।
कुछ

1
आपको या तो किसी ऑब्जेक्ट को हटाना चाहिए या इसे शून्य पर सेट करना चाहिए अगर यह अधिक समझ में आता है, लेकिन अपरिभाषित नहीं है।
कुछ

4
In JavaScript, there are two values which basically say 'I don't exist' - undefined and null.नहीं, केवल यही undefinedकहता है।
ऑर्बिट में लाइटनेस दौड़

जवाबों:


78

सवाल वास्तव में "जेएस में एक अशक्त मान क्यों नहीं है" - अधिकांश भाषाओं में कुछ प्रकार का एक शून्य मान है और इसे आमतौर पर बहुत उपयोगी माना जाता है।

सवाल है, " जेएस में एक अपरिभाषित मूल्य क्यों है "। प्रमुख स्थान जहां इसका उपयोग किया जाता है:

  1. जब आप घोषणा करते हैं var x;लेकिन इसे असाइन नहीं करते हैं, xअपरिभाषित रखता है;
  2. जब आपके कार्य को घोषित करने की तुलना में कम तर्क मिलते हैं;
  3. जब आप किसी गैर-मौजूद ऑब्जेक्ट प्रॉपर्टी को एक्सेस करते हैं।

nullनिश्चित रूप से (1) और (2) * के लिए भी काम किया होगा। (३) वास्तव में एक अपवाद को सीधे फेंक देना चाहिए, और यह तथ्य यह नहीं है undefinedकि इस अजीब को वापस करने के बजाय, जो बाद में विफल हो जाएगा, डिबगिंग कठिनाई का एक बड़ा स्रोत है।

* - आप यह भी तर्क दे सकते हैं कि (2) को एक अपवाद फेंकना चाहिए, लेकिन फिर आपको डिफ़ॉल्ट / चर तर्कों के लिए एक बेहतर, अधिक स्पष्ट तंत्र प्रदान करना होगा।

हालाँकि जावास्क्रिप्ट के पास मूल रूप से अपवाद नहीं था, या किसी वस्तु को पूछने का कोई तरीका नहीं था यदि उसके पास एक निश्चित नाम के तहत एक सदस्य था - सदस्य तक पहुंचने और देखने के लिए एकमात्र तरीका (और कभी-कभी अभी भी है) था। यह देखते हुए कि nullपहले से ही एक उद्देश्य था और आप अच्छी तरह से इसके लिए एक सदस्य निर्धारित करना चाहते हैं, एक अलग आउट-ऑफ-बैंड मान आवश्यक था। इसलिए हमारे पास undefinedसमस्या है, जैसा कि आप बताते हैं, और यह एक और बढ़िया जावास्क्रिप्ट 'फीचर' है जिसे हम कभी नहीं निकाल पाएंगे।

मैं वास्तव में अपरिभाषित का उपयोग करता हूं जब मैं गुणों के मूल्यों को अब उपयोग में नहीं खोलना चाहता हूं, लेकिन जिसे मैं हटाना नहीं चाहता हूं। क्या मुझे इसके बजाय अशक्त का उपयोग करना चाहिए?

हाँ। undefinedसंकेत देने के लिए एक विशेष मूल्य के रूप में रखें जब अन्य भाषाओं के बजाय एक अपवाद फेंक सकते हैं।

nullआम तौर पर बेहतर होता है, कुछ IE DOM इंटरफेस पर जहां कुछ सेट करने से nullआप एक त्रुटि दे सकते हैं। अक्सर इस मामले में खाली स्ट्रिंग पर काम करना बंद हो जाता है।


10
आर्गन विस्तार योग्य हैं। आप जितने चाहें उतने ड्रॉप कर सकते हैं और एक फंक्शन संभावित रूप से इसके माध्यम से पुनरावृति कर सकता है और उन सभी का उपयोग कर सकता है। वस्तुओं को किसी भी समय एक नई संपत्ति सौंपी जा सकती है। ये दोनों शक्तिशाली विशेषताएं हैं, लेकिन मुझे संदेह है कि आपके द्वारा पसंद किए गए अपवादों को बहुत अधिक ओवरहेड किया जाएगा। IMO, यह ट्रेडऑफ के लायक है। मैं जेएस में अस्तित्व के लिए बहुत कम समय बिताता हूं, क्योंकि मैं आमतौर पर कठोर भाषा के प्रतिमानों में कास्टिंग करता हूं।
एरिक रेपेन

अजीब बात है कि किसी प्रश्न का स्वीकृत उत्तर "इस प्रश्न का वास्तव में सवाल नहीं है ..." से शुरू होता है
फिलिप

@bobince ने JS के शुरुआती संस्करणों में inऑपरेटर या नहीं hasOwnProperty? क्योंकि वे obj.hello !== undefinedजाँच के लिए सुरक्षित हैं कि क्या कोई वस्तु किसी वस्तु पर मौजूद है।
एंडी

कोई बात नहीं, मैंने अपने सवाल का जवाब दिया। MDN के अनुसार, वे दोनों ES3 में पेश किए गए थे।
एंडी

37

सबसे अच्छा यहाँ वर्णित है , लेकिन सारांश में:

अपरिभाषित एक प्रकार और मूल्य की कमी है, और अशक्त मूल्य की कमी है।

इसके अलावा, यदि आप सरल '==' तुलना कर रहे हैं, तो आप सही हैं, वे समान हैं। लेकिन === का प्रयास करें, जो प्रकार और मूल्य दोनों की तुलना करता है, और आप अंतर को नोटिस करेंगे।


1
मुझे पता है कि null !== undefined- मेरा सवाल यह था कि दो चीजों की आवश्यकता क्यों थी जो एक ही अर्थ अवधारणा को व्यक्त करती हैं; इसके अलावा, आपके लिंक में उल्लेख है कि 'नल एक वस्तु है' - यह गलत है, यह एक आदिम है ...
क्रिस्टोफ

2
वे एक ही शब्दार्थ अवधारणा नहीं हैं। मेरे लिए कम से कम, एक संपत्ति को एक शून्य मान आवंटित किए जाने के बीच एक महत्वपूर्ण अंतर है, और एक संपत्ति जो मौजूदा नहीं है।
डैनियल शेफ़र

लेकिन यह सिर्फ इतना है, वे एक ही शब्दार्थ अवधारणा नहीं हैं। प्रोग्रामर की सुविधा के रूप में, == का उपयोग करते हुए अशक्त का उपयोग करने पर अशक्त हो जाता है।
एडी पार्कर

1
@ EricElliott: typeofझूठ - कल्पना पढ़ें या nullएक निर्माता से लौटने की कोशिश करें
क्रिस्टोफ़

5
@ EricElliott: कंस्ट्रक्टर्स के रिटर्न वैल्यू का झूठा-नेस से कोई लेना-देना नहीं है, लेकिन ऑब्जेक्ट-नेस के साथ: अगर रिटर्न वैल्यू ऑब्जेक्ट है, तो उसे वापस कर दें; अगर यह एक आदिम है nullया 42, वापसी मूल्य को त्यागें और इसके बजाय नए बनाए गए ऑब्जेक्ट को वापस लौटाएं
क्रिस्टोफ

17

मुझे नहीं लगता कि दोनों के पास होने का कोई कारण है nullऔर undefinedक्योंकि केवल कई लोगों ने सुझाव दिया है (" undefinedइसका मतलब है कि ऐसा कोई चर / संपत्ति नहीं है") कम से कम जावास्क्रिप्ट में मान्य नहीं है। undefinedआपको यह नहीं बता सकता है कि चर / संपत्ति मौजूद है या नहीं।

console.log(foo);               // "ReferenceError: foo is not defined"
                                // foo does not exist
var foo;
console.log(foo);               // "undefined", a different response
console.log(foo === undefined); // "true", but it does exist

var obj = {};
console.log(obj.hasOwnProperty("foo")); // "false", no such property
obj.foo = undefined;
console.log(obj.hasOwnProperty("foo")); // "true", it exists and has the value "undefined"
console.log(obj.foo === undefined);     // "true", but it does exist

obj.bar = "delete me";
obj.bar = undefined;
console.log(obj.hasOwnProperty("bar")); // "true", not actually deleted
delete obj.bar;
console.log(obj.hasOwnProperty("bar")); // "false", deleted

जैसा कि आप देख सकते हैं, जाँच foo === undefinedयह नहीं बताती है कि क्या fooमौजूद है, और सेटिंग obj.bar = undefinedवास्तव में नष्ट नहीं होती है bar

यह जावास्क्रिप्ट लेखक का मूल इरादा हो सकता है जो undefined"कोई नहीं" का प्रतिनिधित्व करना चाहिए। हालाँकि, कार्यान्वयन इस तरह से नहीं निकला।


1
अपने उपरोक्त कोड उदाहरणों के undefinedसाथ बदलें null, और प्रतिक्रियाएं सभी समान हैं। मुझे यकीन नहीं है कि यह सवाल का जवाब कैसे देता है। क्या इसका मतलब किसी और के जवाब पर टिप्पणी करना था?
एरिक इलियट

1
सवाल का @EricElliott मेरा जवाब दोनों के लिए कोई कारण नहीं है कि है nullऔर undefinedक्योंकि एकमात्र कारण कई लोगों ने सुझाव दिया है मान्य नहीं है,।
लेई झाओ

आपको अपना उत्तर संपादित करना चाहिए और वास्तव में ऐसा कहना चाहिए। अगर आपने वह जवाब दिया होता तो मैं उबर जाता। =)
एरिक इलियट

@EricElliott मुझे लगता है कि आप सही हैं। मैंने अपना उत्तर संपादित कर दिया है। धन्यवाद!
लेई झाओ

3
यह उदाहरण वास्तव में दिखाता है कि यदि आपने एक चर नहीं दिया है, तो यह वापस आ जाता है undefined। लेकिन अगर आपने इसे असाइन undefinedकिया है, तो यह वास्तव में नहीं है undefined- इसके साथ परिभाषित किया गया था undefinedऔर इसका संदर्भ है। के बीच एकमात्र अंतर है undefinedऔर nullउनका उपयोग और ऐतिहासिक उद्देश्य है। वे दोनों परमाणु हैं।
अरबी कोमारोव

6

दोनों की जरूरत पूरी तरह से संभव है। उदाहरण के लिए यदि आप WMI को क्वेरी करते हैं तो पूरी तरह से एक क्लास रिटर्न गुण होना संभव है जिसमें एक शून्य मान है। वे परिभाषित हैं, वे केवल समय पर अशक्त होने के लिए होते हैं।


6

मुझे लगता है कि आपका निष्कर्ष कि जावास्क्रिप्ट undefined"ऐसी कोई संपत्ति नहीं है" के रूप में परिभाषित करता है और null"संपत्ति का कोई मूल्य नहीं है" के रूप में पूरी तरह से सही है। और भाषा में जावास्क्रिप्ट के रूप में गतिशील यह एक बहुत महत्वपूर्ण अंतर है। बतख टाइपिंग के उपयोग का मतलब है कि हमें ऐसी संपत्ति के बीच अंतर करने में सक्षम होना चाहिए जो मौजूदा नहीं है और मूल्य नहीं है। यह प्रकार की जानकारी प्राप्त करने का हमारा प्राथमिक साधन है। वैधानिक रूप से टाइप की गई भाषा में एक क्षेत्र के बीच एक निश्चित अंतर होता है जो अशक्त होता है और एक ऐसा क्षेत्र जो मौजूदा नहीं है। जावास्क्रिप्ट में यह अलग नहीं है। हालाँकि इसे रनटाइम पर चेक किया जाता है, और उस समय तक इसे संशोधित किया जा सकता है।

मैं इस बात से सहमत होने जा रहा हूं कि कार्यान्वयन अजीब है क्योंकि बहुत समय अंतर धुंधला है। हालाँकि मुझे लगता है कि जावास्क्रिप्ट में भेद महत्वपूर्ण है। और असाइन करने में सक्षम होना undefinedआवश्यक है।

मुझे याद है कि जावास्क्रिप्ट में लिखे गए एक ऑनलाइन आरपीजी के बारे में कुछ समय पहले एक ब्लॉग पोस्ट पढ़ना। इसमें ऐसे उदाहरणों का उपयोग किया गया था जहाँ वस्तुओं को प्रोटोटाइप्स (कक्षाओं, फ़ंक्शंस, जो कुछ भी) के बजाय मौजूदा उदाहरणों की प्रतियों के रूप में बनाया गया था, और फिर बदल दिए गए थे। इससे वास्तव में मुझे समझ आया कि undefinedमौजूदा वस्तुओं को संशोधित करते समय यह कितना शक्तिशाली हो सकता है, लेकिन मुझे याद नहीं है कि इसे किसने लिखा है।


क्या आप कृपया इस आरपीजी को साझा कर सकते हैं?
माइकल

3

शब्दार्थ वे अलग चीजों का मतलब है। प्रकार शून्य का अपने डोमेन में ठीक एक मूल्य है, शून्य और एक संपत्ति को यह विशिष्ट मूल्य सौंपा जा सकता है। अनिर्धारित किसी भी मूल्य को निर्दिष्ट किए जाने के एक अलग अभाव का प्रतिनिधित्व करता है।


1
लेकिन आप undefinedसंपत्तियों को सौंपने के लिए बस ठीक उपयोग कर सकते हैं , इसलिए इस अनुबंध (केवल undfinedअगर कोई ऐसी संपत्ति नहीं है तो) प्रोग्रामर द्वारा आसानी से तोड़ा जा सकता है ...
Christoph

2
आप कर सकते हैं , लेकिन आपको निश्चित रूप से नहीं करना चाहिए। अनिर्धारित का उपयोग जावास्क्रिप्ट में अपवाद के एक बहुत ही बुनियादी / सरलीकृत रूप के रूप में किया जाता है - इसे मूल्य के रूप में उपयोग न करें और इसे कुछ संपत्ति के लिए असाइन करें! वह पागल आदमी है।
rfunduk

3

एक जावा प्रोग्रामर के रूप में, मुझे अपरिभाषित और अशक्त के बीच एक बड़ा अंतर दिखाई देता है। जावास्क्रिप्ट को कोड करना, बहुत ज्यादा नहीं, क्योंकि जावास्क्रिप्ट को दृढ़ता से टाइप नहीं किया जाता है, और अपरिभाषित और अशक्त के बीच अंतर स्वचालित रूपांतरणों द्वारा धुंधला हो जाते हैं जो अक्सर रन-टाइम द्वारा निष्पादित होते हैं। BTW, मैं उन रूपांतरणों का लगातार लाभ उठाता हूं; वे मेरे JS कोड को अधिक कॉम्पैक्ट और पठनीय बनाते हैं।

आपके प्रश्न का उत्तर देने के लिए, अपरिभाषित का अर्थ है कि एक मूल्य कभी निर्धारित नहीं किया गया था। व्यावहारिक रूप से, यह आमतौर पर एक बग की ओर इशारा करता है। यदि आपकीObject.property अपरिभाषित है, तो इसका मतलब है कि आपने किसी कारण से संपत्ति निर्धारित नहीं की है, या मैं कुछ ऐसा ढूंढ रहा हूं जो बिल्कुल भी मौजूद नहीं है। एक से अधिक कोडर वाली परियोजना पर काम करते समय यह एक वास्तविक मुद्दा है।

अशक्त का अर्थ है कि "कोई मूल्य नहीं" स्पष्ट रूप से निर्धारित किया गया था। व्यावहारिक रूप से, आप मुझे संपत्ति के बारे में कुछ बता रहे हैं, शायद यह इस संदर्भ में उपयोग नहीं किया गया है, या यह कि मूल्य अभी तक निर्धारित नहीं किया गया है।

जावा में, अपरिभाषित एक क्षेत्र का उपयोग करने का प्रयास हमेशा एक अपवाद के रूप में होगा। वास्तव में, संकलक को आपके कोड में इसके बारे में चेतावनी देने के लिए बनाया जा सकता है।


0

इस उदाहरण का प्रयास करें:

<html>
<head>
    <script type="text/javascript">
        function ShowObjProperties(obj) {
            var property, propCollection = "";

            for(property in obj) {
                propCollection += (property + ": " + obj[property] + "\n");
            }

            alert(propCollection);
        }

        var obj = {
            userid: 3,
            name: 'me!',
            speak: function() { alert('Hi! My name is ' + this.name + ' and my ID is ' + this.userid + '.'); }
        }

        //Shows all properties
        ShowObjProperties(obj);

        //The Speak function is no longer in the list!
        delete obj.speak;
        alert(typeof obj.speak);
        ShowObjProperties(obj);

        //The UserID is still listed, it just has no value!
        obj.userid = null;
        ShowObjProperties(obj);
    </script>
</head>
<body>

</body>
</html>

मुझे लगता है कि यहां 2 अलग-अलग प्रकारों के लिए बहुत वास्तविक उपयोग है।


और मुझे लगता है कि प्रोटोटाइप में, एक सदस्य अशक्त या सिर्फ अपरिभाषित है।
केव

लेकिन यह केवल तब तक काम करता है जब तक कोई इसे तोड़ने की कोशिश नहीं करता है - अगर मैं सेट करता हूं obj.userid = undefined, तो यह विफल हो जाएगा - मेरे प्रश्न का अंतिम संपादन देखें
क्रिस्टोफ़

0

क्या यह नीचे आता है गतिशील प्रकृति javascripts है।

चीजें अपरिभाषित हो सकती हैं ताकि बाद में उन्हें जोड़ा जा सके। यह यकीनन है कि जावास्क्रिप्ट इतना शक्तिशाली और एक्स्टेंसिबल क्यों है।


और यह मेरे प्रश्न के लिए किस तरह से प्रासंगिक है?
क्रिस्टोफ

2
यह प्रासंगिक है क्योंकि यह आपके प्रश्न का उत्तर देता है। 'null' एक तरह का 'सिंगलटन' है जिसका अर्थ है 'जिसका कोई मूल्य नहीं है'। 'अपरिभाषित' आपको बता रहा है कि कुछ है ... चौंकाने वाला, मुझे पता है ... परिभाषित नहीं। वे पूरी तरह से अलग चीजें हैं।
rfunduk

0

यह एक महत्वपूर्ण भाषा सुविधा है यदि आप जावास्क्रिप्ट के इवेंटेड प्रतिमान के आसपास अपने कार्यक्रम को लपेटते हैं।

// a key exists as a placeholder for something
if(obj[name] === null) 
// no key exists int eh hashtable that is in this object
if(obj[name] === undefined)

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

filter_func_pt = {
  date:function(d){ return Math.round(d.getTime()/1000);},
  user: null,
}

function transform(obj){
    var ret = {};
    for( var prop in obj){
       var f = filter_func_pt[prop];
       if(f)
          ret[prop] = f(obj);
       else if(filter_func_pt[prop] === null)
         continue;
       else
         ret[prop] == obj;
    }
  return ret;
}

var a = {
   date: new Date(),
   user: 'sam'
   votes: [23, 41, 55] 
};

var b = transform(a);

/* b = {
 *    date: 1298582417
 *    votes: [23, 41, 55]
 * }
 */

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


यह उदाहरण आकस्मिक है और थोड़ा निरर्थक है। नल आपके इरादे को स्पष्ट नहीं करता है - बल्कि, यह इसे मास्क करता है। आप अर्थ स्पष्ट करने के लिए अधिक स्पष्ट स्ट्रिंग का उपयोग कर सकते थे। जैसे, 'रोक' या 'पट्टी' और फिर आप फ़ंक्शन के प्रकार के बारे में और अधिक स्पष्ट हो सकते हैं और वास्तव में फ़ंक्शन की उपस्थिति के लिए जांच कर सकते हैं।
एरिक इलियट

0

अशक्त सुंदर है

लाइव स्क्रिप्ट के अन्य सभी प्रकार हैं।

हवाला: जावास्क्रिप्ट में, दो मूल्य हैं जो मूल रूप से कहते हैं 'मैं मौजूद नहीं है' - अपरिभाषित और अशक्त।

आप गलत बातें क्यों कहना चाहेंगे ?!

"अशक्त" है "खाली ऑब्जेक्ट" की तरह "0" एक है "खाली संख्या" । 0, कुछ भी नहीं है-यह एक प्रकार की संख्या के रूप में मौजूद है। नल बेशक खाली है लेकिन "यह" है और यह एक वस्तु प्रकार की अच्छी तरह से परिभाषित चीज है ।

इन चीजों को "प्रकार" के रूप में बोलना आम है, जब वे नहीं होते हैं। वास्तव में वे "श्रेणियां" हैं। लेकिन यह अब खत्म हो गया है।

तो यह कहने के लिए कि "नल" एक प्रकार की वस्तु के बिना है। और "अशक्त" कहता है "मैं बहुत अधिक मौजूद हूं!], लेकिन मेरे पास अपनी तरह की सामग्री नहीं है"।

जबकि अपरिभाषित में टाइप और किंड दोनों का अभाव होता है, जहां अपरिभाषित होता है, वह भी इसकी टाइप परिभाषा है। एक प्रकार का अपरिभाषित प्रकार इसकी विशिष्ट टाइपोलॉजी बन जाता है। एक तरह का [करता है "कुछ नहीं" मौजूद है और आप "कुछ भी नहीं" कैसे परिभाषित करते हैं?] सवाल।

हवाला: अपरिभाषित और अशक्त एक निर्माता समारोह से नहीं लौटा जा सकता है, क्योंकि दोनों एक खाली वस्तु के लिए कनवर्टर होंगे

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

हवाला: केवल वास्तविक अंतर जो मैं सोच सकता हूं, वह यह है कि एक NaN का मूल्यांकन करता है, दूसरा संख्यात्मक संदर्भों में।

जैसा कि उल्लेख किया गया है, उनके मूल अंतर को पूरा करता है: जैसा कि अपरिभाषित एक सादा टोकन है और चूंकि यह उसी 'जेनेटिक' सामग्री से बना है, जिसके दूर के रिश्तेदार: स्ट्रिंग्स, [+ अपरिभाषित] ऑपरेशन इसे डक-कन्वर्ट कर देंगे। NaN, इसी तरह अशक्त रूप से अपने आप को एक सही प्रकार 0 \ Number में बदल देगा, और अपरिभाषित के विपरीत जो एक स्ट्रिंग में morph होगा (जो खाली नहीं है!) और यही कारण है कि इसके बजाय NaN पैदावार करता है । कहाँ: + अपरिभाषित >> + "अपरिभाषित" >> NaN। चूंकि संख्यात्मक संदर्भ स्पष्ट मूल्य की अपेक्षा करता है।

जबकि बूलियन संदर्भ संदर्भ की अपेक्षा करता है - कन्वर्ट करने के लिए कुछ भी नहीं पाता है और 'झूठी' उपज देता है।

चलो अब के माध्यम से कटौती ...

हवाला: तो एक बार फिर: अपरिभाषित और अशक्त के लिए अलग मूल्यों के लिए व्यावहारिक उपयोग क्या है?

मैं आपको केवल दो अनुभवजन्य उदाहरण देने की कोशिश करूंगा और पर्याप्त होने की उम्मीद करूंगा

oElement.onclick >> null

// का अर्थ है-संपत्ति मौजूद है; इसका अपेक्षित मूल्य प्रकार का है: ऑब्जेक्ट , और यह कि ओइमेंट "ऑनक्लिक" ईवेंट का समर्थन करता है!

oElement.innerText >> ""

// का अर्थ है - संपत्ति मौजूद है; इसका अपेक्षित मूल्य प्रकार का है: स्ट्रिंग , जिसका अर्थ है कि ओइमेंट "इनरटेक्स्ट" संपत्ति का समर्थन करता है।

दोनों मामलों में, यदि आप "अपरिभाषित" प्राप्त करते हैं, तो इसका मतलब है कि संपत्ति मौजूद नहीं है; समर्थित नहीं है या गलत (ua विक्रेता) कार्यान्वयन है।

ठंढ से रहें और मज़े करें।


अपनी पोस्ट, aeneas पर बर्बरता न करें। यदि आप अपना योगदान हटाना चाहते हैं तो उन्हें हटाएं ( इस टिप्पणी के ठीक ऊपर हटाएं बटन का उपयोग करके )।
माइकल पेट्रोत्ता 21

कोई डिलीट बटन नहीं है - लेकिन यदि आप इसे देखते हैं तो कृपया इसे क्लिक करें!

0

अपरिभाषित बनाम अशक्त के बारे में आश्चर्यजनक चर्चा पढ़ने के बाद, Google पर थोड़ी सी खोज मुझे मोज़िला दस्तावेज़ों में ले गई https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Object/null यह उल्लेख किया गया है - null अक्सर होता है ऐसी जगह पर पुनः प्राप्त किया जा सकता है जहाँ किसी वस्तु की उम्मीद की जा सकती है लेकिन कोई वस्तु प्रासंगिक नहीं है।

Null ऑब्जेक्ट पैटर्न https://en.wikipedia.org/wiki/Null_object_pattern के समान नहीं है

तो मुझे लगता है कि यह समझ में आता है कि अशक्त डेटा प्रकार है।

दस्तावेज़ीकरण को टाइपो null // "ऑब्जेक्ट" के रूप में भी उल्लेख किया गया है (विरासत कारणों के लिए "शून्य" नहीं)

निश्चित नहीं है कि विरासत के कारण क्या हैं

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