33

reserved word किसी ऑब्जेक्ट के प्रॉपर्टी नाम के रूप में उपयोग किया जा सकता है?आरक्षित शब्दों का उपयोग संपत्ति के नाम के रूप में करते हुए,

यह समस्या अप्रत्यक्ष रूप से stackoverflow question पर अप्रत्यक्ष रूप से उठाई गई थी। जवाब @Squeegy द्वारा आम सहमति लग रहा था:

आप उन शब्दों का उपयोग कर सकते हैं, लेकिन केवल तार और नहीं आशुलिपि गुण के रूप में - foo["class"] शांत है, जबकि foo.class
जबकि मुझे लगता है कि @ सहायक list of reserved words

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

  • आरक्षित शब्दों का परीक्षण उन्हें "शॉर्टेंड" गुणों के रूप में उपयोग करना

  • HTMLFormElement यह असंभव नहीं "आशुलिपि" में आरक्षित शब्द का उपयोग करने के लिए बनाता है

पहले, आरक्षित शब्द सूची का उपयोग कर, प्रत्येक एक संपत्ति के रूप में एक Object और HTMLElement, दोनों के रूप में जोड़ा गया है obj["word"] और obj.word, और उसके बाद obj["word"] और obj.word के रूप में पुनर्प्राप्त किया गया। 63 मामलों में से प्रत्येक में सभी आठ परीक्षण सही तरीके से काम करते थे।

दूसरा, HTMLFormElement इस कार्यों को जरूरी बनाता है क्योंकि यह शॉर्टंड नोटेशन का उपयोग करके अपने तत्वों में पुनर्प्राप्त होता है। यदि <input name='typeof' value='scalar' /> एक फॉर्म का तत्व है, तो form.typeof == "स्केलर"।

