क्या मैं एक तर्क के रूप में अपरिभाषित या अपरिभाषित पास करने के लिए चर सेट कर सकता हूं?


304

मैं जावास्क्रिप्ट undefinedऔर nullमूल्यों के बारे में थोड़ा भ्रमित हूं ।

if (!testvar)वास्तव में क्या करता है? इसके लिए परीक्षण करता है undefinedऔर nullया बस undefined?

एक बार एक चर परिभाषित किया गया है मैं इसे वापस undefined(इसलिए चर को हटाने) को साफ कर सकता हूं ?

क्या मैं undefinedएक पैरामीटर के रूप में पास कर सकता हूं ? उदाहरण के लिए:

function test(var1, var2, var3) {

}

test("value1", undefined, "value2");

जवाबों:


513

मैं जावास्क्रिप्ट अपरिभाषित और अशक्त के बारे में थोड़ा भ्रमित हूं।

के बारे में भ्रमित मत हो null। यह आम तौर पर समझ में आता है और अन्य स्क्रिप्टिंग भाषाओं की आउट-ऑफ-बैंड 'null', 'nil' या 'none' ऑब्जेक्ट्स की अवधारणाओं के समान व्यवहार करता है।

undefinedदूसरी ओर, एक अजीब जावास्क्रिप्ट क्विक है। यह एक सिंगलटन ऑब्जेक्ट है जो आउट-ऑफ-बैंड मूल्यों का प्रतिनिधित्व करता है, अनिवार्य रूप से एक समान दूसरा-लेकिन-अलग null। यह आता है:

  1. जब आप functionकथन सूचियों में तर्क सूची की तुलना में कम तर्कों के साथ किसी फ़ंक्शन को कॉल करते हैं, तो अनपेक्षित तर्क सेट किए जाते हैं undefined। आप उदाहरण के लिए उस के लिए परीक्षण कर सकते हैं।

    function dosomething(arg1, arg2) {
        if (arg2===undefined)
        arg2= DEFAULT_VALUE_FOR_ARG2;
        ...
    }

    इस पद्धति से आप dosomething(1)और के बीच का अंतर नहीं बता सकते हैं dosomething(1, undefined); arg2दोनों में समान मूल्य होगा। यदि आपको उस अंतर को बताने की आवश्यकता है जिसे आप देख सकते हैं arguments.length, लेकिन वैकल्पिक तर्क जैसे कि आमतौर पर बहुत पठनीय नहीं है।

  2. जब कोई फ़ंक्शन नहीं होता है return value;, तो वह वापस आ जाता है undefined। आमतौर पर इस तरह के रिटर्न परिणाम का उपयोग करने की कोई आवश्यकता नहीं है।

  3. जब आप var aएक ब्लॉक में एक स्टेटमेंट होने पर एक वैरिएबल घोषित करते हैं , लेकिन अभी तक इसके लिए कोई वैल्यू नहीं दी गई है, तो यह है undefined। फिर, आपको वास्तव में कभी भी उस पर भरोसा करने की आवश्यकता नहीं होनी चाहिए।

  4. डरावना typeofऑपरेटर 'undefined'तब लौटता है जब उसका ऑपरेंड एक साधारण चर होता है जो मौजूद नहीं होता है, एक त्रुटि को फेंकने के बजाय जैसा कि आप इसे संदर्भित करने की कोशिश करते हैं तो सामान्य रूप से होता है। (आप भी इसे कोष्ठक में लिपटे एक सरल चर दे सकते हैं, लेकिन नहीं है कि के लिए ज्यादा नहीं उपयोग या तो एक पूर्ण एक गैर existant चर शामिल अभिव्यक्ति।),।

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

    यह अक्सर गुणों के अस्तित्व की जांच करने के लिए उपयोग किया जाता है:

    if (o.prop!==undefined) // or often as truthiness test, if (o.prop)
       ...do something...

    हालाँकि, क्योंकि आप undefinedकिसी अन्य मान की तरह असाइन कर सकते हैं :

    o.prop= undefined;

    यह वास्तव में नहीं पता करता है कि संपत्ति मज़बूती से वहाँ है। inऑपरेटर का उपयोग करने के लिए बेहतर है , जो जावास्क्रिप्ट के मूल नेटस्केप संस्करण में नहीं था, लेकिन अब हर जगह उपलब्ध है:

    if ('prop' in o)
        ...

