जेएस ऑब्जेक्ट में कुंजी (स्ट्रिंग) की लंबाई की सीमा है?


84

इसलिए हमारे पास एक मामला था जहां हमारे पास एक वस्तु होगी, जहां कुंजी आईडी (इंट) है और मान स्ट्रिंग है। लेकिन हमने देखा कि ज्यादातर बार, हम स्ट्रिंग के आधार पर आईडी देखते हैं, इसलिए हमने इसे उल्टा करने का फैसला किया और स्ट्रिंग को कुंजी बना दिया और मान आईडी है। क्योंकि उस तरह से प्रत्येक आइटम के माध्यम से जाने और मूल्यों की तुलना करने के बजाय, हम बस कर सकते थे var id = storage[text];। नीचे हमने जो किया उसके उदाहरण हैं।

यहाँ पुराने कार्यान्वयन का उदाहरण है:

var storage = {
  0 : null,
  1 : "Hello",
  2 : "world!",
  3 : "How are you?"
}

यहाँ नए कार्यान्वयन का उदाहरण है:

var storage = {
  "null" : 0,
  "Hello" : 1,
  "world!" : 2,
  "How are you?" : 3
}

मैं समझता हूं कि अब स्ट्रिंग की कुंजी है और समान स्ट्रिंग्स के लिए एक ही आईडी प्राप्त करना ठीक है। लेकिन चूंकि अब स्ट्रिंग संभावित रूप से बहुत बड़ा हो सकता है (पतला मौका, लेकिन शायद अधिकतम 1KB प्रति स्ट्रिंग), क्या जेएस या एंड्रॉइड वेबव्यू ऑब्जेक्ट कीज़ पर लंबाई सीमा है?

और भी, क्या इस कार्यान्वयन में नुकसान हैं? मैंने अब तक किसी भी मुद्दे पर ध्यान नहीं दिया है, लेकिन आप कभी नहीं जानते।

जवाबों:


96

मैंने इस पर थोड़ा शोध किया है।

MDN मुद्दे पर चुप है , और इसलिए कल्पना ( ES5 , ES6 ) है। वे केवल यह कहते हैं कि संपत्ति अभिगमकर्ता को एक स्ट्रिंग होना चाहिए, बिना किसी योग्यता के - दूसरे शब्दों में, जहां तक ​​कल्पना का संबंध है, इसकी कोई सीमा नहीं है। यह शायद ही आश्चर्य की बात है।

ब्राउज़र इसे कैसे संभालते हैं, यह एक और मामला है। मैंने एक परीक्षण स्थापित किया है और इसे कई ब्राउज़रों में चलाया है। Chrome 40 (डेस्कटॉप), Chrome 40 (Android 5.1), फ़ायरफ़ॉक्स 36, ओपेरा 27, और IE9 + 2 27 वर्णों की संपत्ति के नाम के साथ सौदा कर सकते हैं । सफारी 8 (OS X Yosemite) यहां तक ​​कि 2 30 वर्णों की संपत्ति के नाम भी संभाल सकता है ।

IE को छोड़कर उन सभी ब्राउज़रों के लिए, अधिकतम संपत्ति की लंबाई अधिकतम स्ट्रिंग लंबाई के समान है। IE9 + ~ 2 30 वर्णों की अधिकतम स्ट्रिंग लंबाई को संभाल सकता है , लेकिन ऑब्जेक्ट कुंजियों की सीमा 2 27 वर्णों पर है, ठीक अन्य ब्राउज़रों की तरह।

आईओएस पर परीक्षण आईई 8 और सफारी में काम नहीं करता था, संभवतः परीक्षण कोड के कारण स्मृति मुद्दों के कारण।

संक्षेप में, लंबे समय तक संपत्ति के नाम का उपयोग करना सुरक्षित है, यहां तक ​​कि इसे चरम सीमा पर ले जाने पर भी। जब तक स्ट्रिंग्स अपने आप को ब्राउज़रों की सीमाओं के भीतर रह सकते हैं, तब तक आप उन्हें संपत्ति के नाम के रूप में भी उपयोग कर सकते हैं।