मेरे अनुभव से, आरक्षित शब्द आमतौर पर डेटा को लगाया जाता है (उदाहरण के लिए, "निजी" नामक एक कॉलम, प्रोग्राम नहीं लगाया जाता है। जैसे ही वे JSON ऑब्जेक्ट्स को दूषित करते हैं, और वहां से इनपुट, और वहां से HTMLFormElement। सीधे शब्दों में, बिना किसी बड़ी मात्रा में (इम्हो अनावश्यक) काम करें, आरक्षित शब्दों को रखना असंभव है को शॉर्टंड में सही तरीके से काम करने के लिए मजबूर होना पड़ रहा है।

यह इन वास्तविक समस्याओं मुझे लगता है:

  • देखभाल विद्यमान गुण के साथ संघर्ष के लिए नहीं रखा जाना चाहिए, नहीं आरक्षित शब्दों

  • (कई यदि सभी नहीं) चर आरक्षित शब्द नहीं हो सकते

  • आरक्षित शब्दों का उपयोग गुणों के रूप में हो सकता है (लेकिन जरूरी नहीं) भ्रमित

तो इस निष्कर्ष सही है, सुरक्षित है कि संपत्ति के नाम के रूप में शब्द, और उन तक या तो तार या आशुलिपि के रूप में, ठीक है - जब तक एक छोटे से सामान्य ज्ञान स्थिति के लिए लागू किया जाता है?

+0

इसका क्या अर्थ है 'form.typeof '? मेरा मतलब है, यह HTMLFormElement से कैसे संबंधित है? जेएस ऑब्जेक्ट की एक संपत्ति को कम से कम दो तरीकों से '[' prop '] 'और डॉट नोटेशन' .prop' के साथ एक्सेस किया जा सकता है। और इसका HTMLFormElement या DOM API या अन्य कुछ भी नहीं है। 'फॉर्म [' टाइपऑफ ']' बिल्कुल सामान्य है – user907860

उत्तर

38

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

उस ने कहा, आरक्षित शब्द अभी भी पहचानकर्ता नाम के रूप में उपयोग किए जा सकते हैं। यह कल्पना में काफी स्पष्ट रूप से कहा गया है और जोरदार ढंग से यहाँ कुछ हद तक कहा गया है (यदि आप अपनी आँखें वास्तविक भाषा कल्पना को पढ़ने के लिए होने से खून बहाना नहीं करना चाहती) ...

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

निम्नलिखित कीवर्ड हैं और चर, काम करता है, तरीकों, या वस्तु पहचानकर्ता के रूप में इस्तेमाल नहीं किया जा सकता, क्योंकि ECMAScript उनके लिए विशेष व्यवहार निर्दिष्ट करता है:

+0

फिर, हम bootstrap_multiselect.js जैसे स्क्रिप्ट को कम कर सकते हैं जो $ टैग = $ ('

+0

* आरक्षित शब्द अभी भी ** पहचानकर्ता नाम *** के रूप में उपयोग नहीं किए जा सकते हैं। क्या आपका मतलब ** पहचानकर्ता ** था? क्योंकि मैंने यहां और पेज से जुड़े पृष्ठ पर, ऐसा लगता है कि उन्हें पहचानकर्ता नाम (पहचानकर्ता नाम) के रूप में उपयोग किया जा सकता है, न कि पहचानकर्ताओं के रूप में। – user907860

+0

"_ReservedWord_ _IdentifierName_ का एक समेकित सबसेट है। सिंटैक्टिक व्याकरण _Identifier_ को _IdentifierName_ के रूप में परिभाषित करता है जो _ReservedWord_ नहीं है"। कीचड़ की तरह साफ़। [स्रोत] (http://www.ecma-international.org/ecma-262/7.0/index.html#sec-names-and-keywords) –

6

मुझे पूरा यकीन नहीं है कि आप क्या करना चाहते हैं, इसलिए एकमात्र उत्तर मैं दे सकता हूं: हाँ, आरक्षित शब्दों को संपत्ति के नाम के रूप में उपयोग करना ठीक है।

(हालांकि दो छोटी टिप्पणियां: foo["class"] ठीक है, foo[class] नहीं है।और किसी भी तरह से आप एक तत्व का उपयोग करने की form.elements["xyz"] और नहीं form.xyz का उपयोग करना चाहिए xyz नाम दिया है।)

+2

_absolutely_ 'form.abc' के बजाय' form.elements ['abc'] 'का उपयोग करने पर सहमत है - लेकिन बिंदु जावास्क्रिप्ट ब्राउज़र परिभाषा के अनुसार 'form.abc' का समर्थन करता है। ऊपर तय टाइपो। Google और गुणवत्ता के माध्यम से, stackoverflow एक अत्यधिक सम्मानित संदर्भ बन रहा है। जब मैंने संदर्भित किया, तो समझ में नहीं आया, इसलिए "रिकॉर्ड सीधे सेट करने की कोशिश कर रहा है" - और सोच रहा हूं कि मैं उस पर गलत हो सकता हूं। –

+0

मोज़िला राइनो जावास्क्रिप्ट इंजन का गैर-जेएसआर 223 कार्यान्वयन तब करता है जब स्क्रिप्ट जावाएक्सप्शन फेंकता है। यदि आपको इसे संभालने के लिए विशेष तर्क करने की आवश्यकता है, तो आपको यह देखने के लिए 'अपवाद। JavaException ["class"]। Name' की जांच करनी होगी कि यह उस विशिष्ट अपवाद के जावा क्लास नाम से मेल खाता है या नहीं, जिसे आप ढूंढ रहे हैं। – sworisbreathing

+0

आप 'foo [xyz"] 'foo.xyz' से अधिक क्यों उपयोग करना चाहिए? मुझे एक दूसरे के पक्ष में पक्षपात करने का कोई कारण नहीं दिखता है। पहला व्यक्ति सिर्फ बहुत शोर जोड़ता है और केवल उपयोगी है कि आप एक आरक्षित शब्द या एक चर के रूप में एक चर का उपयोग कर रहे हैं। – cdmckay

3

हाँ, यह किया जा सकता है।

यदि आप यूयूआई कंप्रेसर का उपयोग करते हैं तो बस छोटी टिप्पणी, आपको संपत्ति का नाम रखना होगा जो उद्धरणों में जेएस आरक्षित शब्दों में से एक के बराबर है।

उदाहरण के लिए, इस सेक नहीं होंगे

var a = { case : "foo"}; // syntax error, "invalid property id" 
a.for = "bar"; // syntax error, "missing name after . operator" 

यह करना होगा

var a = { "case" : "foo"}; //OK 
a["for"] = "bar"; //OK 

यहाँ Online JavaScript/CSS Compression Using YUI Compressor जहां इस परीक्षण किया जा सकता है।

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