जावास्क्रिप्ट में एक सरणी की घोषणा करते समय सबसे अच्छा अभ्यास क्या हैं?


176

जब मुझे एक नई सरणी घोषित करने की आवश्यकता होती है तो मैं इस अंकन का उपयोग करता हूं

var arr = new Array();

लेकिन जब ऑनलाइन परीक्षण, उदाहरण के लिए jsbin पर , एक चेतावनी मुझे संकेत देती है "सरणी शाब्दिक संकेतन का उपयोग करें []।"

मुझे कंस्ट्रक्टर के उपयोग से बचने का कोई कारण नहीं मिला। किसी तरह से उपयोग करने से कम कुशल है []? या यह बुरा अभ्यास है?

क्या var arr = [];इसके बजाय उपयोग करने का एक अच्छा कारण है var arr = new Array();?


5
दोनों ठीक हैं। आप ट्रांसमिशन में बस कुछ बाइट्स बचाते हैं।
सिरको

13
वास्तव में मतभेद हैं। इस पोस्ट को देखें: stackoverflow.com/q/2280285/921204
Techfoobar

नोट: यदि ऐरे को केवल ओवरराइट किया गया है तो मतभेद हैं ।
crdx

कुछ ब्राउज़रों पर @apkd का महत्वपूर्ण प्रदर्शन अंतर है
Alnitak

काफी उचित। मैं उस जुड़े सवाल पर नहीं देखा था।
crdx

जवाबों:


260

ज्यादातर , लोग उपयोग करते हैं var a = []क्योंकि डगलस क्रॉकफोर्ड ऐसा कहते हैं

उनके कारणों में गैर-सहज और असंगत व्यवहार शामिल हैं new Array():

var a = new Array(5);     // an array pre-sized to 5 elements long
var b = new Array(5, 10); // an array with two elements in it

ध्यान दें कि इसमें new Array()केवल एक पूर्व-निर्दिष्ट संख्या तत्व के साथ एक सरणी बनाने का कोई तरीका नहीं है!

उपयोग करना []वास्तव में अधिक कुशल है, और सुरक्षित भी है ! Arrayकंस्ट्रक्टर को अधिलेखित करना और इसे अजीब करना संभव है , लेकिन आप के व्यवहार को अधिलेखित नहीं कर सकते []

व्यक्तिगत रूप से, मैं हमेशा का उपयोग []वाक्य रचना, और इसी तरह हमेशा उपयोग {}के स्थान पर वाक्य रचना new Object()


5
"आप [] के व्यवहार को अधिलेखित नहीं कर सकते।" क्या तुम इसके बारे में निश्चित हो? मैंने सोचा था कि आप [] को प्रभावित करने के लिए ऐरे कंस्ट्रक्टर को अधिलेखित कर सकते हैं, और वस्तु निर्माता {} को प्रभावित करने के लिए, कम से कम कुछ कार्यान्वयन पर।
रैंडम 32३२

11
@ Random832 शायद पुराने ब्राउज़रों में है, लेकिन ES5 संगत कार्यान्वयन में नहीं, जहां कल्पना कहती है कि []आंतरिक कंस्ट्रक्टर को कॉल करता है, न Array.constructorकि उस समय जो भी मूल्य होता है।
अलनीतक

5
बोनस: एरे शाब्दिक निर्माणकर्ता का उपयोग करके नए एरेज़ बनाने की तुलना में बहुत तेज़ हैं Array: jsperf.com/new-array
Mathias Bynens

@MathiasBynens केवल कभी-कभी।
ऑरेंजडॉग

Ew @ [] आंतरिक कंस्ट्रक्टर चीज की वजह से अलग तरीके से काम कर रहा है। असंगति से भ्रम की स्थिति पैदा होती है। संपादित करें: आह, सुरक्षा चिंता। मैं समझ गया।
एरिक रेपेन

48

एक महत्वपूर्ण अंतर यह है कि []होगा हमेशा एक नई सरणी का दृष्टांत, जबकि new Arrayकिया जा सकता है एक अलग वस्तु बनाने के लिए अपहरण कर लिया

(function () {
    "use strict";
    var foo,
        bar;
    //don't do this, it's a bad idea
    function Array() {
        alert('foo');
    }
    foo = new Array();
    bar = [];
}());​