17
आधुनिक ब्राउज़रों पर लंबी कुंजियों के लिए कोई रनटाइम जुर्माना?
अहमद फसीह

@AhmedFasih मैंने इसका परीक्षण नहीं किया है, इसलिए मुझे यकीन नहीं है। यदि कोई प्रदर्शन जुर्माना है, तो मुझे लगता है कि इसे लंबे तार की तुलना के साथ करना होगा। मुझे आश्चर्य होगा कि अगर कोई समस्या है जो व्यवहार में है - जब तक कि कीज़ बहुत बड़ी और बहुत सी न हों और आप मेमोरी की कमी से जूझना शुरू कर दें, जैसे मोबाइल पर।
15 अक्टूबर को हैशब्रेक जूल

7
ES7 कल्पना "तत्वों" की 2 ^ 53 - 1 की सीमा निर्दिष्ट करती है । लेकिन मुझे लगता है यह ढेर अधिकतम आकार द्वारा सीमित है
एमईएमएस

6
" एमडीएन इस मुद्दे पर चुप है ... "। और नहीं । ;-)
RobG

2
तो वास्तविक आकार 2 ^ 27 = 0.125 जीबी और 2 ^ 30 = 1 जीबी हैं। मेरे लिए यह काफी है :)
सोरिन सी

34

नहीं, स्ट्रिंग की लंबाई की कोई सीमा नहीं है (जब तक यह मेमोरी में फिट बैठता है), और आपका कार्यान्वयन भी ठीक लगता है। यह बहुत सामान्य है जैसे कि बूलियन मूल्यों के साथ उन 'सरणियों' को घुमाया जाना। और कुंजी के रूप में तार के रूप में: तार अपरिवर्तनीय प्रतीक हैं जो एक निश्चित पते पर संग्रहीत होते हैं, और जो वास्तव में सरणी के लिए सूचकांक के रूप में उपयोग किया जाता है वह पता (उर्फ सूचक उर्फ ​​संदर्भ) है न कि स्ट्रिंग।


7
"तार अपरिवर्तनीय प्रतीक हैं": आपने यह कहाँ सीखा?
एंड्रयू

4
दिलचस्प। क्या आप शायद एक संदर्भ या स्रोत जोड़ सकते हैं?
हैशचेंज

8
कई भाषाओं में, तार अपरिवर्तनीय हैं। जावास्क्रिप्ट उन भाषाओं में से एक है। developer.mozilla.org/en-US/docs/Web/JavaScript/…
hartz89

3
सिर्फ दूसरों के लिए कुछ मामूली स्पष्टता जोड़ने के लिए। इसका मतलब है कि आप एक स्ट्रिंग को बदलने वाली कार्रवाई नहीं कर सकते। आप हेरफेर कर सकते हैं और एक नया स्ट्रिंग वापस कर सकते हैं, लेकिन वास्तव में एक को कभी नहीं बदल सकते हैं
पैट्रिक

स्वीकृत उत्तर अधिक व्यावहारिक है, लेकिन वास्तविक उत्तर यही है।
TheUtherSide

5

ऐसा प्रतीत होता है जैसे ECMAScript 2016 के साथ अब इस प्रश्न का एक निश्चित उत्तर है। एमडीएन वेब डॉक्स के अनुसार string.length पर :

ECMAScript 2016 (संस्करण 7) ने 2 ^ 53 - 1 तत्वों की अधिकतम लंबाई स्थापित की। पहले, कोई अधिकतम लंबाई निर्दिष्ट नहीं की गई थी।

आप इसे ECMAScript® 2016 भाषा विनिर्देश में निर्दिष्ट कर सकते हैं :

स्ट्रिंग प्रकार 2 53 -1 तत्वों की अधिकतम लंबाई तक शून्य या अधिक 16-बिट अहस्ताक्षरित पूर्णांक मान ("तत्व") के सभी क्रमबद्ध अनुक्रमों का समूह है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.