2016-04-09 9 views
58

नीचे दी गई यह रेखा क्या करती है?क्या होता है यदि हम अपरिभाषित मूल्य निर्धारित करते हैं?

undefined = 'A value'; 

यह तो undefined का मूल्य पर्दे के पीछे क्या होता है नहीं बदलती है?

+29

तथ्य यह है कि यह एक त्रुटि फेंक नहीं है चिंताजनक – JCOC611

+0

सिर्फ कंसोल में यह कोशिश की और यहां तक ​​कि एक भी नहीं मिला है त्रुटि, मूल रूप से कुछ भी नहीं हुआ https://gyazo.com/6703d9f7768e272c1aad7d3750b08ef1 – vahanpwns

+0

@ आशीष मिश्रा सच नहीं है। यह सिर्फ वैश्विक संदर्भ की एक संपत्ति है। – Pointy

उत्तर

53

undefined is a property of the global object, i.e. it is a variable in global scope. The initial value of undefined is the primitive value undefined .

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

तो, यह सिर्फ एक चर, इसके बारे में कुछ खास नहीं है। वैश्विक चर undefined

  • कि पुराने ब्राउज़र में मूल्य परिवर्तन, अर्थात undefined === 'A value'; // true के लिए एक स्ट्रिंग 'A value' आवंटित करने के लिए

    1. undefined = 'A value'; प्रयास: अब, आपके सवालों के जवाब। सख्त मोड के तहत नए ब्राउज़र में ऑपरेशन के परिणामस्वरूप त्रुटि होती है।

    आप एक ऐसे ब्राउज़र कंसोल में निम्नलिखित (मैं एक आधुनिक ब्राउज़र यहाँ उपयोग कर रहा हूँ - गूगल क्रोम) का परीक्षण कर सकते हैं:

    undefined = true; 
    console.log(undefined); // undefined 
    // in older browsers like the older Internet Explorer it would have logged true 
    

    undefined का मूल्य ऊपर के उदाहरण में नहीं बदलता है।

    In modern browsers (JavaScript 1.8.5/Firefox 4+), undefined is a non-configurable, non-writable property per the ECMAScript 5 specification.

    सख्त मोड के तहत:

    'use strict'; 
    undefined = true; // VM358:2 Uncaught TypeError: Cannot assign to read only property 'undefined' of object 
    
  • +2

    "गैर-सख्त" मोड के तहत नए ब्राउज़र में क्या है? यह कोई त्रुटि नहीं दिखाता है। क्या यह कुछ भी करता है। cuz यह मान को बदलता नहीं है –

    +1

    @Cgraphics गैर-सख्त मोड के तहत मध्यम ब्राउज़र में कुछ भी नहीं होता है। मान को अधिलेखित नहीं किया जा सकता है और इसमें कोई त्रुटि नहीं है ... लेकिन, लेकिन भविष्य में यह बदल सकता है। – Oleg

    +0

    यही कारण है कि आप कभी-कभी 'शून्य' ऑपरेटर का उपयोग करेंगे - यह इसके तर्क का मूल्यांकन करता है और फिर 'अपरिभाषित' देता है, और क्योंकि यह एक ऑपरेटर है, इसे एक मान असाइन नहीं किया जा सकता है। इस प्रकार आप हमेशा 'शून्य 0' या' शून्य (0) 'अभिव्यक्ति के साथ' अपरिभाषित 'प्राप्त कर सकते हैं (ऑपरेटरों को तर्कों के चारों ओर अभिभावकों की आवश्यकता नहीं होती है)। –

    3

    मैं के साथ और strict mode बिना एक छोटे से POC कर दिया है इसका कारण यह है (जोर मेरा) है।

    प्रभाव यह है कि, यदि आप strict mode का उपयोग नहीं कर रहे हैं तो सब ठीक हो जाता है। जैसा कि मैंने कहा

    "use strict" 
    var c; 
    
    if (c === undefined) { 
        console.log("nothing happened") 
    } 
    
    undefined = "goofy" 
    
    c = "goofy" 
    
    if (c === undefined) { 
        console.log("c is 'goofy' and it's equal to undefined.. gosh.. we broke js") 
    } 
    

    अब,, सख्त मोड के साथ आप एक TypeError जबकि हटाने के प्राप्त:

    TypeError: Cannot assign to read only property 'undefined'

    अब POC के लिए मिलता है: आप strict mode उपयोग कर रहे हैं आप एक अच्छा होगा "use strict" स्क्रिप्ट ठीक हो जाती है और आउटपुट बस nothing happened है।

    मैं this Q/A अगर आप को पता है और अधिक

    नोट चाहते हैं कि उपयोगी हो सकता है मिल गया है: मैं इस कोड का उपयोग कर Node.js परीक्षण किया है।

    +0

    क्यों node.js? मैंने सोचा कि यह सर्वर पक्ष –

    +2

    @Cgraphics node.js के लिए था V8 का उपयोग करता है - एक ही जावास्क्रिप्ट इंजन Google क्रोम के रूप में, इसलिए यह मूल रूप से एक ही नियम है, लेकिन अलग-अलग एपीआई (ब्राउज़र में 'विंडो',' क्वेरी सिलेक्टर 'आदि है, नोड में ' वैश्विक ',' fs.write', आदि)। नोड के बाद से – Oleg

    +1

    ।जेएस यह वी 8 (Google क्रोम इंजन) पर बना है जो ईएस 6 का उपयोग करता है, यह पीओसी बनाने का सबसे तेज़ तरीका प्रतीत होता है। :) – FredMaggiowski

    24

    true, 123 या null जैसी चीजों के विपरीत, undefined एक literal नहीं है। इसका मतलब है undefinedidentifierundefined value प्राप्त करने का मूर्ख तरीका नहीं है। इसके बजाय, void operator का उपयोग कर सकते हैं, उदा। void 0

    डिफ़ॉल्ट रूप से, undefined ने global object, जो वैश्विक चर है, की एक संपत्ति को परिभाषित किया है।ECMAScript 5 से पहले, कि संपत्ति लिखने योग्य था, इसलिए

    undefined = "A value"; 
    

    window.undefined का मूल्य बदल दिया, यह मानते हुए यह एक स्थानीय चर द्वारा आच्छादित नहीं किया गया। फिर यदि आपने "A value" === undefined का उपयोग किया है, तो आपको true मिलेगा। और void 0 === undefinedfalse का उत्पादन करेगा।

    ईसीएमएस्क्रिप्ट 5 ने इस व्यवहार को बदल दिया, और अब संपत्ति लिखने योग्य नहीं है और न ही कॉन्फ़िगर करने योग्य है। इसलिए, undefined को असाइनमेंट को गैर-सख्त मोड में अनदेखा कर दिया जाएगा, और एक अपवाद फेंक देगा सख्त मोड है। हुड के अंतर्गत,

    1. undefined = "A value"; एक Simple Assignment
    2. PutValue का उपयोग करता है कि अगर काम कठोर मोड में किया जाता है मूल्य "A value" एक संदर्भ में आधार के साथ वैश्विक वस्तु, संदर्भित नाम "undefined", और सख्त झंडा डाल करने के लिए है।
    3. यह [[Put]] वैश्विक ऑब्जेक्ट की आंतरिक विधि को "undefined" को संपत्ति के नाम, "A value" को मान के रूप में, और फेंक ध्वज के रूप में सख्त ध्वज के रूप में गुजरता है।
    4. यह [[DefineOwnProperty]] वैश्विक ऑब्जेक्ट की आंतरिक विधि को "undefined", संपत्ति डिस्क्रिप्टर {[[Value]]: "A value"}, और फेंक ध्वज तर्क के रूप में कॉल करता है।
    5. यह अस्वीकार करता है, यानी फेंकने वाला ध्वज सत्य होने पर टाइप एरर अपवाद फेंकता है, अन्यथा झूठी वापसी होती है।

    हालांकि, अगर आप अभी भी स्थानीय undefined चर घोषित करने के लिए कर सकते हैं:

    (function() { 
        var undefined = "A value"; 
        alert(undefined); // "A value"; 
    })(); 
    
    +3

    "हालांकि, आप अभी भी स्थानीय अपरिभाषित चर घोषित करने में सक्षम हैं:" - अच्छा बिंदु! –

    संबंधित मुद्दे