दिलचस्प पोस्ट
SSE का उपयोग करके पूर्ण मूल्य की गणना करने का सबसे तेज़ तरीका Windows कन्सोल ऐप में आउटपुट यूनिकोड स्ट्रिंग एंड्रॉइड में स्ट्रिंग.एक्सएम से मूल्य कैसे पढ़ें? Ghostscript 9.01 का उपयोग कर पीडीएफ का उपयोग करना एक आसान तरीके से लॉगिंग में त्रुटि कास्ट और इज़न्यूमेरिक प्रोग्राम की मशीन पर कोर की संख्या का पता लगाएं एंड्रॉइड इम्यूलेटर sdcard पुश त्रुटि: केवल-पढ़ने के लिए फ़ाइल सिस्टम जावास्क्रिप्ट में एक `नल` मान क्यों है? विंडो को दो फ़ंक्शन जोड़ें एंड्रॉइड लंबित अतिरिक्त एक्स्ट्रा, ब्रॉडकास्ट रीसेवर द्वारा प्राप्त नहीं हुआ OWIN में ओथ बियरर टोकन से आईपी्रीनिस्ट प्राप्त करें ASP.NET से सभी ब्राउज़र के लिए ब्राउज़र कैशिंग अक्षम करना उच्छृंखल: नामांकित शाखाएं एकाधिक रिपॉजिटरी बनाम jQuery को विंडो के सापेक्ष एक तत्व का स्थान मिलता है

क्या जावास्क्रिप्ट गारंटी ऑब्जेक्ट प्रॉपर्टी ऑर्डर है?

अगर मैं इस तरह एक वस्तु बनाऊँ:

var obj = {}; obj.prop1 = "Foo"; obj.prop2 = "Bar"; 

क्या परिणामस्वरूप वस्तु हमेशा इस तरह दिखती है?

 { prop1 : "Foo", prop2 : "Bar" } 

यही है, क्या गुण उसी क्रम में होंगे जिन्हें मैंने उन्हें जोड़ा?

वेब के समाधान से एकत्रित समाधान "क्या जावास्क्रिप्ट गारंटी ऑब्जेक्ट प्रॉपर्टी ऑर्डर है?"

नहीं, ऑब्जेक्ट में प्रॉपर्टी ऑर्डर की गारंटी जावास्क्रिप्ट में नहीं है; आपको एक Array का उपयोग करना होगा

ECMAScript तृतीय संस्करण (पीडीएफ) से एक वस्तु की परिभाषा:

4.3.3 वस्तु

वस्तु ऑब्जेक्ट प्रकार का एक सदस्य है। यह संपत्तियों का एक अनोर्ड संग्रह है जिसमें से प्रत्येक में आदिम मूल्य, ऑब्जेक्ट या फ़ंक्शन शामिल हैं। किसी ऑब्जेक्ट की संपत्ति में संग्रहीत समारोह को एक विधि कहा जाता है।

ईसीएमएस्क्रिप्ट 2015 से , Map ऑब्जेक्ट का उपयोग करना एक विकल्प हो सकता है। एक Object एक Object साथ कुछ समानता साझा करता है और कुंजी आदेश की गारंटी देता है :

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

वर्तमान भाषा युक्ति : तकनीकी तौर पर, आदेश अनिर्दिष्ट है।

वर्तमान ब्राउज़र्स : "7" जैसे चाबियों का प्रमुख अपवाद के साथ क्रम संरक्षित है जो पूर्णांक के रूप में पार्स करता है और क्रोम / वी 8 द्वारा अलग-अलग तरीके से संभाला जाता है।

भविष्य की भाषा युक्ति (> ईएस2015) : आम तौर पर, आप अपेक्षा कर सकते हैं कि आज जो कुछ आदेश दिए गए हैं वह अनारक्षित नहीं होंगे। नई एपीआई आदेश की गारंटी देगा; मौजूदा एपीआई बदलना मुश्किल है। अधिक जानकारी के लिए जेएमएम के उत्तर देखें

ऊपर दिए गए सर्वश्रेष्ठ लिंक टिम डाउन की टिप्पणी में हैं:

http://code.google.com/p/v8/issues/detail?id=164