संक्षेप में, undefinedएक जावास्क्रिप्ट-विशिष्ट गड़बड़ है, जो सभी को भ्रमित करता है। वैकल्पिक फ़ंक्शन तर्कों के अलावा, जहां JS के पास कोई और अधिक सुरुचिपूर्ण तंत्र नहीं है, undefinedसे बचा जाना चाहिए। इसे कभी भी भाषा का हिस्सा नहीं होना चाहिए था; nullकेवल (2) और (3) के लिए ठीक काम किया होगा, और (4) एक मिसफिट है जो केवल मौजूद है क्योंकि शुरुआत में जावास्क्रिप्ट में कोई अपवाद नहीं था।

if (!testvar)वास्तव में क्या करता है? क्या यह अपरिभाषित और अशक्त या सिर्फ अपरिभाषित के लिए परीक्षण करता है?

इस तरह की एक 'truthiness' के खिलाफ परीक्षण जाँच करता है false, undefined, null, 0, NaNऔर रिक्त स्ट्रिंग। लेकिन इस मामले में, हाँ, यह वास्तव में undefinedइसके साथ संबंध है। IMO, इसके बारे में अधिक स्पष्ट होना चाहिए और कहना चाहिए if (testvar!==undefined)

एक बार एक चर को परिभाषित करने के बाद मैं इसे अपरिभाषित पर वापस साफ कर सकता हूं (इसलिए चर को हटाना)।

आप निश्चित रूप undefinedसे इसे असाइन कर सकते हैं , लेकिन यह चर को नष्ट नहीं करेगा। केवलdelete object.property ऑपरेटर वास्तव में चीजों को हटा देता है।

deleteवास्तव में इस तरह के चर के बजाय गुणों के लिए है। ब्राउजर्स आपको सीधे जाने देंगे delete variable, लेकिन यह एक अच्छा विचार नहीं है और ECMAScript फिफ्थ एडिशन के सख्त मोड में काम नहीं करेगा। यदि आप किसी चीज के संदर्भ को मुक्त करना चाहते हैं, तो यह कचरा एकत्र किया जा सकता है, यह कहना अधिक सामान्य होगा variable= null

क्या मैं एक पैरामीटर के रूप में अपरिभाषित हो सकता हूं?

हाँ।


10
क्या शानदार जवाब है। मैं अभी जावास्क्रिप्ट परीक्षण में असफल रहा हूँ : perfectionkills.com/javascript-quiz बाद में मैं आपके उत्तर को फिर से पढ़ने जा रहा हूँ और फिर से परीक्षण का प्रयास करूँगा!
स्किलड्रिक 16

1
तय, ता। (मैं आश्वस्त होने के बारे में बहुत अधिक चिंता नहीं करता हूं, क्योंकि ऐसी बहुत सी चीजें हैं जो एक स्क्रिप्ट को सब कुछ गड़बड़ करने के लिए पुनर्परिभाषित कर सकती हैं जो कि सामान्य मामले को हल करना असंभव है।)
bobince

2
@bobince undefinedएक सिंगलटन ऑब्जेक्ट है? क्या मतलब? यह एक आदिम मूल्य है, और एक वस्तु नहीं है।
08इमे विद

