जावास्क्रिप्ट में {} या नई वस्तु () के साथ एक खाली वस्तु बनाएं?


370

कर रहे हैं दो अलग अलग जावास्क्रिप्ट में एक खाली वस्तु बनाने के लिए तरीके:

var objectA = {}
var objectB = new Object()

क्या कोई अंतर है कि स्क्रिप्ट इंजन उन्हें कैसे संभालता है? क्या एक के ऊपर एक प्रयोग करने का कोई कारण है?

इसी तरह विभिन्न सिंटैक्स का उपयोग करके एक खाली सरणी बनाना भी संभव है:

var arrayA = []
var arrayB = new Array()

6
चेतावनी: एक मामूली अंतर है जो बहुत परेशान कीड़े पैदा कर सकता है! किसी ऑब्जेक्ट प्रोटोटाइप में "{}" को असाइन करने वाली एक खाली ऑब्जेक्ट बनाना एक "नए" ऑपरेटर द्वारा बनाई गई प्रत्येक ऑब्जेक्ट उदाहरण में समान ऑब्जेक्ट उदाहरण होगा। जब आप "नई वस्तु ({})" का उपयोग करते हैं, तो आपके पास अलग-अलग उदाहरण होंगे।
पेटेर - मोनिका

इस बात का उल्लेख करने के लिए कि इसके अलावा var objectA = {} var objectB = new Object()एक तीसरा निर्माण है जो एक ही परिणाम देगा:var objectC = Object.create(Object.prototype);
kalitsov

{}के बजाय [] उपयोग करें । के बजाय का उपयोग करें । जब सदस्य नाम क्रमिक पूर्णांक होंगे, तो सरणियों का उपयोग करें। सदस्य नामों के मनमाने तार या नाम होने पर वस्तुओं का उपयोग करें। स्रोत{}new Object()[]new Array()
ilgaar

new Object()और {}काफी खाली वस्तुएं नहीं हैं, वे ऑब्जेक्ट हैं जिनमें Object.prototype हैं। आप Object.create(null)वास्तव में खाली वस्तु के लिए उपयोग कर सकते हैं (कम से कम मोज़िला डॉक्स के अनुसार: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… )

जवाबों:


459

वस्तुओं

उपयोग करने का कोई लाभ नहीं है new Object();- जबकि {};आपके कोड को अधिक कॉम्पैक्ट, और अधिक पठनीय बनाया जा सकता है।

खाली वस्तुओं को परिभाषित करने के लिए वे तकनीकी रूप से समान हैं। {}वाक्य रचना कम, neater (कम जावा-ish) है, और आप तुरंत वस्तु इनलाइन पॉप्युलेट करने के लिए अनुमति देता है - तो की तरह:

var myObject = {
        title:  'Frog',
        url:    '/img/picture.jpg',
        width:  300,
        height: 200
      };

Arrays

सरणियों के लिए, वहाँ इसी तरह लगभग कोई कभी का उपयोग करने के लाभ है new Array();से अधिक [];- एक नाबालिग अपवाद के साथ:

var emptyArray = new Array(100);

सभी स्लॉट्स के साथ 100 आइटम लंबा एरे बनाता है undefined- जो कुछ स्थितियों में अच्छा / उपयोगी हो सकता है (जैसे (new Array(9)).join('Na-Na ') + 'Batman!')।

मेरी सिफारिश

  1. कभी उपयोग न करें new Object();- यह क्लिंकर है {};और मूर्खतापूर्ण दिखता है।
  2. हमेशा उपयोग करें [];- जब आपको जल्दी से एक पूर्वनिर्धारित लंबाई के साथ "खाली" सरणी बनाने की आवश्यकता होती है।

22
भले ही आप ऐरे (100) सिंटैक्स का उपयोग करते हों, वही सरणी, 101 वें स्थान पर इसमें अपरिभाषित है; केवल एक चीज जो संख्या वास्तव में करती है वह है लंबाई संपत्ति का मूल्य।
जेसन बंटिंग

6
@ पाब्लो के बारे में कुछ भी अमान्य नहीं है new Array(100)। साहित्य पढ़ें: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
Már Mrlygsson

9
@ पाब्लो मुझे नहीं पता कि आपका तर्क क्या है। डगलस क्रॉकफोर्ड की तरह, मैं उपयोग करने की सलाह देता हूं []। वहां कोई तर्क नहीं। हालांकि, आपने तर्क दिया कि new Array(100)किसी भी तरह "अमान्य" है, जो असत्य है।
मेर gsrlygsson

10
इसके अलावा, इस बात से अवगत रहें कि new Array(1,2,3)परिणाम क्या है [1,2,3], लेकिन new Array(1)इसमें परिणाम नहीं होता है [1]; इस प्रकार, शब्दार्थ Arrayअसंगत और अनावश्यक रूप से भ्रमित हैं।
दांकरुम्बर

3
मैं जोड़ूंगा कि Object.create(null)एक खाली वस्तु बनाने के लिए उपयोगी हो सकता है, जबकि { }ऑब्जेक्ट प्रोटोटाइप से विरासत में मिला है।
मेव