वह बग विवरण को विस्तृत करता है जिसमें क्रोम के महत्वपूर्ण आदेश के कार्यान्वयन के लिए शामिल डिजाइन फैसले शामिल हैं। एक ले-दूर यह है कि स्ट्रिंग कुंजियों के लिए जो एक पूर्णांक (यानी "एक" या "बी", लेकिन नहीं "3") को पार्स नहीं करते हैं, सभी प्रमुख ब्राउज़रों पर प्रविष्टियों के आदेश में चाबियाँ मुद्रित की जाती हैं, जबकि यह व्यवहार नहीं है "मानकीकृत", इसे ब्राउज़र विक्रेताओं द्वारा एक महत्वपूर्ण पीछे-संगतता समस्या माना जाता है। अपने जोखिम पार इस्तेमाल करें।

(बल्कि असाधारण) टिप्पणियों में से एक:

मानक हमेशा कार्यान्वयन का पालन करते हैं, यही वह जगह है जहां एक्सएचआर से आया था, और Google गियर्स को लागू करने से समान कार्य करता है और फिर समकक्ष एचटीएमएल 5 कार्यक्षमता को गले लगाता है। सही तय करना है कि ईसीएमए ने औपचारिक रूप से डीकटेक्टो मानक व्यवहार को अगले आरईपी में शामिल किया है।

यदि आप प्रविष्टि के आदेश पर भरोसा करते हैं, तो आप ECMAScript युक्ति के बाहर हैं, लेकिन सामान्य ब्राउज़र व्यवहार के डी-फ़ैक्टो मानक के भीतर जब तक आपकी चाबियाँ पूर्णांक के रूप में पार्स नहीं करती हैं

लिखने के समय, अधिकांश ब्राउज़रों ने उसी क्रम में गुण लौटाए, जैसा कि वे डाले गए थे, लेकिन स्पष्ट रूप से व्यवहार की गारंटी नहीं दी गई थी, इसलिए इस पर निर्भर नहीं होना चाहिए था।

ECMAScript विनिर्देश कहने के लिए प्रयोग किया जाता है:

यांत्रिकी और गुणों की गणना के आदेश … निर्दिष्ट नहीं है।

हालांकि ES2015 में और बाद में गैर-पूर्णांक कुंजी प्रविष्टि क्रम में लौटा दी जाएगी।

सामान्य ऑब्जेक्ट्स में प्रॉपर्टी ऑर्डर जावास्क्रिप्ट का एक जटिल विषय है।

ES5 में स्पष्ट रूप से कोई आदेश निर्दिष्ट नहीं किया गया है, जबकि ES2015 के कुछ मामलों में एक आदेश है यह देखते हुए निम्नलिखित वस्तु है:

 o = Object.create(null, { m: {value: function() {}, enumerable: true}, "2": {value: "2", enumerable: true}, "b": {value: "b", enumerable: true}, 0: {value: 0, enumerable: true}, [Symbol()]: {value: "sym", enumerable: true}, "1": {value: "1", enumerable: true}, "a": {value: "a", enumerable: true}, }); 

इसके परिणामस्वरूप निम्न क्रम में (कुछ मामलों में):

 Object { 0: 0, 1: "1", 2: "2", b: "b", a: "a", Symbol(): "sym" } 
  1. पूर्णांक की तरह चाबियाँ आरोही क्रम में
  2. प्रविष्टि क्रम में सामान्य कुंजी
  3. प्रविष्टि क्रम में प्रतीकों

इस प्रकार, वहाँ तीन खंड हैं, जो प्रविष्टि ऑर्डर बदल सकते हैं (जैसा कि उदाहरण में हुआ)। और पूर्णांक जैसी चाबियाँ सम्मिलन ऑर्डर पर बिल्कुल भी नहीं रहती हैं।

सवाल यह है कि ईएस2015 के बारे में किस क्रम की गारंटी दी गई है?

निम्न विधियां दिखाए गए आदेश की गारंटी देती हैं:

  • Object.assign
  • Object.defineProperties
  • Object.getOwnPropertyNames
  • Object.getOwnPropertySymbols
  • Reflect.ownKeys

निम्नलिखित विधियों / छोरों की कोई भी गारंटी नहीं है:

  • Object.keys
  • अंदर के लिए
  • JSON.parse
  • JSON.stringify

निष्कर्ष: ईएस2015 में भी आपको जावास्क्रिप्ट में सामान्य ऑब्जेक्ट्स के प्रॉपर्टी ऑर्डर पर भरोसा नहीं करना चाहिए। यह त्रुटियों की संभावना है इसके बजाय Map उपयोग करें

यह पूरे उत्तर विशिष्ट अनुपालन के संदर्भ में है, न कि कोई भी इंजन किसी विशेष क्षण या ऐतिहासिक रूप से करता है।

आम तौर पर, नहीं