2
@ परिमाण: वह बिंदु (4) है। मैं आमतौर पर नहीं होता typeof foo=='undefined'; यह (4a) ग्लोबल-स्निफिंग के लिए उपयोग किया जाता है, जिस स्थिति में मैं स्पष्ट होना पसंद करूंगा और कहूंगा 'foo' in window, या (4b) परीक्षण- undefinedस्वयं के खिलाफ परीक्षण करूंगा, जिस स्थिति में मैं पठनीय और कहना पसंद करूंगा foo===undefined। के typeofखिलाफ सिद्धांत परीक्षण 'undefined'में एक उपयोग का मामला हो सकता है जो अन्य निर्माण प्रदान नहीं कर सकता है: स्थानीय चर के अस्तित्व के लिए सूँघना। हालांकि वास्तव में आप बहुत हमेशा जानते हैं कि चर को स्थानीय घोषित किया जाता है।
बॉबी

4
# 2 के साथ एक कैविएट, आमतौर पर एक फ़ंक्शन होता है जिसमें कोई returnस्टेटमेंट नहीं होता है undefined, लेकिन यदि फ़ंक्शन एक कंस्ट्रक्टर है ( newऑपरेटर के साथ इनवॉइस किया गया है) तो वह स्टेटमेंट thisनहीं होने के बावजूद नई ऑब्जेक्ट ( कंस्ट्रक्टर के अंदर की वैल्यू) लौटाएगा returnconsole.log((function (){}()));लौटता है undefinedconsole.log((new function (){}()));कोई वस्तु लौटाता है।
अनुपयोगी कोड

18

आप अपरिभाषित के रूप में कुछ भी परिभाषित नहीं कर सकते हैं (नहीं करना चाहिए), क्योंकि चर अब अपरिभाषित नहीं होगा - आपने इसे केवल कुछ के लिए परिभाषित किया है।

आप undefinedफ़ंक्शन नहीं कर सकते (नहीं करना चाहिए?) । यदि आप खाली मान पास करना चाहते हैं, तो nullइसके बजाय उपयोग करें ।

if(!testvar)बूलियन सच / झूठे मूल्यों के लिए बयान की जाँच करता है, यह विशेष रूप से परीक्षण करता है कि क्या testvarमूल्यांकन करता है false। परिभाषा के अनुसार, nullऔर undefinedके रूप में न का मूल्यांकन नहीं किया जाना चाहिए trueया false, लेकिन जावास्क्रिप्ट मूल्यांकन करता है nullके रूप में false, और एक त्रुटि देता है अगर आप एक अपरिभाषित चर का मूल्यांकन करने का प्रयास करें।

undefinedया के लिए ठीक से परीक्षण करने के लिए null, इनका उपयोग करें:

if(typeof(testvar) === "undefined") { ... }

if(testvar === null) { ... }

1
ट्रिपल-बराबर प्रकार के लिए जाँच करता है, इसलिए किसी भी प्रकार का ज़बरदस्ती नहीं किया जाता है। डगलस क्रॉकफोर्ड टाइप-कॉर्किंग ऑपरेटरों ( ==और !=) का उपयोग करने के खिलाफ सलाह देता है ।
9

3
आप कुछ को अपरिभाषित के रूप में परिभाषित कर सकते हैं। var a= undefined। आप पास कर सकते हैं fn(undefined)। यदि आप किसी अनिर्दिष्ट pवस्तु के बीच अंतर खोजना चाहते हैं o, और एक संपत्ति pजो परिभाषित और सेट की गई है undefined, तो आपको 'p' in oऑपरेटर का उपयोग करना होगा ।
बॉब

1
क्या कोई कारण है कि किसी को testvar === undefinedअधिक जटिल के बजाय परीक्षण नहीं करना चाहिए typeof(testvar) === "undefined"?
डीडीए

4
typeofअपरिभाषित चर के लिए एक परीक्षण का उपयोग करने का एक और अच्छा कारण है : इसके विपरीत null, undefinedकेवल वैश्विक वस्तु की एक संपत्ति है और खुद को फिर से परिभाषित किया जा सकता है। यह केवल एक विशेष कोडिंग शैली और एक लापता समान चिह्न लेता है और undefinedचुपचाप बदल जाता है:if (undefined = someVar) {...}
टिम डाउन