अपने उदाहरण कोड में, मैंने Arrayफ़ंक्शन को दस्तावेज़ के बाकी हिस्सों से छिपा कर रखा है , हालांकि यह अधिक संभावना है कि यदि आप कभी इस तरह के मुद्दे में भाग लेते हैं कि कोड एक अच्छा क्लोजर में नहीं छोड़ा जाएगा, और होगा संभावना का पता लगाना मुश्किल है।

डिस्क्लेमर : Arrayकंस्ट्रक्टर को हाईजैक करना अच्छा विचार नहीं है ।


7
IIRC, एरे कंस्ट्रक्टर को ओवरराइड करने वाले पुराने ब्राउज़रों में भी शाब्दिक रूप से गलत व्याख्या की जाएगी। इसमें कुछ समय पहले एक GMail CSRF भेद्यता थी, जिसमें व्यूह रचना को शामिल करने वाले और नए ब्राउज़र इस सटीक कारण के लिए शाब्दिक रूप से ओवरलोडिंग को अनदेखा करते हैं।
13

प्रतिगामी अस्वीकरण: यह पिछले वर्षों में ऐरे कंस्ट्रक्टर को बढ़ाने के लिए अत्यधिक उपयोगी और उपयोगी रहा है।
एरिक रेपेन

26

स्थिरता के लिए, का उपयोग करें []

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

खाली सरणियों के लिए, का उपयोग करें []

var ns = [];
var names = [ 'john', 'brian' ];

जैसा कि यहां दिखाया गया है , खाली और कुछ ज्ञात तत्वों के लिए शाब्दिक का उपयोग करना ऐरे कंस्ट्रक्टर की तुलना में मोटा है।

ज्ञात आकार के एक सरणी के लिए, का उपयोग करें new Array(size)

यदि आकार ज्ञात है, तो ऐरे कंस्ट्रक्टर का उपयोग प्रदर्शन में काफी सुधार करता है। हालांकि इसका मतलब यह भी है कि आपको एक ऐसे एरे से निपटना होगा, जिसमें पहले से ही अपरिभाषित '' अपरिभाषित है।

जैसा यहाँ दिखाया गया है

// fill an array with 100 numbers
var ns = new Array( 100 );
for ( var i = 0; i < 100; i++ ) {
    ns[i] = i;
}

यह बहुत छोटे सरणियों के लिए भी काम करता है


12

नहीं, वास्तव में खाली Arrays के लिए एक दूसरे पर एक अंकन का उपयोग करने का कोई कारण नहीं है।

हालांकि, अधिकांश ब्राउज़र कंस्ट्रक्टर कोx = []; कॉल करने की तुलना में थोड़ा बेहतर प्रदर्शन दिखाते हैं ।

यदि आपको एक विशिष्ट आकार के साथ एक ऐरे बनाने की आवश्यकता है, तो आपको उदाहरण के लिए उपयोग करने की आवश्यकता है x = new Array(10);, जो 10 undefinedस्लॉट के साथ एक ऐरे का निर्माण करेगा ।


@Alnitak: जिसका आपने पहले ही उल्लेख किया है, बहुत सहज और संक्षिप्त नहीं है।
जॉन्डी

7
मैंने प्रदर्शन की तुलना करने के लिए jsperf को एक साथ रखा: jsperf.com/array-constructor-versus-literal । कम से कम मेरे लिए उबंटू पर क्रोम 20 पर, शाब्दिक निर्माणकर्ता की तुलना में दोगुना है।
स्टीवन


jAndy, आप जावास्क्रिप्ट में "10 खाली स्लॉट्स" के साथ एक सरणी क्यों चाहते हैं? वास्तविकता में, आप इसके साथ सटीक कार्य कर सकते हैं: var arrest = []; arr [9] = "ओमेगा"; 1. जेएस में सारणी पूरी तरह से गतिशील हैं, आप जो भी सूचकांक चाहेंगे, उसका संदर्भ दे सकते हैं और यह सिर्फ "अपरिभाषित" होगा। यह उतना ही सत्य है जितना कि आप कहना चाहते हैं: var arr = new Array (10); आगमन [23]; 2. सरणी की लंबाई उच्चतम मान पर सेट होने वाली है, जिसमें कुछ भी है, भले ही इसके बीच में कितने अपरिष्कृत स्लॉट हों। या आप इसे स्वयं सेट कर सकते हैं। [] कैंसर का इलाज नहीं हो सकता है, लेकिन यह मामूली रूप से बेहतर है।
नोरगार्ड

