javascript - questions - जावास्क्रिप्ट ऑब्जेक्ट्स में कुंजी केवल तार हो सकती है?




javascript programs (5)

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

ऐसा लगता है कि गलत है - ऑब्जेक्ट कुंजियां हमेशा स्ट्रिंग्स स्ट्रिंग हो सकती हैं या (ईसीएमएस्क्रिप्ट 2015, उर्फ ​​ईसीएमए -262 एड 6) प्रतीकों से। लेकिन यह वर्ग ब्रैकेट संपत्ति के उपयोग के लिए एक अलग विषय है।

ईसीएमए -262 एड 3 § 11.2.1 देखें (कृपया ईसीएमएस्क्रिप्ट 2017 (मसौदा) भी देखें ):

डॉट नोटेशन का उपयोग करके गुणों को नाम से एक्सेस किया जाता है:

सदस्य एक्सपेरेशन। IdentifierName

CallExpression। IdentifierName

या ब्रैकेट नोटेशन:

सदस्य अभिव्यक्ति [अभिव्यक्ति]

CallExpression [अभिव्यक्ति]

निम्नलिखित वाक्यविन्यास रूपांतरण द्वारा डॉट नोटेशन समझाया गया है:

सदस्य एक्सपेरेशन। IdentifierName

इसके व्यवहार में समान है

सदस्य एक्सप्रेशन [<पहचानकर्ता-नाम-स्ट्रिंग>]

और इसी तरह

CallExpression। IdentifierName

इसके व्यवहार में समान है

CallExpression [<पहचानकर्ता-नाम-स्ट्रिंग>]

जहां <पहचानकर्ता-नाम-स्ट्रिंग> एक स्ट्रिंग अक्षर है जिसमें यूनिकोड से बचने वाले अनुक्रमों को पहचानकर्ता नाम के रूप में प्रोसेस करने के बाद वर्णों का एक ही अनुक्रम होता है।

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

संक्षेप में, स्क्वायर ब्रैकेट नोटेशन प्रदान किया जाता है ताकि गुणों का उपयोग करके गुणों का उपयोग किया जा सके, उदाहरण के लिए

var y = {};
var x = 'foo';
y[x] = 'foo value';

उपर्युक्त में, x वर्ग वर्गों में प्रदान किया जाता है, इसलिए इसका मूल्यांकन किया जाता है, स्ट्रिंग 'foo' को वापस कर दिया जाता है। चूंकि यह संपत्ति अभी तक y पर मौजूद नहीं है, इसलिए यह जोड़ा गया है। फिर y की foo प्रॉपर्टी को 'foo value' का मान असाइन किया जाता है।

सामान्य शब्दों में, वर्ग ब्रैकेट में अभिव्यक्ति का मूल्यांकन किया जाता है और इसकी toString() विधि कहा जाता है। यह वह मान है जिसका उपयोग संपत्ति के नाम के रूप में किया जाता है।

डॉट प्रॉपर्टी एक्सेस विधि में, पहचानकर्ता का मूल्यांकन नहीं किया जाता है, इसलिए:

y.bar = 'bar value';

एक मूल्य bar value साथ एक संपत्ति bar बनाता है।

यदि आप एक संख्यात्मक संपत्ति बनाना चाहते हैं, तो:

y[5] = 5;

5 का मूल्यांकन करेगा, देखें कि यह एक स्ट्रिंग नहीं है, कॉल (अधिक या कम) Number(5).toString() जो स्ट्रिंग 5 , जिसका उपयोग संपत्ति के नाम के लिए किया जाता है। इसके बाद इसे मूल्य 5 असाइन किया जाता है, जो एक संख्या है।

संपादित करें

यह उत्तर लिखा गया था जब ECMAScript ed3 चालू था, हालांकि चीजें आगे बढ़ी हैं। कृपया बाद के संदर्भ और MDN

jshashtable राज्यों:

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

जो मुझे पता है, चाबियाँ केवल तार हैं, (चूंकि संख्याओं को तारों में घुमाया जाता है)। मैं बस जांचना चाहता हूं और सुनिश्चित करना चाहता हूं कि उपरोक्त वर्णित क्या है (क्योंकि चाबियाँ संख्या नहीं हो सकती हैं)।

क्या ईसीएमए मानक ने इसके बारे में कुछ भी कहा ..

या कार्यान्वयन ब्राउज़र-विशिष्ट है?


अच्छी तरह से कुंजी के लिए आप जो भी चीज उपयोग करते हैं उसे हैशिंग फ़ंक्शन की वजह से स्ट्रिंग में परिवर्तित किया जाता है जो बाइट्स के लगभग अनूठे छोटे सेट को स्ट्रिंग करता है जिसे एक पूर्णांक के रूप में समझा जा सकता है, क्योंकि रैखिक खोज के दौरान पूर्णांक तुलना निम्न स्तर और तेज़ होती है। (जावास्क्रिप्ट वस्तुओं हैश टेबल हैं)। आप उन्हें कुंजी के रूप में उपयोग करने के लिए ऑब्जेक्ट्स और सरणी को स्ट्रिंग करते हैं। कुंजी आकार में असीमित हो सकती है। लेकिन सावधान रहें, क्योंकि जावास्क्रिप्ट ऑब्जेक्ट्स अनियंत्रित हैं।