1
@IanGrainger: ECMAScript 5 (सभी ब्राउज़रों के वर्तमान संस्करणों में लागू किया गया) ज्यादातर undefinedइसे वैश्विक ऑब्जेक्ट की एक अपरिवर्तनीय संपत्ति बनाकर ठीक करता है , इसलिए यह पहले की तुलना में अधिक सुरक्षित है। हालांकि, undefinedकिसी फ़ंक्शन के भीतर कहे जाने वाले एक परिवर्तनशील चर को परिभाषित करना अभी भी संभव है , इसलिए समस्या पूरी तरह से दूर नहीं हुई है।
टिम डाउन

13

बुनियादी अंतर यह है कि है undefinedऔर nullअलग अवधारणाओं का प्रतिनिधित्व करते हैं।

यदि केवल nullउपलब्ध था, तो आप यह निर्धारित नहीं कर पाएंगे कि क्या nullजानबूझकर मूल्य के रूप में सेट किया गया था या क्या मूल्य अभी तक निर्धारित नहीं किया गया है जब तक कि आप बोझिल त्रुटि को पकड़ने का उपयोग नहीं करते हैं: जैसे

var a;

a == null; // This is true
a == undefined; // This is true;
a === undefined; // This is true;

हालाँकि, यदि आप जानबूझकर मूल्य निर्धारित करते हैं, तो nullअसफलता के साथ सख्त समानता undefined, जिससे आपको nullऔर undefinedमूल्यों में अंतर करने की अनुमति मिलती है :

var b = null;
b == null; // This is true
b == undefined; // This is true;
b === undefined; // This is false;

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

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined

यह व्यवहार भी जावास्क्रिप्ट के लिए विशिष्ट नहीं है और यह सामान्यीकृत अवधारणा को पूरा करता है कि एक बूलियन परिणाम हो सकता है true, false, अज्ञात ( null), कोई मूल्य नहीं ( undefined), या कुछ गलत हो गया ( error)।

http://en.wikipedia.org/wiki/Undefined_value


और अभी भी nullठीक काम किया होता। a == nullहै trueक्योंकि जावास्क्रिप्ट प्रकार बलात्कार।
sleepwalkerfx

11

अशक्त मूल्यों की जाँच करने का सबसे अच्छा तरीका है

if ( testVar !== null )
{
    // do action here
}

और अपरिभाषित के लिए

if ( testVar !== undefined )
{
    // do action here
}

आप एक अपरिभाषित को अपरिभाषित कर सकते हैं।

testVar = undefined;
//typeof(testVar) will be equal to undefined.

1
अशक्त मूल्यों की जाँच करने का सबसे अच्छा तरीका है !==, न कि!=
MBO

6

हाँ, आप कर सकते हैं, क्योंकि अपरिभाषित को अपरिभाषित के रूप में परिभाषित किया गया है।

console.log(
   /*global.*/undefined === window['undefined'] &&
   /*global.*/undefined === (function(){})() &&
   window['undefined']  === (function(){})()
) //true

आपका मुकदमा:

test("value1", undefined, "value2")

आप अपना स्वयं का अपरिभाषित चर भी बना सकते हैं :

Object.defineProperty(this, 'u', {value : undefined});
console.log(u); //undefined

5

आपके पहले प्रश्न का उत्तर देने के लिए, न कि ऑपरेटर ( !) जो कुछ भी बूलियन मूल्य में दिया गया है, उसे ज़ब्त करेगा। तो null, 0,false , NaNऔर ""(रिक्त स्ट्रिंग) सभी झूठे दिखाई देगा।


और भी खाली स्ट्रिंग और NaN (संख्या नहीं)
MBO

undefinedके रूप में प्रकट नहीं होगा false, यह एक 'परिभाषित नहीं है' त्रुटि फेंक देगा।
टाटू उलेमेन

तातु उलमन: सच नहीं। वैश्विक ऑब्जेक्ट की संपत्ति के रूप में मौजूद होने के if (undefined) {/* Do stuff*/}बाद कोई त्रुटि नहीं देगा undefined। क्या त्रुटि देगा कुछ इस तरह हैif (someUndeclaredVariable) {/* Do stuff*/}
टिम डाउन

