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


103

मैं अब काफी समय से जावास्क्रिप्ट लिख रहा हूं, और मेरे पास उपयोग करने का कोई कारण नहीं है null। ऐसा लगता है कि undefinedयह हमेशा बेहतर होता है और समान उद्देश्य से प्रोग्राम करता है। nullइसके बजाय उपयोग करने के कुछ व्यावहारिक कारण क्या हैं undefined?



वैसे ऐसे तरीके हैं document.getElementById()जो वापस आ सकते हैं nullलेकिन नहीं undefined, इसलिए उन मामलों में आप वापसी के लिए परीक्षण क्यों करेंगे undefined? (निश्चित रूप से, यह काम करेगा यदि आप ==इसके बजाय उपयोग करते हैं ===, लेकिन फिर भी, आप जानबूझकर गलत चीज़ का परीक्षण क्यों करेंगे?)
nnnnnn

यह अनुमान लगाने योग्य प्रकारों के लिए सहायक हो सकता है और यह एक या दूसरे का उपयोग करने के लिए सोच को निर्देशित कर सकता है। जहाँ एक वस्तु को हमेशा डिज़ाइन के द्वारा वापस लौटाया जाता है, उसकी आवश्यकता होती है या उसे गलत तरीके से इस्तेमाल किया जाता है (जैसे document.getElementById('does-not-exist'))। चर var a;और फ़ंक्शन वापसी मान अपरिभाषित के लिए डिफ़ॉल्ट हैं। अतीत में अशक्तता वैश्विक दायरे में थी इसलिए इसका उपयोग धीमी गति से किया गया और मुझे अन्य मिथ्या प्रकार (झूठे, '', 0) को मुक्त संदर्भ में पसंद करने के लिए प्रेरित किया। मैं व्यक्तिगत रूप से अशक्त होने से बचता हूं जब तक कि कोई सम्मोहक कारण न हो क्योंकि मैं इसे सरल समझता हूं, जो आमतौर पर बेहतर होता है।
जेमोंट

जवाबों:


59

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

उस ने कहा, एक बड़ा अंतर है - चर जो कि आरंभिक नहीं हैं (फ़ंक्शन मापदंडों सहित जहां कोई तर्क पारित नहीं किया गया था, अन्य चीजों के साथ) हमेशा अपरिभाषित होते हैं

यही कारण है कि मेरे कोड में मैं कभी भी अशक्त का उपयोग नहीं करता हूं जब तक कि मैं कुछ रिटर्न रिटर्न को नियंत्रित नहीं करता (उदाहरण के लिए रेगेक्स मिलान)। इस की सुंदरता यह है कि यह चीजों को बहुत कुछ मिलाता है। मुझे कभी भी जाँच नहीं करना है कि क्या x === अपरिभाषित है || x === अशक्त। और अगर आप == या बस का उपयोग करने की आदत में हैं जैसे (x) ...। इसे रोक। !xएक खाली स्ट्रिंग, 0, अशक्त, NaN के लिए सही का मूल्यांकन करेगा - यानी ऐसी चीजें जो आप नहीं चाहते हैं। यदि आप जावास्क्रिप्ट लिखना चाहते हैं जो भयानक नहीं है, तो हमेशा ट्रिपल बराबर === का उपयोग करें और कभी भी अशक्त का उपयोग न करें (इसके बजाय अपरिभाषित का उपयोग करें)। यह आपके जीवन को आसान बना देगा।


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

6
@ com2ghz आप जो वर्णन करते हैं वह कई दर्शनों में से एक है। कई js पुस्तकालयों वास्तव में इस तरह से काम करते हैं। कई भी इस तरह से काम नहीं करते हैं। जावास्क्रिप्ट में, आप बस आसानी से किसी ऑब्जेक्ट या सरणी में एक स्पष्ट अपरिभाषित मूल्य को स्टोर कर सकते हैं जैसा कि आप अशक्त कर सकते हैं। दोनों के अर्थ पूरी तरह से और पूरी तरह से संदर्भ पर निर्भर हैं। IE वे मतलब है कि आप उन्हें क्या मतलब चाहते हैं।
बीटी