90

हां, एक अंतर है, वे समान नहीं हैं। यह सच है कि आपको समान परिणाम मिलेंगे, लेकिन इंजन उन दोनों के लिए एक अलग तरीके से काम करता है। उनमें से एक एक वस्तु शाब्दिक है, और दूसरा एक निर्माता है, जावास्क्रिप्ट में एक वस्तु बनाने के दो अलग-अलग तरीके हैं।

var objectA = {} //This is an object literal

var objectB = new Object() //This is the object constructor

जेएस में सब कुछ एक वस्तु है, लेकिन आपको नई वस्तु के साथ निम्नलिखित चीज के बारे में पता होना चाहिए (): यह एक पैरामीटर प्राप्त कर सकता है, और उस पैरामीटर के आधार पर, यह एक स्ट्रिंग, एक संख्या या सिर्फ एक खाली वस्तु बनाएगा।

उदाहरण के लिए: new Object(1)एक नंबर लौटाएगा। new Object("hello")एक स्ट्रिंग लौटाएगा, इसका मतलब है कि ऑब्जेक्ट कंस्ट्रक्टर पैरामीटर पर -Depending को डेलिगेट कर सकता है- स्ट्रिंग, संख्या, आदि जैसे अन्य कंस्ट्रक्टर्स के लिए ऑब्जेक्ट क्रिएशन ... जब आप डायनामिक डेटा का प्रबंधन कर रहे हों, तो इसे ध्यान में रखना बेहद ज़रूरी है। वस्तुओं का निर्माण ..

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

मेरा सुझाव है कि आप अधिक विवरण खोजने के लिए जावास्क्रिप्ट पर शाब्दिक संकेतन और निर्माणकर्ताओं के बीच के अंतर पर एक और रीडिंग करें।


शाब्दिक संकेतन वास्तव में गतिशील डेटा ऑब्जेक्ट बनाने के लिए अधिक पठनीय और संक्षिप्त है।
सिड

12

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

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

अंततः, यह स्थिति के साथ-साथ वरीयता पर निर्भर करेगा।


8

ऑब्जेक्ट और ऐरे शाब्दिक सिंटैक्स {} / [] को जावास्क्रिप्ट 1.2 में पेश किया गया था, इसलिए 4.0 से पहले नेटस्केप नेविगेटर के संस्करणों में उपलब्ध नहीं है (और एक सिंटैक्स त्रुटि उत्पन्न करेगा)।

मेरी उंगलियां अभी भी नया ऐरे () कहने के लिए डिफ़ॉल्ट हैं, लेकिन मैं बहुत पुराना आदमी हूं। शुक्र है कि नेटस्केप 3 एक ब्राउज़र नहीं है, जिसे कई लोगों ने आज माना है ...


11
नेटस्केप 3? यार, जो पिछली सदी में था ! :
तोमलक

8
var objectA = {}

एक बहुत तेज और, मेरे अनुभव में, अधिक सामान्यतः उपयोग किया जाता है, इसलिए यह शायद 'मानक' को अपनाने और कुछ टाइपिंग को बचाने के लिए सबसे अच्छा है।


1
तेज दौड़ना या टाइप करने की जल्दी?
हिप्पिट्रैइल

खैर, माना जाता है कि, मेरा मतलब "टाइप करने के लिए" था, लेकिन अतिरिक्त पार्सिंग समय को देखते हुए, शायद हर-थोड़ी-थोड़ी जल्दी निष्पादन-वार भी, :-)
बॉबी जैक

2
इसके अलावा, शाब्दिक रूप से पार्स समय पर बनाए जाते हैं, जबकि new Objectरनटाइम पर निष्पादित किया जाना चाहिए।
फ्रॉग्ज

8

मेरा मानना {}है कि जावास्क्रिप्ट कोड में से एक में यहां एक अच्छे कोडिंग सम्मेलन के रूप में सिफारिश की गई थी । newछद्मकोशिकीय विरासत के लिए आवश्यक है। जिस var obj = {};तरह से आपको यह याद दिलाने में मदद मिलती है कि यह एक शास्त्रीय वस्तु उन्मुख भाषा नहीं बल्कि एक प्रोटोटाइप है। इस प्रकार केवल समय newजब आपको वास्तव में आवश्यकता होगी जब आप निर्माण कार्यों का उपयोग कर रहे हैं। उदाहरण के लिए:

var Mammal = function (name) {
  this.name = name;
};

Mammal.prototype.get_name = function () {
  return this.name;
}

Mammal.prototype.says = function() {
  return this.saying || '';
}

तो यह इस तरह प्रयोग किया जाता है:

var aMammal = new Mammal('Me warm-blooded');
var name = aMammal.get_name();

{}विरोध करने के रूप में उपयोग करने का एक और फायदा new Objectयह है कि आप इसे JSON-style ऑब्जेक्ट शाब्दिक उपयोग कर सकते हैं।


7

तात्कालिक प्रदर्शन