कल और आज, मैंने इस डोमेन में दिखाई देने वाली समस्याओं के आसपास अपने सिर को लपेटने की कोशिश की है और मैंने इन समाधानों को लिखा है। पहला हैश टेबल का एक कस्टम कार्यान्वयन है, http://stamat.wordpress.com/javascript-quickly-find-very-large-objects-in-a-large-array/ और वहां सब कुछ लेमन शब्दों में समझाया गया है। ..

दूसरा एक पहले के लिए अपग्रेड है, और यह एक निर्धारक JSON स्ट्रिंग है, जो वर्णानुक्रमित क्रमिक गुणों वाले ऑब्जेक्ट्स को स्ट्रिंग करता है: http://stamat.wordpress.com/2013/07/03/javascript-object-ordered-property-stringify/

इसकी जांच - पड़ताल करें :)


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

हालांकि, उद्धरण यह नहीं मानता कि x[42] और x["42"] अलग हैं ; यह बताता है - अन्य प्राइमेटिव्स और विवरणों के भ्रामक बहिष्करण के साथ - सामान्य स्ट्रिंग रिज़ॉल्यूशन के तहत केवल "स्ट्रिंग्स और नंबर" हैश कुंजियां (वास्तव में संपत्ति के नाम) के रूप में प्रयोग योग्य हैं और इस अर्थ में, उद्धरण तर्कसंगत रूप से सही है।

ये नियम स्टैंडर्ड ईसीएमए -262 ईसीएमएस्क्रिप्ट भाषा विशिष्टता 5 वें संस्करण (दिसंबर 200 9) से हैं

खंड से "11.2.1 संपत्ति एक्सेसर्स" (उत्पादन नियम छोड़े गए):

उत्पादन सदस्य एक्स्प्रेशन: सदस्य एक्सप्रेशन [अभिव्यक्ति] का मूल्यांकन निम्नानुसार किया जाता है:

  1. BaseEepression का मूल्यांकन करने का परिणाम आधार संदर्भ दें।
  2. बेसवैल्यू को GetValue (बेस रेफरेंस) होने दें।
  3. प्रॉपर्टीनाम रिफरेंस अभिव्यक्ति का मूल्यांकन करने का परिणाम बनें।
  4. प्रॉपर्टीनाम वैल्यू को GetValue (propertyNameReference) दें।
  5. चेकऑबजेक्टकोर्सीबल (बेसवेल्यू) पर कॉल करें।
  6. प्रॉपर्टीनामस्ट्रिंग को ToString (propertyNameValue) दें।
  7. यदि मूल्यांकन किए जा रहे सिंटैक्टिक उत्पादन को सख्त मोड कोड में निहित किया गया है, तो सख्त सत्य होने दें, अन्यथा सख्त होने दें।
  8. प्रकार का मान लौटाएं संदर्भ जिसका आधार मान आधार है और जिसका संदर्भित नाम संपत्ति नामकरण है, और जिसका सख्त मोड ध्वज सख्त है।

हैप्पी कोडिंग


चाबियाँ हमेशा तार होती हैं। इसका मतलब है कि आप ऑब्जेक्ट इंस्टेंस की पहचान को कुंजी के रूप में उपयोग नहीं कर सकते हैं।

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

यदि आप जावास्क्रिप्ट में एक ही चीज़ करना चाहते हैं, तो यह मुश्किल होगा, क्योंकि आपको अपनी अनूठी वस्तु आईडी उत्पन्न करना होगा और उन्हें उस ऑब्जेक्ट से संलग्न करना होगा जिसे आप ट्रैक करना चाहते हैं। कुछ ने ऑब्जेक्ट क्लास में प्रोटोटाइप फ़ंक्शन जोड़ने का सुझाव दिया है, लेकिन यह हर ऑब्जेक्ट को अनावश्यक रूप से ओवरहेड जोड़ देगा। किसी भी मामले में, आप किसी ऑब्जेक्ट को एक फ़ंक्शन कॉल के माध्यम से एक ट्रैक करने योग्य आईडी देना चाहते हैं जो " __objectid__ " जैसी अनूठी संपत्ति में वृद्धिशील स्थिर संख्या निर्दिष्ट करता है।

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


हां, चाबियाँ संख्या हो सकती हैं। वास्तव में, विनिर्देश ऑब्जेक्ट्स और Arrays दोनों के लिए समान जेनेरिक मैपिंग फ़ंक्शंस का उपयोग करता है।






javascript