3
इसलिए जेएस एक भयानक भाषा है। जैसा कि आप कहते हैं, कई पुस्तकालयों के अपने दर्शन हैं लेकिन आप 1 परियोजना के लिए कई पुस्तकालयों को शामिल करते हैं। तो आप उन पुस्तकालयों के कई सम्मेलनों के साथ सामना करते हैं। अलग-अलग झूठी जाँच करने के लिए आपको कितनी बार चाहिए। यह आखिरी बार नहीं होगा कि आप एक स्ट्रिंग के लिए एक अशक्त वस्तु को छुपाते हैं और एक स्ट्रिंग के रूप में "नल" प्राप्त करते हैं। या 0 को संख्यात्मक मान के रूप में पास करना और यह सोचना कि क्यों IF कथन हैंडल एक गलत के रूप में है।
com2ghz

2
@ com2ghz तो JS एक भयानक भाषा है क्योंकि दोनों अशक्त और अपरिभाषित है? मैं सभी प्रमुख भाषाओं में दर्जनों बुरे भाषा निर्णयों की गिनती कर सकता हूं, js कोई अपवाद नहीं है। मुझे सचमुच अपने कोड में झूठी जांच का उपयोग करने ===या हमेशा उपयोग करने की आवश्यकता नहीं है या हमेशा उपयोग करना चाहिए या !==। JS एक विलक्षण रूप से अभिव्यंजक भाषा है यदि आप जानते हैं कि इसका उपयोग कैसे करना है।
बीटी

6
सही। मैंने अभी-अभी जाना कि null/ undefineddichotomy आवश्यक था क्योंकि JS का आरंभिक संस्करण hasOwnPropertyया inऑपरेटर नहीं था । अब जब कि यह होता है, मुझे वास्तव में समझ में नहीं आता है कि उनमें से एक ईएस 6 या मेरे द्वारा देखे गए किसी भी ईएस 7 प्रस्तावों को समाप्त क्यों नहीं किया गया है।
एंडी

86

मैं वास्तव में एक जवाब नहीं है, लेकिन के अनुसार निकोलस सी Zakas , अपनी पुस्तक के पृष्ठ 30 " वेब डेवलपर्स के लिए व्यावसायिक जावास्क्रिप्ट " :

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


8
+1 हाँ, मैं सहमत हूँ और मैं हमेशा null के लिए var को इनिशियलाइज़ करने के लिए याद रखने की कोशिश करता हूँ। तब मुझे (सुंदर) यकीन है कि undefinedइसका मतलब है कि एक आपदा हुई। बस इमो।
पीट विल्सन

9
@ पता - लेकिन यह आपको "आपदा" के बारे में कुछ नहीं बताता है, तो क्या बात है? और आप केवल उस धारणा को बना सकते हैं यदि आप जानते हैं कि समारोह सम्मेलन का अनुसरण करता है।
रॉब जूल

7
दूसरी ओर, आप चर को var myVar;पहले undefinedसे निर्धारित कर सकते हैं और यह निर्धारित करने के लिए मान के लिए स्पष्ट रूप से जांच कर सकते हैं कि यह बाद के समय में ऑब्जेक्ट संदर्भ से भरा है या नहीं। मेरा कहना है कि यह पूरी तरह से अकादमिक है - आप इसे किसी भी तरह से कर सकते हैं, और जो कोई भी दूसरे पर एक तरह से सलाह देता है वह बस अपने स्वयं के सम्मेलन को आगे बढ़ा रहा है।
थोदो

1
मेरे पास एकमात्र समस्या है (क्योंकि मैंने 15 साल पहले जावास्क्रिप्ट के साथ शुरू किया था) यह है कि आपको अक्सर परीक्षण करना होगा undefinedऔर null। यह अभी भी वास्तव में कष्टप्रद है। मैं nullअतिरिक्त nullपरीक्षण की संख्या को कम करने के लिए केवल एक चर निर्दिष्ट करने से बचता हूं ।
जी मैन

4
@ मन - यह एकमात्र स्थान है जहाँ ==तुलना (जैसा विरोध किया जाता है ===) समझ में आता है: v == null(या v == undefined) अशक्त या अनिर्धारित की जाँच करेगा।
रिक लव

