2013-03-20 9 views
5

मैं नेस्टेड चर के साथ एक जावास्क्रिप्ट ऑब्जेक्ट बनाना चाहता हूं जहां कुछ चरों में डिफ़ॉल्ट मान निर्दिष्ट नहीं होगा।मूल्य के बिना वैरिएबल घोषित करना

var myObject = { 
    GlobalVars: { 
    globalVarA: "foo", 
    globalVarB: "bar", 
    globalVarC 
    }, 
    myFunction: function(){ 
    //do something 
    } 
} 

हालांकि मैं निम्नलिखित त्रुटि मिलती है:

Expected ':'

मैं इस चर घोषणा कर सकते हैं कैसे

var globalVarA = "foo"; 
var globalVarB = "bar"; 
var globalVarC; 

function myFunction(){ 
    //do something 
} 

मैं करने के लिए इस परिवर्तन करना चाहते हैं:

मैं इस समय इस राशि बिना मूल्य के?

क्या यह सबसे अच्छा अभ्यास है या क्या कोई वैकल्पिक बेहतर समाधान है?

उत्तर

12

आप GlobalVars के गुणों के रूप में चर निर्धारित करना चाहते हैं आप स्पष्ट रूप से

GlobalVars: { 
    globalVarA: "foo", 
    globalVarB: "bar", 
    globalVarC: undefined 
    }, 

आपका कोड, अवैध अंकन निहित जब वस्तु शाब्दिक अंकन का उपयोग आप हर चर के लिए एक मूल्य निर्दिष्ट करना होगा उन्हें undefined आवंटित करने के लिए किया है। यह एक्सएमएल या फॉर्म पैराम्स जैसी अन्य टिप्पणियों के विपरीत है जहां आप इसे सेट किए बिना एक विशेषता/संपत्ति घोषित कर सकते हैं।

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

हालांकि, अपने चर अगर आप spec से globalVarC: undefined

GlobalVars.globalVarC;//undefined 
GlobalVars.globalVarX;//undefined 
GlobalVars.hasOwnProperty("globalVarC");//true 
GlobalVars.hasOwnProperty("globalVarX");//false 

कर परिभाषित करने के करता है:

4.3.9 undefined value:

primitive value used when a variable has not been assigned a value.

+0

बस एक तरफ नोट पर। जब तक इसकी आवश्यकता नहीं होती है तब तक 'ग्लोबल वारसी' घोषित करने का नकारात्मक पक्ष क्या होगा? चूंकि आप 'GlobalVars.globalVarC =" जो कुछ भी सेट कर सकते हैं; " भले ही इसे घोषित नहीं किया गया हो। –

+1

@TimBJames यह एक उत्कृष्ट सवाल है। उदाहरण के लिए, अंतर 'हैऑनप्रॉपर्टी' चेक में व्यक्त किया जा सकता है। व्यक्तिगत रूप से, यदि यह केवल उस फ़ंक्शन में उपयोग के लिए है, तो मेरे अपने कोड में मैं स्पष्ट रूप से इसे अपरिभाषित करने के बजाय 'GlobalVars.globalVarC' करता हूं। –

+0

हाँ मैं शायद साथ भी जाऊंगा, क्योंकि यदि आप चर के अस्तित्व की जांच कर रहे हैं, तो आप 'if (GlobalVars' की जांच करेंगे।globalVarC! = अपरिभाषित) 'जो मामला किसी भी तरह से होगा। –

1

आपसे किसी और globalVarC json के लिए जावास्क्रिप्ट वाक्य रचना के लिए एक मूल्य निर्दिष्ट करना होगा गलत हो, क्योंकि आपके पास प्रारंभ करने के लिए कोई मूल्य नहीं है, तो आप मूल्य undefined दे सकते हैं।

undefined आदिम मूल्य अपरिभाषित के साथ एक वैश्विक चर है।

var myObject = { 
    GlobalVars: { 
    globalVarA: "foo", 
    globalVarB: "bar", 
    globalVarC: undefined 
    }, 
    myFunction: function(){ 
    //do something 
    } 
} 
0

आप चाहते undefined आदिम मूल्य डिफ़ॉल्ट मान हो जाएगा:

var myObject = { 
    GlobalVars: { 
    globalVarA: "foo", 
    globalVarB: "bar", 
    globalVarC: void 0 
    }, 
    myFunction: function(){ 
    //do something 
    } 
} 

void 0 अभिव्यक्ति undefined का मूल्य देता है, चाहे undefined "भेज" था परवाह किए बिना।

+0

बस सोच रहा है .. क्या यह जेएस कंपाइलर को मूल्य 0 पर नहीं बुलाता है? मुझे वास्तव में कभी नहीं मिला कि आप अपरिभाषित मूल्य क्यों बदलेंगे। विचार की उसी ट्रेन पर, कोई Function.prototype.call के मान को बदल सकता है। क्या आप इसे उत्पादन कोड में स्वयं करेंगे? यह क्या फायदे पेश करता है? मुझे उम्मीद है कि यह आक्रामक नहीं होगा, मुझे वास्तव में दिलचस्पी है कि आप ऐसा क्यों करेंगे। –

+0

@ बेंजामिनग्रेनबाम "मूल्य 0 पर कंपाइलर का आह्वान" से आपका क्या मतलब है? 'अपरिभाषित' को बदलने के लिए, निश्चित रूप से ऐसा करने का कोई अच्छा कारण नहीं है ;-) –

+0

'शून्य' ऑपरेटर निम्नलिखित अभिव्यक्ति पर जावास्क्रिप्ट कंपाइलर को आमंत्रित करता है (इस मामले में '0' जिसे '0' ' वापस 'अपरिभाषित')। https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/void। कंपाइलर को आमंत्रित करना इस मामले में थोड़ा चरम लगता है। यहां तक ​​कि 'globalVarC: (फ़ंक्शन() {var a; एक वापसी;})() 'क्लीनर लगता है। मैं एक पेर्फ बनाउंगा :) –

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