यदि आप कोई लंबाई के साथ एक सरणी बनाना चाहते हैं:

var arr = []; से तेज है var arr = new Array();

यदि आप एक निश्चित लंबाई के साथ एक खाली सरणी बनाना चाहते हैं:

var arr = new Array(x);से तेज है var arr = []; arr[x-1] = undefined;

बेंचमार्क के लिए निम्नलिखित पर क्लिक करें: https://jsfiddle.net/basickarl/ktbbry5b/

मुझे हालांकि दोनों के मेमोरी फुटप्रिंट का पता नहीं है, मैं कल्पना कर सकता हूं कि new Array()अधिक स्थान लेता है।


arr = new Array(x)के समतुल्य है arr = []; arr.length = x;, x-1सूचकांक को निर्दिष्ट करने के लिए नहीं undefined
बरगी

2

यह मूल रूप से एक ही बात है। जो भी आपको सुविधाजनक लगे, उसका उपयोग करें।


शायद मैं यहाँ बहुत गहरी जावास्क्रिप्ट में तल्लीन कर रहा हूँ, लेकिन वे एक ही हैं? क्या 'proto' का 'शून्य' नहीं Objectहै, जबकि {}'proto' का 'Object.prototype' है?
इज़्हाकी Iz

@ इजाकी का प्रोटोटाइप Objectअशक्त है, यह सही है। ऐसा इसलिए है क्योंकि Objectप्रोटोटाइप श्रृंखला समाप्त हो जाती है। वस्तु उदाहरणों में एक प्रोटोटाइप नहीं है, केवल निर्माणकर्ताओं के पास एक है। और (new Object()).constructor === ({}).constructor->true
टॉमालक

तो यह गलत है?
इज़्हाकी

यहाँ मेरी बात है: new Object()एक खाली वस्तु उदाहरण देता है। {}एक खाली वस्तु उदाहरण देता है। ये दोनों उदाहरण बिल्कुल अविभाज्य हैं। उदाहरण आप कुछ और करने के लिए लिंक करते हैं (यह प्रोटोटाइप श्रृंखला को संशोधित करता है) और वास्तव में यहां लागू नहीं होता है - या मैं आपके तर्क को नहीं समझता हूं।
टॉमालक

1

ठीक है , एक ही काम करने के लिए सिर्फ 2 अलग-अलग तरीके हैं! एक को बुलाया गया object literalऔर दूसरे को एक फंक्शन constructor!

लेकिन पर पढ़ें, वहाँ कुछ चीजें मैं साझा करना चाहते हैं:

उपयोग करना {}आपके कोड को अधिक पठनीय बनाता है, जबकि Objectअनुशंसित या अन्य अंतर्निहित कार्यों के उदाहरणों को बनाते हुए ...

इसके अलावा, ऑब्जेक्ट फ़ंक्शन को पैरामीटर मिलता है क्योंकि यह एक फ़ंक्शन है, जैसे Object(params)... लेकिन {}जावास्क्रिप्ट में एक ऑब्जेक्ट शुरू करने का शुद्ध तरीका है ...

ऑब्जेक्ट शाब्दिक का उपयोग करने से आपका कोड अन्य डेवलपर्स के लिए पढ़ने में बहुत साफ और आसान लगता है और यह जावास्क्रिप्ट में सर्वोत्तम प्रथाओं के साथ इनलाइन है ...

जबकि जावास्क्रिप्ट में ऑब्जेक्ट लगभग कुछ भी हो सकता है, {}केवल जावास्क्रिप्ट ऑब्जेक्ट्स को इंगित करता है, परीक्षण के लिए कि यह कैसे काम करता है, अपने जावास्क्रिप्ट कोड या कंसोल में नीचे करें:

var n = new Object(1); //Number {[[PrimitiveValue]]: 1}

हैरानी की बात है, यह एक नंबर बना रहा है!

var a = new Object([1,2,3]); //[1, 2, 3]

और यह एक ऐरे पैदा कर रहा है!

var s = new Object('alireza'); //String {0: "a", 1: "l", 2: "i", 3: "r", 4: "e", 5: "z", 6: "a", length: 7, [[PrimitiveValue]]: "alireza"}

और इस अजीब परिणाम के लिए String!

इसलिए यदि आप एक ऑब्जेक्ट बना रहे हैं, तो ऑब्जेक्ट कोडल का उपयोग करने की सिफारिश की जाती है, एक मानक कोड होने के लिए और ऊपर की तरह किसी भी कोड दुर्घटना से बचने के लिए, प्रदर्शन बुद्धिमान का उपयोग {}करना मेरे अनुभव में बेहतर है!


आप डीज़फूली हैं? ईरान में?
एहसान

हाय एहसान, हाँ, लेकिन मैं ईरान में नहीं रह रहा हूँ दोस्त, तुम यहाँ एक महान प्रोफ़ाइल है! आपसे मिलकर अच्छा लगा ...
Alireza

क्या मैं आपका नंबर फोन बचा सकता हूं और प्रोग्रामिंग के बारे में आपसे मदद ले सकता हूं?
एहसान

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

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