14

दिन के अंत में, क्योंकि दोनों nullऔर undefinedएक ही मूल्य के लिए ( Boolean(undefined) === false && Boolean(null) === false), आप तकनीकी रूप से या तो काम पूरा करने के लिए उपयोग कर सकते हैं। हालाँकि, सही तरीका है, IMO।

  1. undefinedजावास्क्रिप्ट संकलक के उपयोग को छोड़ दें ।

    undefinedका उपयोग उन चर का वर्णन करने के लिए किया जाता है जो संदर्भ के लिए इंगित नहीं करते हैं। यह कुछ ऐसा है जो JS संकलक आपके लिए देखभाल करेगा। संकलन के समय जेएस इंजन सभी फहराए गए चरों का मान निर्धारित करेगा undefined। जैसे ही कोड और मान के माध्यम से इंजन उपलब्ध हो जाता है, इंजन संबंधित वैरिएबल को संबंधित मान प्रदान करेगा। उन चरों के लिए जिनके लिए यह मान नहीं पाया गया है, चर आदिम के लिए एक संदर्भ बनाए रखना जारी रखेंगे undefined

  2. केवल शून्य का उपयोग करें यदि आप स्पष्ट रूप से "कोई मूल्य नहीं" होने के रूप में एक चर के मूल्य को निरूपित करना चाहते हैं।

    जैसा कि @ com2gz बताता है: nullप्रोग्राम को खाली रूप से परिभाषित करने के लिए उपयोग किया जाता है। undefinedकहने का मतलब यह है कि संदर्भ मौजूद नहीं है। एक nullमान में "कुछ भी नहीं" के लिए एक परिभाषित संदर्भ है। यदि आप किसी ऑब्जेक्ट की गैर-मौजूदा संपत्ति कह रहे हैं, तो आपको मिलेगा undefined। अगर मैं उस संपत्ति को जानबूझकर खाली कर दूंगा, तो यह होना चाहिए nullताकि आप जान सकें कि यह उद्देश्य पर है।

TLDR; undefinedआदिम का उपयोग न करें । यह मान है कि JS संकलक स्वचालित रूप से आपके लिए सेट हो जाएगा जब आप बिना असाइनमेंट के चर घोषित करते हैं या यदि आप उन वस्तुओं के गुणों तक पहुंचने का प्रयास करते हैं जिनके लिए कोई संदर्भ नहीं है। दूसरी ओर, nullयदि आप जानबूझकर "कोई मान नहीं" चाहते हैं , तो केवल और केवल तभी उपयोग करें ।

मैंने स्पष्ट रूप से अपरिभाषित के लिए कुछ भी निर्धारित नहीं किया है (और मैंने उन कई कोडबेस में नहीं आया है जिनके साथ मैंने बातचीत की है)। इसके अलावा, मैं शायद ही कभी इस्तेमाल करते हैं nullnullजब मैं किसी फ़ंक्शन के मान को निरूपित करना चाहता हूं, तो इसका कोई अर्थ नहीं है:

function printArguments(a,b) {
  console.log(a,b);
}

printArguments(null, " hello") // logs: null hello

यह चयनित उत्तर होना चाहिए था
अलाबौडी

13

अपरिभाषित वह जगह है जहाँ चीज़ की कोई धारणा मौजूद नहीं है; इसका कोई प्रकार नहीं है, और इसे उस दायरे से पहले संदर्भित नहीं किया गया है; अशक्त वह जगह है जहाँ बात मौजूद है, लेकिन इसका कोई मूल्य नहीं है।


4
आपको कैसे पता चलेगा कि क्या कोई मान असाइन करने का प्रयास किया गया था, लेकिन यह विफल हो गया और अपरिभाषित के बजाय असाइन किया गया था?
रॉब जूल

11

हर किसी के पास कोडिंग का अपना तरीका है और अपने स्वयं के आंतरिक शब्दार्थ हैं, लेकिन वर्षों से मुझे यह सबसे सहज सलाह मिली है कि मैं इस सवाल को पूछने वाले लोगों को देता हूं: जब संदेह हो, तो वह करें जो जावास्क्रिप्ट करता है

