2009-05-17 20 views
87

निम्नलिखित दो अलग-अलग कोड के टुकड़े मेरे लिए बराबर लग रहे हैं:एक सरणी और वस्तु के बीच क्या अंतर है?

var myArray = Array(); 
myArray['A'] = "Athens"; 
myArray['B'] = "Berlin"; 

और

var myObject = {'A': 'Athens', 'B':'Berlin'}; 

क्योंकि वे दोनों एक ही व्यवहार करते हैं, और यह भी typeof(myArray) == typeof(myObjects) (दोनों उपज 'वस्तु')।

इन वेरिएंट के बीच कोई अंतर है?

उत्तर

107

वस्तुतः जावास्क्रिप्ट में कुछ एक ऑब्जेक्ट है, तो आप "दुरुपयोग" एक Array उस पर मनमाने ढंग से गुण सेट करके वस्तु कर सकते हैं। हालांकि यह should be considered harmful हालांकि। Arrays संख्यात्मक रूप से अनुक्रमित डेटा के लिए हैं - गैर-संख्यात्मक कुंजी के लिए, एक वस्तु का उपयोग करें।

यहाँ एक अधिक ठोस उदाहरण क्यों गैर-संख्यात्मक चाबियाँ है "फिट" नहीं किसी सरणी है:

var myArray = Array(); 
myArray['A'] = "Athens"; 
myArray['B'] = "Berlin"; 

alert(myArray.length); 

यह प्रदर्शित नहीं करेगा '2', लेकिन '0' - प्रभावी ढंग से, कोई तत्व किया गया है सरणी में जोड़ा गया, सरणी ऑब्जेक्ट में कुछ नए गुण जोड़े गए।

+2

myArray.length सरणी में अंतिम तत्व की संख्यात्मक अनुक्रमणिका/कुंजी देता है लेकिन तत्वों की वास्तविक संख्या नहीं। क्या ऐरे ऑब्जेक्ट के गुण सरणी मानों के समान नहीं हैं? –

+1

मैं सिर्फ ऐरे ऑब्जेक्ट के इच्छित अर्थशास्त्र का वर्णन करने की कोशिश कर रहा था, यदि आप इसे नियमित वस्तु की तरह मानते हैं। लिंक्ड आलेख हालांकि बेहतर काम करता है :) –

+5

अगली बार जब कोई कहता है कि जावास्क्रिप्ट विकसित करने के लिए एक अच्छी भाषा है, तो मैं उसे यह नमूना दिखाऊंगा। धन्यवाद। –

-1

{} -notation बनाने के लिए सिर्फ वाक्य-चीनी है कोड अच्छे ;-)

जावास्क्रिप्ट काम करता है, के निर्माण जहां समारोह() बस

var Func = new Function("<params>", "<code>"); 
के लिए एक पर्याय है जैसे कई समान निर्माणों है
+3

समारोह निर्माता है ** नहीं ** समारोह शाब्दिक के लिए एक पर्याय। जब रचनाकार वैश्विक है, तो शाब्दिक रूप से लिखा जाता है। '{}' शाब्दिक ऑब्जेक्ट नोटेशन है, '[] 'शाब्दिक सरणी है, मुझे यकीन नहीं है कि आपके उत्तर का बिंदु क्या है। –

+0

इसके अलावा, किसी भी कोड को निष्पादित करने से पहले घोषित फ़ंक्शंस उपलब्ध हैं, फ़ंक्शन कन्स्ट्रक्टर का उपयोग करके असाइनमेंट उन कोडों तक उपलब्ध नहीं हैं जब तक उन्हें निष्पादित नहीं किया जाता है। – RobG

13

जेएस सरणी में वस्तुएं हैं, बस थोड़ा संशोधित (कुछ और कार्यों के साथ)।

कार्य की तरह:

concat 
every 
filer 
forEach 
join 
indexOf 
lastIndexOf 
map 
pop 
push 
reverse 
shift 
slice 
some 
sort 
splice 
toSource 
toString 
unshift 
valueOf 
+0

हालांकि मुझे नहीं लगता कि सूचीबद्ध सभी कार्यों को हर जेएस कार्यान्वयन में बनाया गया है, आपको बिंदु मिल गया है। दूसरा अंतर अलग प्रोटोटाइप होगा (जो उन अतिरिक्त कार्यों द्वारा निहित है)। – Rashack

5

जावास्क्रिप्ट में सब कुछ आदिम प्रकारों के अलावा एक वस्तु है।

कोड

var myArray = Array(); 

जबकि

var myObject = {'A': 'Athens', 'B':'Berlin'}; 

वस्तु वस्तु का एक उदाहरण बनाता है सरणी वस्तु का एक उदाहरण बनाता है।

निम्नलिखित कोड का प्रयास करें

alert(myArray.constructor) 
alert(myObject.constructor) 

तो तुम अंतर वस्तु निर्माता के प्रकार में है देखेंगे।

सरणी वस्तु का उदाहरण सभी गुण और सरणी प्रोटोटाइप के तरीकों में शामिल होंगे।

4

मेरे सोचता है, मुझे भी प्रतीकात्मक और पिछले जवाब के साथ गुप्त। स्पष्टीकरण निम्नानुसार है।

सरणी का एक उदाहरण, बूलियन, तिथि, समारोह, संख्या, रेगुलर एक्सप्रेशन, स्ट्रिंग एक वस्तु लेकिन तरीकों और गुण प्रत्येक प्रकार के लिए विशिष्ट के साथ बढ़ाया है। उदाहरण के लिए, एक सरणी में पूर्व निर्धारित length संपत्ति होती है जबकि सामान्य वस्तुएं नहीं होती हैं।