वास्तविक प्रश्न बहुत अस्पष्ट है।

क्या गुण उसी क्रम में होंगे जो मैंने उन्हें जोड़ा था

किस संदर्भ में?

उत्तर है: यह कई कारकों पर निर्भर करता है सामान्य में, नहीं

कभी कभी हाँ

यहां वह जगह है जहां आप सादे Objects लिए प्रॉपर्टी कुंजी ऑर्डर पर भरोसा कर सकते हैं:

  • ES2015 आज्ञाकारी इंजन
  • खुद की संपत्ति
  • Object.getOwnPropertyNames() , Reflect.ownKeys() , Object.getOwnPropertySymbols(O)

सभी मामलों में इन विधियों में गैर-गणना योग्य गुण कुंजी और ऑर्डर कुंजियां शामिल हैं, जो कि [[OwnPropertyKeys]] द्वारा निर्दिष्ट हैं (नीचे देखें)। वे उन प्रमुख मूल्यों के प्रकार में भिन्न होते हैं जिसमें वे शामिल हैं ( String और / या Symbol )। इस संदर्भ में String में पूर्णांक मान शामिल हैं

Object.getOwnPropertyNames(O)

O की अपनी String कीड वाले गुण ( संपत्ति नाम ) लौटाता है

Reflect.ownKeys(O)

O की अपनी String – और Symbol कीड गुण देता है

Object.getOwnPropertySymbols(O)

O की खुद की Symbol कीड गुण देता है

[[OwnPropertyKeys]]

यह क्रम अनिवार्य रूप से है: पूर्णांक की तरह आरोही क्रम में Strings , गैर-पूर्णांक जैसी सृजन क्रम में, सृजन क्रम में प्रतीक। इस पर निर्भर करता है कि कौन से फ़ंक्शन इसे आमंत्रित करता है, इनमें से कुछ प्रकार शामिल नहीं किए जा सकते हैं।

विशिष्ट भाषा यह है कि चाबियाँ निम्न क्रम में वापस आ जाती हैं:

  1. … प्रत्येक स्वयं की संपत्ति कुंजी P के [ऑब्जेक्ट इटेटेड] है जो एक पूर्णांक सूचकांक है, जिसमें संख्यात्मक सूचकांक क्रम बढ़ता है

  2. … प्रत्येक स्वयं की संपत्ति कुंजी P O जो स्ट्रिंग है लेकिन एक पूर्णांक सूचकांक नहीं है, संपत्ति निर्माण क्रम में

  3. … प्रत्येक स्वयं की संपत्ति कुंजी P O जो कि एक प्रतीक है, संपत्ति निर्माण क्रम में

Map

यदि आप ऑर्डर किए गए नक्शे में दिलचस्पी रखते हैं तो आपको सादे Objects बजाय ES2015 में शुरू की गई Map प्रकार का उपयोग करने पर विचार करना चाहिए।

आधुनिक ब्राउज़रों में आप ऑब्जेक्ट के बजाय मानचित्र डेटा संरचना का उपयोग कर सकते हैं। https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

एक मानचित्र ऑब्जेक्ट प्रविष्टि क्रम में अपने तत्वों को पुनरावृति कर सकता है …

जैसा कि अन्य लोगों ने कहा है, जब आप ऑब्जेक्ट के गुणों पर पुनरावृत्त हो जाते हैं, तो आपके पास आदेश की कोई गारंटी नहीं होती है। यदि आपको कई क्षेत्रों की एक आदेश सूची की आवश्यकता है तो मैंने ऑब्जेक्ट की एक सरणी का निर्माण करने का सुझाव दिया था।

 var myarr = [{somfield1: 'x', somefield2: 'y'}, {somfield1: 'a', somefield2: 'b'}, {somfield1: 'i', somefield2: 'j'}]; 

इस तरह से आप नियमित रूप से लूप के लिए उपयोग कर सकते हैं और डालने के क्रम को देख सकते हैं। यदि आवश्यक हो तो आप नए सरणी में इसे सॉर्ट करने के लिए ऐरे सॉर्ट विधि का उपयोग कर सकते हैं

JSON मानक से :

एक ऑब्जेक्ट शून्य या अधिक नाम / वैल्यू युग्म का एक अनारडेड संग्रह है, जहां कोई नाम स्ट्रिंग है और मान स्ट्रिंग, नंबर, बूलियन, रिक्त, ऑब्जेक्ट या अरै है।

(जोर खान)

तो, आप ऑर्डर की गारंटी नहीं दे सकते।