मान लें कि आप ऑब्जेक्ट गुणों के साथ काम कर रहे हैं जैसे कि jQuery प्लगइन के विकल्प ... अपने आप से पूछें कि जावास्क्रिप्ट किस मूल्य पर एक संपत्ति देता है जिसे अभी तक परिभाषित नहीं किया गया है - जवाब है undefined। इसलिए इस संदर्भ में, मैं जावास्क्रिप्ट के साथ संगत होने के लिए 'अपरिभाषित' के साथ इस प्रकार की चीजों को इनिशियलाइज़ करूँगा (चर के लिए, आप var myVar;इसके बजाय कर सकते हैं var myVar = undefined;)।

अब मान लेते हैं कि आप DOM मैनिपुलेशन कर रहे हैं ... JavaScript गैर-मौजूद तत्वों को क्या मान देता है? जवाब है null। यदि आप एक प्लेसहोल्डर वैरिएबल बना रहे हैं जो बाद में एक तत्व, दस्तावेज़ टुकड़ा, या डोम से संबंधित है जो इसी तरह का संदर्भ रखेगा, तो यह वह मूल्य है जो मैं शुरू में लिखूंगा।

यदि आप JSON के साथ काम कर रहे हैं, तो एक विशेष मामला बनाने की जरूरत है: अपरिभाषित संपत्ति मूल्यों के लिए, आपको या तो उन्हें सेट करना चाहिए ""या nullक्योंकि मान undefinedJSON प्रारूप में उचित नहीं माना जाता है।

साथ यह कहा, के रूप में पिछले एक पोस्टर व्यक्त किया है, तो आप पाते हैं कि आप के साथ सामान आरंभ कर रहे हैं कि अगर nullया undefinedएक नीला चाँद में एक बार से अधिक है, तो हो सकता है आप पर पुनर्विचार करना चाहिए कि कैसे आप अपने अनुप्रयोग कोडिंग के बारे में जाना।


हालांकि यह एक अच्छा रुख है, मैं इस उत्तर को जोड़ना चाहूंगा: stackoverflow.com/a/37980662/883303
फ्रेडरिक क्रौटवल्ड

@FrederikKrautwald लिंक के लिए धन्यवाद - यह एक बहुत ही स्पष्ट भ्रम है।
2

10

आप यहां दिए गए सम्मेलन को अपना सकते हैं, लेकिन वास्तव में इसका कोई अच्छा कारण नहीं है। सार्थक होने के लिए इसका लगातार उपयोग नहीं किया जाता है।

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

तो दिन के अंत में, सम्मेलन सरल वातावरण में बहुत छोटे कार्यक्रमों के अलावा अन्य किसी भी चीज में व्यावहारिक रूप से बेकार है।


3

शून्य में एक उपयोगी संपत्ति जो अपरिभाषित नहीं होती है:

> null + 3
3
> undefined + 3
NaN

मैं का उपयोग करें nullजब मैं एक अंकीय मान 'बंद कर देते हैं' के लिए, या कुछ को प्रारंभ करना चाहते हैं। मेरा अंतिम उपयोग सीएसएस परिवर्तन में हेरफेर कर रहा था:

const transforms = { perspective : null, rotateX : null };
// if already set, increase, if not, set to x
runTimeFunction((x) => { trasforms.perspective += x; });
// still useful, as setting perspective to 0 is different than turning it off
runTimeFunction2((x) => { transforms.perspective = null; });

// toCss will check for 'null' values and not set then at all
runTimeFunction3(() => { el.style.transform = toCss(transforms); });

यकीन नहीं होता कि अगर मुझे इस संपत्ति का इस्तेमाल करना चाहिए ...


2

डोम नोड्स और तत्व अपरिभाषित नहीं हैं, लेकिन अशक्त हो सकते हैं।

  • किसी तत्व के अंतिम बच्चे का अगला नामकरण अशक्त है।

  • पहले बच्चे की पिछलीबुलिंग शून्य है।

  • यदि दस्तावेज़ में तत्व मौजूद नहीं है, तो एक document.getElementById संदर्भ शून्य है।

