2009-07-17 22 views
46

जावास्क्रिप्ट में, किसी ऑब्जेक्ट और हैश के बीच क्या अंतर है? आप एक बनाम दूसरे बनाते हैं, और आप परवाह क्यों करेंगे? क्या निम्न कोड उदाहरणों के बीच कोई अंतर है?किसी ऑब्जेक्ट और हैश के बीच अंतर?

var kid = { 
name: "juni", 
age: 1 
} 

और:

var kid = new Object(); 
kid.name = "juni"; 
kid.age = 1; 

और:

var kid = new Object(); 
kid["name"] = "juni"; 
kid["age"] = 1; 

आप किसी भी अन्य कोड उदाहरण मैं उदाहरण देकर स्पष्ट करना चाहिए के बारे में सोच सकते हैं?

कोर प्रश्न यहाँकिसी ऑब्जेक्ट और हैश के बीच क्या अंतर है?

+1

मैं अपने बयान "और वस्तु और एक हैश के बीच अंतर" लगता है कि "और वस्तु और एक (हैश बीच का अंतर सामने करने के लिए है)नक्शा"। – Peter

+0

अच्छा बिंदु ... लेकिन एक वास्तविक जावास्क्रिप्ट प्रकार हैश नहीं है? –

+7

जावास्क्रिप्ट में हैश प्रकार जैसी कोई चीज़ नहीं है। '{}' 'ऑब्जेक्ट 'प्रकार के लिए केवल एक छोटा सा प्रारंभिक प्रारंभकर्ता है। और '[]' 'ऐरे' प्रकार के लिए केवल एक छोटा हाथ प्रारंभकर्ता है। – Blixt

उत्तर

48

वहां कोई भी नहीं है। उनमें से सभी सचमुच बराबर हैं।

+14

कम से कम गलत, या अधिक सरलीकरण। ऐसा नहीं है कि "उनके बीच कोई अंतर नहीं है"; वे वास्तव में एक ही चीज हैं इसलिए अंतर की मात्रा '0' नहीं है, बल्कि' NaN' है। –

+1

और फिर भी ... यहां पर http://stackoverflow.com/questions/8511281/check-if-a-variable-is-an-object-in-javascript वे दिखाते हैं कि विभिन्न 'isObject' कार्यान्वयन _could_ अलग-अलग उत्तर देते हैं। –

3

वे वही हैं।

आप उन्हें एक दूसरे के साथ उपयोग कर सकते हैं।

4

आपके किसी भी नमूने में कोई अंतर नहीं है। वे नामित गुणों के साथ सभी वस्तुओं हैं। आपने अभी उन गुणों को बनाने/संदर्भित करने के विभिन्न तरीकों को दिखाया है।

3

मुझे लगता है कि यह सब वही है। तीसरा संस्करण गतिशील संपत्ति नामों के साथ उपयोग किया जा सकता है। पहला लिखने के लिए सबसे छोटा है।

13

वे अलग-अलग नोटेशन सिस्टम हैं जिन्हें आप एक दूसरे के साथ उपयोग कर सकते हैं। ऐसी कई स्थितियां हैं जहां ब्रैकेट सिंटैक्स [ ] का उपयोग करना अधिक आकर्षक हो सकता है, एक उदाहरण एक चर के साथ ऑब्जेक्ट का संदर्भ देने पर एक उदाहरण होगा।

var temp = "kid"; 
var obj = new Object(); 
obj[temp] = 5; // this is legal, and is equivalent to object.kid 
obj.temp = 5; // this references literally, object.temp 
2

वे वही हैं। जैसे [] और new Array() समान हैं।

जावास्क्रिप्ट के मूल प्रकारों के बारे में अधिक जानकारी के लिए, MDC Core JavaScript 1.5 reference पर एक नज़र डालें।

आप चाहते हैं सबूत है कि {} ही new Object() के रूप में है, तो:

Object.prototype.helloWorld = function() { alert('Foo!'); }; 
var a = new Object(); 
var b = {}; 
a.helloWorld(); 
b.helloWorld(); 

!!! चेतावनी आचरण चेतावनी !!! कभी भी, उत्पादन कोड में Object प्रकार की prototype संपत्ति को कभी भी असाइन न करें। आप पूरे वैश्विक नामस्थान को प्रदूषित करेंगे।

0

वास्तव में, जावास्क्रिप्ट में 'हैशटेबल' या 'हैशमप' नामक कुछ भी नहीं है। जावास्क्रिप्ट में ऑब्जेक्ट 'हैश' जैसा व्यवहार करता है [जावास्क्रिप्ट में ऑब्जेक्ट्स केवल कुंजी/मान गुण हैं] और इसलिए भ्रम।

4

वास्तव में, जावास्क्रिप्ट में प्रत्येक वस्तु एक हैश है। यह वस्तु के गुणों और विधियों का एक हैश है। वास्तव में, जावास्क्रिप्ट में सबकुछ एक हैश है (यानी नाम/मूल्य जोड़े की सूची)।