javascript:alert([].length+'\n'+{}.length) 

प्रदर्शित करता है

 
0 
undefined 

आंतरिक रूप से, एफएफ छिपकली दुभाषिया भी Arrays और भाषा निर्माणों का मूल्यांकन अलग अंतर के साथ सामान्य वस्तुओं में भेद किया।

javascript: 
    ra=[ "one", "two", "three"]; ra.a=4; 
    ob={0:"one", 1:"two", 2:"three"}; ob.a=4; 
    alert(
    ra   +"\n\n"+ 
    ob   +"\n\n"+ 
    ra.toSource() +"\n\n"+ 
    ra.a   +"\t .toSource() forgot me! \n\n"+ 
    ra.length  +"\t and my length! \n\n"+ 
    ob.toSource()); 
    ps=""; for(i in ra)ps+=i+" "; alert(ps); /* NB .length is missing! */ 
    ps=""; for(i in ob)ps+=i+" "; alert(ps); 

प्रदर्शित

 
one,two,three 

[object Object] 

["one", "two", "three"] 

4 .toSource() forgot me! 

3 and my length! 

({0:"one", 1:"two", 2:"three", a:4}) 

और 0 1 2 a और 0 1 2 a

बयान है कि सभी वस्तुओं कार्य हैं के बारे में:

यह है न वाक्य रचना है और न ही शब्दार्थ 123() या "abc"() या []() या {}() या obj() की तरह एक समारोह जहां obj किसी भी प्रकार के अलावा अन्य है के रूप में एक मनमाना वस्तु उदाहरण का उपयोग करने के लिए सही Function, इसलिए एक मनमानी वस्तु इंस्टेंस एक Function नहीं है। हालांकि, ऑब्जेक्ट obj दिया गया है और यह Array, Boolean, Date, ... के रूप में टाइप किया गया है, objArray, Boolean, Date, ... के रूप में कैसे आया? Array, Boolean, Date, ... क्या है?

javascript: 
    alert([Array, Boolean, Date, Function, 
       Number, Object, RegExp, String] . join('\n\n')); 

प्रदर्शित करता है

function Array() { 
    [native code] 
} 

function Boolean() { 
    [native code] 
} 

function Date() { 
    [native code] 
} 

function Function() { 
    [native code] 
} 

function Number() { 
    [native code] 
} 

function Object() { 
    [native code] 
} 

function RegExp() { 
    [native code] 
} 

function String() { 
    [native code] 
} 

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

दोनों एक कार्यात्मक और वस्तु प्रतिमान प्रोग्रामिंग करने के लिए मौलिक और, इस तरह के रूप Math और JSON और true जे एस दुभाषिया निम्न स्तर में निर्मित पुरातन का लागू करने होने लगते हैं।

javascript:alert([Math, JSON, true.toSource()].join("\n\n")); 

प्रदर्शित करता है

[object Math] 

[object JSON] 

(new Boolean(true)) 

जावास्क्रिप्ट, एक वस्तु केंद्रित प्रोग्रामिंग शैली (OOP के के विकास के समय - ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग शैली - "के" मेरे अपने यमक है !) प्रचलित था और दुभाषिया को जावा के साथ समान रूप से नामित किया गया ताकि वह अधिक विश्वसनीयता प्रदान कर सके। कार्यात्मक प्रोग्रामिंग तकनीकों को ऑटोमाटा, रिकर्सिव फ़ंक्शंस, औपचारिक भाषा इत्यादि के सिद्धांतों का अध्ययन करने और अधिक आकर्षक नहीं होने के कारण अधिक अमूर्त और गूढ़ परीक्षाओं में शामिल किया गया था। हालांकि, इन औपचारिक विचारों की ताकत जावास्क्रिप्ट में स्पष्ट रूप से प्रकट होती है, विशेष रूप से एफएफ के गेको इंजन (यानी .toSource()) में लागू की गई है।


समारोह के लिए वस्तु परिभाषा विशेष रूप से संतोषजनक के लिए यह एक आवर्ती संबंध के रूप में परिभाषित किया गया है है! इसकी अपनी परिभाषा का उपयोग करके परिभाषित किया गया है!

function Function() { [native code] }
और एक समारोह के बाद से एक वस्तु के लिए
function Object() { [native code] } एक ही भावना रखती है।

अन्य परिभाषाओं में से अधिकांश एक स्थिर टर्मिनल मान से पूछताछ करते हैं। हालांकि, eval() एक विशेष रूप से शक्तिशाली आदिम है और इसलिए एक स्ट्रिंग मनमाने ढंग से कार्यक्षमता भी एम्बेड कर सकता है।

फिर से ध्यान दें, उपरोक्त शब्दकोष ऊपर ऑब्जेक्ट प्रकार और उदाहरण भेद को अस्पष्ट करता है।

1

एक व्यावहारिक अंतर जब एक array सभी गैर-संख्यात्मक अनुक्रमित अनदेखी कर रहे हैं पर JSON.stringify उपयोग कर रहा है:

var arr = []; 
var obj = {}; 

arr['name'] = 'John'; 
obj['name'] = 'John'; 

console.log(arr); // will output [name: "John"] 
console.log(obj); // will output {name: "John"} 

JSON.stringify(arr); // will return [] 
JSON.stringify(obj); // will return {"name":"John"} 
संबंधित मुद्दे