लेकिन इनमें से किसी भी मामले में अपरिभाषित मूल्य नहीं है ; वहाँ कोई नोड नहीं है।


स्पष्टीकरण के लिए धन्यवाद। मेरे लिए यह अधिक प्रति-सहज नहीं हो सकता।
टोमेक्वि २ tom

यह वास्तव में इस बात पर निर्भर करता है कि आप क्या जाँचना चाहते हैं। उदाहरण के लिए, यदि आप यह देखना चाहते हैं कि क्या 'myVar' नाम का एक वैश्विक वैरिएबल मौजूद है, तो window.myVarयह 'अपरिभाषित' होने पर वापस नहीं आएगा। जावास्क्रिप्ट में 'अपरिभाषित' लौटने वाले टन के सामान हैं, बस कई चीजें हैं जो 'अशक्त' लौटाती हैं - यह सब संदर्भ पर निर्भर करता है।
बृहस्पतिवार

2

कुछ ने कहा है कि वस्तुओं को इनिशियलाइज़ करना ठीक है null। मैं सिर्फ यह बताना चाहता था कि विनाशकारी तर्क चूक से काम नहीं चलता null। उदाहरण के लिए:

const test = ({ name } = {}) => {
  console.log(name)
}

test() // logs undefined
test(null) // throws error

इसके लिए फ़ंक्शन को कॉल करने से पहलेnull चेक करने की आवश्यकता होती है जो अक्सर हो सकता है।


1

मैं अभी इस सटीक प्रश्न के माध्यम से काम कर रहा हूं, और निम्नलिखित दर्शन देख रहा हूं:

  1. कोई भी फ़ंक्शन जो किसी परिणाम को प्राप्त करने का इरादा रखता है, यदि परिणाम प्राप्त करने में विफल रहता है तो उसे वापस लौटना चाहिए
  2. कोई भी फ़ंक्शन जिसका परिणाम अप्रत्यक्ष रूप से अपरिभाषित रिटर्न देना नहीं है।

मेरे लिए, यह प्रश्न महत्वपूर्ण है क्योंकि किसी भी फ़ंक्शन को कॉल करने वाला जो परिणाम देता है उसके पास कोई सवाल नहीं होना चाहिए कि क्या अपरिभाषित बनाम अशक्त के लिए परीक्षण करना है।

यह उत्तर पता करने का प्रयास नहीं करता है:

  1. शून्य बनाम अपरिभाषित की संपत्ति मूल्य
  2. आपके कार्यों के भीतर भिन्नता शून्य बनाम अपरिभाषित है

मेरी राय में, चर आपके खुद के व्यवसाय हैं और आपके एपीआई का हिस्सा नहीं हैं, और किसी भी ओओ प्रणाली में गुणों को परिभाषित किया गया है और इसलिए उन्हें अलग-अलग मूल्य से परिभाषित किया जाना चाहिए, यदि वे परिभाषित नहीं हैं तो क्या परिभाषित किया गया है, अपरिभाषित क्या है? जब कोई वस्तु जो आपकी वस्तु में न हो तो उसे प्राप्त करना)।


1

यहाँ एक कारण है: var undefined = 1 कानूनी जावास्क्रिप्ट है, लेकिन var null = 1एक सिंटैक्स त्रुटि है। अंतर यह है कि nullएक भाषा कीवर्ड है, जबकि undefined, किसी कारण से, नहीं।

यदि आपका कोड तुलना करने पर निर्भर करता है undefinedजैसे कि यह एक कीवर्ड है ( if (foo == undefined)- बनाने के लिए एक बहुत ही आसान गलती) जो केवल इसलिए काम करता है क्योंकि किसी ने उस नाम के साथ एक चर को परिभाषित नहीं किया है। यह सब कोड किसी गलती से या दुर्भावनापूर्ण रूप से उस नाम के साथ एक वैश्विक चर को परिभाषित करने के लिए असुरक्षित है। बेशक, हम सभी जानते हैं कि गलती से एक वैश्विक चर को परिभाषित करना जावास्क्रिप्ट में पूरी तरह से असंभव है ...