7
  • var arr = [] सरणी / ऑब्जेक्ट शाब्दिक का उपयोग करता है
  • var arr = new Array () सरणी / ऑब्जेक्ट कंस्ट्रक्टर का उपयोग करें

किसी सरणी या ऑब्जेक्ट को परिभाषित करने का सबसे तेज़ तरीका शाब्दिक तरीका है, क्योंकि आपको कंस्ट्रक्टर को कॉल करने की आवश्यकता नहीं है

var arr1 = new Array(1, 2, 3, 4);
var arr2 = [1, 2, 3, 4];

alert(arr1[0]); // 1
alert(arr2[0]); // 1

var arr3 = new Array(200);
var arr4 = [200];

alert(arr3[0]); // 'undefined'
alert(arr4[0]); // 200

2
संदर्भ के लिए, पर्दे के पीछे, var arr = [];तार्किक रूप से एक निर्माता का भी उपयोग करता है। वर्तमान में नाम से जो भी चल रहा है, उसके बजाय यह हमेशा बिल्ट-इन एरे कंस्ट्रक्टर है Array
cHao

6

दोनों ही सही हैं। लेकिन ज्यादातर लोग इस्तेमाल करते हैंvar a = []

जावास्क्रिप्ट में एक ऐरे की घोषणा करने के तीन तरीके।

विधि 1 : हम स्पष्ट रूप से सरणी में मेमोरी को इंस्टेंट करने के लिए जावास्क्रिप्ट "नया" कीवर्ड के साथ एक सरणी घोषित कर सकते हैं (अर्थात इसे बनाएं, और इसे उपलब्ध करें)।

// Declare an array (using the array constructor)
var arlene1 = new Array();
var arlene2 = new Array("First element", "Second", "Last");

विधि 2 : हम ऐरे को घोषित करने के लिए एक वैकल्पिक विधि का उपयोग करते हैं।

// Declare an array (using literal notation)
var arlene1 = [];
var arlene2 = ["First element", "Second", "Last"];

विधि 3 : जावास्क्रिप्ट भी आपको विशिष्ट तरीके से कॉल करके अप्रत्यक्ष रूप से एरेज़ बनाने देता है।

// Create an array from a method's return value
var carter = "I-learn-JavaScript";
var arlene3 = carter.split("-");

4

एक सीमा है कि कंस्ट्रक्टर तर्क के रूप में ले सकता है।

अधिकांश प्रणालियों पर मैंने सीमा तय की है 2 ^ 16 (2 बाइट्स):

var myFreshArr = new Array(0,1,2,3 ..... 65536);

यह एक त्रुटि का कारण होगा (बहुत सारे तर्क ....)

शाब्दिक [] का उपयोग करते समय आपको ऐसी समस्याएं नहीं होती हैं।

यदि आप ऐसे बड़े सरणियों की परवाह नहीं करते हैं, तो मुझे लगता है कि आप जो चाहें उसका उपयोग कर सकते हैं।


2
क्या आप एक उदाहरण का हवाला दे सकते हैं जहां एक व्यक्ति 70,000 मूल्यों के साथ पूर्व-आबाद एक सरणी बनाना चाहता है? हालांकि, यह वास्तव में कुछ भयानक वेबसाइटों की व्याख्या करता है, जिन्हें मैंने देखा है कि कभी भी लोडिंग खत्म नहीं होती है ...
जॉन ओ

2
जॉन ओ, मैंने अपने समय में कुछ SCARY JSON कार्यान्वयन देखे हैं, जिसमें 2D / 3D सरणियों के सरणियों को शामिल किया गया है, जिसमें IATA (हवाई अड्डा) कोड, एयरलाइन-कंपनियां, टूर-ऑपरेटर, रिसॉर्ट्स, वगैरह शामिल हैं ... सभी भरवां एक सरणी में। यह ... ... 1MB + JSON डाउनलोड मुझे रोना चाहते हैं।
नोरगार्ड


3

यह इसलिए new Array()है क्योंकि अस्पष्ट है। ये सही निर्माता हैं:

// Using brackets
[element0, element1, ..., elementN]

// Using new AND a list of elements
new Array(element0, element1, ..., elementN)

// Using new AND an integer specifying the array length
new Array(arrayLength)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.