हर बार जब आप ऑब्जेक्ट की विधि, संपत्ति या किसी भी चर को संदर्भित करते हैं, तो आप आंतरिक हैश लुकअप करते हैं।

+0

संक्षिप्त होने के लिए, यह हैश के बजाय एक सामान्यीकृत मानचित्र है कि जावास्क्रिप्ट में प्रत्येक ऑब्जेक्ट है। जावा, सी #, आदि जैसे भाषाओं में, मानचित्रों को समरूप प्रकार के डेटा के लिए उपयोग किया जाता है, जबकि जावास्क्रिप्ट में, 'मानचित्र'' का डेटा केवल विषम होता है। – lcn

5

जावा और सी # जैसी अन्य भाषाओं में किसी भी ऑब्जेक्ट का उपयोग करना संभव है (केवल एक स्ट्रिंग या संख्या नहीं) हैश तालिका/हैश मैप में एक कुंजी के रूप में, जो जावास्क्रिप्ट में नहीं है: कुंजी को आसानी से परिवर्तित किया जाता है तारों के लिए।

var h = {}, k = {}; 
h[k] = "One"; 
alert(h[ "[object Object]" ]); // Alerts "One" 

यह कुंजी के रूप में मनमाने ढंग से वस्तुओं, जिस स्थिति में आप jshashtable की तरह कुछ का उपयोग कर सकते उपयोग करने के लिए उपयोगी हो सकता है।

अस्वीकरण: मैंने jshashtable लिखा था।

1

तकनीकी रूप से, वे वही हैं। जब आप कोड लिखते हैं, तो आप आसानी से myobject['someproprty' + 'somethingElseConcatenated] कर सकते हैं, जिसे आप "डॉट नोटेशन" का उपयोग करते समय नहीं कर सकते - myobject.someproperty वह सब कुछ है जो आप कर सकते हैं।

ईसीएमएस्क्रिप्ट के ऑटोर्स में से एक डगलस क्रॉकफोर्ड, किसी कारण से var a = new Object() वाक्यविन्यास का उपयोग न करने का सुझाव देता है, मुझे काफी पकड़ नहीं आया। वैसे भी, यदि आप इसमें दिलचस्पी रखते हैं तो इसमें उसकी प्रस्तुति देखने लायक है (इसमें कई भाग होते हैं, पहला वाला http://video.yahoo.com/watch/111593/1710507)

1

प्रत्येक इंजन (ब्राउज़र) इसे अलग-अलग लागू करता है लेकिन क्रोम के वी 8 पर ध्यान केंद्रित करता है (प्रदर्शन पर आधारित परीक्षणों में मैंने एक साल पहले अधिकांश आधुनिक ब्राउज़रों पर प्रदर्शन किया था, यदि आप v8 guidlines का पालन करते हैं तो वे समान प्रदर्शन बढ़ाते हैं)।

क्या यह मूल रूप से होता है:

  1. एक गतिशील वस्तु जिस पर गुण जोड़ा जा सकता है और मक्खी पर नष्ट कर दिया लागू करने के लिए - एक नियमित रूप से वस्तु के रूप में लेकिन speedwise इसकी के रूप में कुशल नहीं - एक hashtable सरल समाधान है जावा में (यादृच्छिक पहुंच ...)।
  2. क्या V8 कुछ रणनीतियों के आधार पर अनुमान लगाने का प्रयास कर रहा है यदि आपकी ऑब्जेक्ट एक नियमित वस्तु है (विशिष्ट क्रम में सेट गुणों का अंतिम सेट है, आदि ...) या हैशटेबल। सबसे पहले यह मानता है कि यह एक साधारण वस्तु है और प्रत्येक नई संपत्ति किसी वस्तु की एक नई संरचना के निर्माण और उस पर पुराने व्यक्ति की प्रतिलिपि बनाने और नई संपत्ति का कारण बनती है। यदि वस्तु को "कठिन" के रूप में वर्गीकृत किया गया है - इसे एक हशटेबल में ले जाया जाता है।
  3. v8 नोटिस भी कई "गलतियों" अगर - यह hashtables के लिए सब कुछ ले जाता है - इसलिए आप खराब प्रदर्शन मिलता है (thats क्यों आप कंस्ट्रक्टर्स है कि अपने सदस्यों या एक json में inited संरचनाओं के सभी init उपयोग करना चाहते हैं ...)
https://developers.google.com/v8/design#prop_access

www.quora.com/Are-JavaScript-Objects-implemented-as-HashTables-Is-key-value-access-O-1

jayconrod.com:

कृपया इस लिंक देखें/पोस्ट/52/ए-टूर-ऑफ-वी 8-ऑब्जेक्ट-प्रस्तुति

इसके अलावा एक बहुत अच्छा व्याख्यान: https://www.youtube.com/watch?v=UJPdhx5zTaw

आशा है कि यह मदद करता है ...

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