1
void 0अपरिभाषित के बजाय का उपयोग करें ।
फ्रेडरिक क्राउटवल्ड

1

बस यह जोड़ना चाहते हैं कि कुछ जावास्क्रिप्ट पुस्तकालयों के उपयोग के साथ, अशक्त और अपरिभाषित के अनपेक्षित परिणाम हो सकते हैं।

उदाहरण के लिए, लॉश का getकार्य, जो एक 3 डी तर्क के रूप में एक डिफ़ॉल्ट मान को स्वीकार करता है:

const user = {
  address: {
    block: null,
    unit: undefined,
  }
}
console.log(_.get(user, 'address.block', 'Default Value')) // prints null
console.log(_.get(user, 'address.unit', 'Default Value')) // prints 'Default Value'
console.log(_.get(user, 'address.postalCode', 'Default Value')) // prints 'Default Value'

एक अन्य उदाहरण: यदि आप रिएक्ट में डिफ़ॉल्टप्रॉप्स का उपयोग करते हैं, यदि कोई संपत्ति पास हो जाती है null, तो डिफ़ॉल्ट प्रॉप्स का उपयोग नहीं किया जाता है क्योंकि नल को एक परिभाषित मूल्य के रूप में व्याख्या की जाती है । जैसे

class MyComponent extends React.Component {
   static defaultProps = {
      callback: () => {console.log('COMPONENT MOUNTED')},
   }
   componentDidMount() {
      this.props.callback();
   }
}
//in some other component
<MyComponent />   // Console WILL print "COMPONENT MOUNTED"
<MyComponent callback={null}/>   // Console will NOT print "COMPONENT MOUNTED"
<MyComponent callback={undefined}/>   // Console WILL print "COMPONENT MOUNTED"

0

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

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

var p1 = function(){this.value = 1};
var big_array = new Array(100000000).fill(1).map((x, index)=>{
    p = new p1();
    if(index > 50000000){
       p.x = "some_string";
    }

    return p;
});
big_array.reduce((sum, p)=> sum + p.value, 0)

var p2 = function(){this.value = 1, p.x = null};
var big_array = new Array(100000000).fill(1).map((x, index)=>{
    p = new p2();
    if(index > 50000000){
       p.x = "some_string";
    }

    return p; 
});
big_array.reduce((sum, p)=> sum + p.value, 0)

0

अज्ञात चर undefined:।

ज्ञात चर अभी तक कोई मूल्य नहीं है null:।

  1. आप एक सर्वर से एक वस्तु प्राप्त server_object
  2. आप संदर्भ दें server_object.errj। यह आपको बताता है undefined। इसका मतलब है कि यह नहीं जानता कि वह क्या है।
  3. अब आप संदर्भ दें server_object.err। यह आपको बताता है null। इसका मतलब है कि आप एक सही चर का संदर्भ दे रहे हैं लेकिन यह खाली है; इसलिए कोई त्रुटि नहीं।

समस्या तब होती है जब आप एक चर नाम को बिना मूल्य के var helloघोषित करते हैं ( ) जेएस यह घोषणा करता है कि undefined: यह चर मौजूद नहीं है; जबकि प्रोग्रामर ज्यादातर मतलब है: "मैं इसे अभी तक एक मूल्य नहीं दिया है", की परिभाषा null

तो एक प्रोग्रामर का डिफ़ॉल्ट व्यवहार- एक वैरिएबल को बिना मूल्य के घोषित करना- जैसा कि js के साथ बाधाओं पर है - इसे मौजूदा घोषित करना। और इसके अलावा, !undefinedऔर !nullदोनों trueइतने अधिक प्रोग्रामर हैं कि उन्हें समान मानते हैं।

आप निश्चित रूप से यह सुनिश्चित कर सकते हैं कि आप हमेशा ऐसा करें, var hello = nullलेकिन अधिकांश लोग अपने कोड को इस तरह से नहीं करेंगे, ताकि वे जानबूझकर शिथिल टाइप की भाषा में टाइप संन्यास सुनिश्चित कर सकें, जब वे और !ऑपरेटर दोनों समान undefinedऔर nullसमान व्यवहार करते हैं ।

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