2

जावास्क्रिप्ट, कैसे कमांडलाइन पर अपरिभाषित के लिए एक चर सेट करने के लिए:

jsजावास्क्रिप्ट कमांड लाइन टर्मिनल में अपरिभाषित के लिए एक चर सेट करें जो कि Ubuntu 12.10 पर जावा के साथ आता है।

el@defiant ~ $ js

js> typeof boo
"undefined"

js> boo
typein:2: ReferenceError: boo is not defined

js> boo=5
5

js> typeof boo
"number"

js> delete(boo)
true

js> typeof boo
"undefined"

js> boo
typein:7: ReferenceError: boo is not defined

यदि आप एक जावास्क्रिप्ट में अपरिभाषित करने के लिए एक चर सेट करते हैं:

इसे myjs.html में रखें:

<html>
<body>
    <script type="text/JavaScript">
        document.write("aliens: " + aliens);
        document.write("typeof aliens: " + (typeof aliens));
        var aliens = "scramble the nimitz";
        document.write("found some aliens: " + (typeof aliens));
        document.write("not sayings its aliens but... " + aliens);
        aliens = undefined;
        document.write("aliens deleted");
        document.write("typeof aliens: " + (typeof aliens));
        document.write("you sure they are gone? " + aliens);
    </script>
</body>
</html>

यह प्रिंट करता है:

aliens: undefined
typeof aliens: undefined
found some aliens: string
not sayings its aliens but... scramble the nimitz
aliens deleted
typeof aliens: undefined
you sure they are gone? undefined

चेतावनी! अपरिभाषित के लिए अपने चर की स्थापना करते समय आप अपने चर को दूसरे चर पर सेट कर रहे हैं। यदि कुछ डरपोक व्यक्ति चलता है undefined = 'rm -rf /';तो जब भी आप अपने चर को अपरिभाषित करते हैं, तो आपको वह मान प्राप्त होगा।

आप सोच रहे होंगे कि मैं शुरुआत में अपरिभाषित मूल्य एलियंस का उत्पादन कैसे कर सकता हूं और यह अभी भी चला है। यह जावास्क्रिप्ट उत्थापन के कारण है: http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html



0

के लिए if (something)और if (!something)आमतौर पर यह जांचने के लिए उपयोग किया जाता है कि कुछ परिभाषित किया गया है या नहीं। उदाहरण के लिए:

if (document.getElementById)

पहचानकर्ता को बूलियन मान में बदल दिया जाता है, इसलिए undefinedइसकी व्याख्या की जाती है false। बेशक अन्य मूल्य (जैसे 0 और '') हैं, जिनकी व्याख्या भी की जाती हैfalse , लेकिन या तो पहचानकर्ता का यथोचित मूल्य नहीं होना चाहिए या आप ऐसे मूल्य को अपरिभाषित मानकर खुश होते हैं।

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

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


0

बस मज़े के लिए, एक चर के लिए "अनसाइनड" असाइन करने का एक काफी सुरक्षित तरीका है। इसके लिए टक्कर के लिए किसी को ऑब्जेक्ट के लिए प्रोटोटाइप में जोड़ना होगा, बिल्कुल उसी नाम के साथ जो बेतरतीब ढंग से उत्पन्न स्ट्रिंग के रूप में। मुझे यकीन है कि यादृच्छिक स्ट्रिंग जनरेटर में सुधार किया जा सकता है, लेकिन मैंने इस प्रश्न से सिर्फ एक लिया: जावास्क्रिप्ट में यादृच्छिक स्ट्रिंग / वर्ण उत्पन्न करें

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

function GenerateRandomString() {
    var text = "";
    var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

    for (var i = 0; i < 50; i++)
        text += possible.charAt(Math.floor(Math.random() * possible.length));

    return text;
}

var myVar = {}[GenerateRandomString()];
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.