सवाल मैं जावास्क्रिप्ट में एक सरणी कैसे खाली करूं?


क्या सरणी खाली करने का कोई तरीका है और यदि संभवतः ऐसा है .remove()?

उदाहरण के लिए,

A = [1,2,3,4];

मैं इसे कैसे खाली कर सकता हूं?


2199
2017-08-05 09:08


मूल


यहां विभिन्न संभावनाओं के साथ एक बेंचमार्क: jsben.ch/#/7QyI1 - EscapeNetscape


जवाब:


मौजूदा सरणी को साफ़ करने के तरीके A:

विधि 1

(यह सवाल का मेरा मूल जवाब था)

A = [];

यह कोड चर सेट करेगा A एक नई खाली सरणी के लिए। यदि आपके पास नहीं है तो यह सही है मूल सरणी के संदर्भ A कहीं और क्योंकि यह वास्तव में एक ब्रांड नई (खाली) सरणी बनाता है। आपको इस विधि से सावधान रहना चाहिए क्योंकि यदि आपने इस सरणी को किसी अन्य चर या संपत्ति से संदर्भित किया है, तो मूल सरणी अपरिवर्तित रहेगी। केवल तभी इसका उपयोग करें यदि आप केवल सरणी को इसके मूल चर से संदर्भित करते हैं A

यह भी सबसे तेज़ समाधान है।

यह कोड नमूना इस विधि का उपयोग करते समय आप जिस समस्या का सामना कर सकते हैं उसे दिखाता है:

var arr1 = ['a','b','c','d','e','f'];
var arr2 = arr1;  // Reference arr1 by another variable 
arr1 = [];
console.log(arr2); // Output ['a','b','c','d','e','f']

विधि 2 (जैसा सुझाव दिया द्वारा मैथ्यू क्रूमली)

A.length = 0

यह मौजूदा सरणी को इसकी लंबाई 0 पर सेट करके साफ़ कर देगा। कुछ ने तर्क दिया है कि यह जावास्क्रिप्ट के सभी कार्यान्वयन में काम नहीं कर सकता है, लेकिन यह पता चला है कि यह मामला नहीं है। यह ईसीएमएस्क्रिप्ट 5 में "सख्त मोड" का उपयोग करते समय भी काम करता है क्योंकि सरणी की लंबाई संपत्ति एक पढ़ने / लिखने की संपत्ति है।

विधि 3 (जैसा सुझाव दिया द्वारा एंथोनी)

A.splice(0,A.length)

का उपयोग करते हुए .splice() पूरी तरह से काम करेगा, लेकिन के बाद से .splice() फ़ंक्शन सभी हटाए गए आइटमों के साथ एक सरणी वापस कर देगा, यह वास्तव में मूल सरणी की एक प्रति वापस करेगा। बेंचमार्क सुझाव देते हैं कि इसका प्रदर्शन पर कोई प्रभाव नहीं पड़ता है।

विधि 4 (जैसा सुझाव दिया द्वारा tanguy_k)

while(A.length > 0) {
    A.pop();
}

यह समाधान बहुत संक्षिप्त नहीं है, और यह मूल उत्तर में संदर्भित पहले के बेंचमार्क के विपरीत, सबसे धीमा समाधान भी है।

प्रदर्शन

एक समाशोधन के सभी तरीकों में से मौजूदा सरणी, विधियों 2 और 3 प्रदर्शन में बहुत समान हैं और विधि 4 से बहुत तेज हैं। इसे देखें बेंचमार्क

जैसा कि द्वारा इंगित किया गया है Diadistis उनके में उत्तर नीचे, ऊपर वर्णित चार विधियों के प्रदर्शन को निर्धारित करने के लिए उपयोग किए गए मूल मानक त्रुटिपूर्ण थे। मूल बेंचमार्क ने साफ़ सरणी का पुन: उपयोग किया ताकि दूसरा पुनरावृत्ति एक सरणी को साफ़ कर दे जो पहले से खाली था।

निम्नलिखित बेंचमार्क इस दोष को हल करता है: http://jsben.ch/#/hyj65। यह स्पष्ट रूप से दिखाता है कि विधियों # 2 (लंबाई संपत्ति) और # 3 (splice) सबसे तेज़ हैं (गिनती विधि # 1 नहीं जो मूल सरणी नहीं बदलती है)।


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


3457
2017-08-05 09:10



while (A.length) { A.pop(); }, की कोई ज़रूरत नहीं > 0 - Ivan Black
> 0 अधिक पठनीय IMHO है। और दोनों के बीच कोई प्रदर्शन अंतर नहीं है। - Philippe Leybaert
@ दहन, यह बिल्कुल स्पष्ट नहीं है कि आप क्या कहने की कोशिश कर रहे हैं। b इसके बाद भी पुरानी सरणी का संदर्भ रखता है a एक नया सौंपा गया है। c तथा d एक ही सरणी का संदर्भ जारी रखें। आउटपुट में अंतर इसलिए अपेक्षित है। - shovavnik
@DiegoJancic विधि # 1 गिनती नहीं है क्योंकि यह सरणी को साफ़ नहीं करता है। यह एक नया बनाता है। इसे बेंचमार्क में शामिल नहीं किया जाना चाहिए। - Philippe Leybaert
आप उपयोग नहीं कर सकते while(A.pop()) यदि सरणी में कोई आइटम गलत है। उदाहरण के लिए लें ए = [2, 1, 0, -1, -2] परिणामस्वरूप एक बराबर [2, 1] होगा। यहाँ तक की while(A.pop() !== undefined) काम नहीं करता है क्योंकि आपके पास एक मान के रूप में अपरिभाषित एक सरणी हो सकती है। शायद संकलक इसे अनुकूलित क्यों नहीं करता है। - Jonathan Gawrych


यदि आपको मूल सरणी रखने की आवश्यकता है क्योंकि आपके पास अन्य संदर्भ हैं जिन्हें अद्यतन भी किया जाना चाहिए, तो आप इसकी लंबाई शून्य पर सेट करके एक नई सरणी बनाये बिना इसे साफ़ कर सकते हैं:

A.length = 0;

2253
2017-08-05 16:29



@ एकोर्न हां, यह सभी ब्राउज़रों में काम करेगा। - Matthew Crumley
ईसीएमएस्क्रिप्ट 5 मानक इस बारे में क्या कहता है? - Pacerier
@Pacerier: यह अभी भी ES5 में काम करता है। धारा 15.4 से: "... जब भी लम्बाई संपत्ति बदल जाती है, तो प्रत्येक संपत्ति जिसका नाम एक सरणी अनुक्रमणिका है जिसका मूल्य नई लंबाई से छोटा नहीं है स्वचालित रूप से हटा दिया जाता है" - Matthew Crumley
@LosManos सख्त मोड में भी, length एक विशेष संपत्ति है, लेकिन केवल पढ़ने के लिए नहीं, तो यह अभी भी काम करेगा। - Matthew Crumley
@MattewCrumley मैंने कुछ परीक्षण किया, और ऐसा लगता है जैसे a.length = 0 पूर्ण सरणी को साफ़ करने के लिए नहीं है। jsperf.com/length-equal-0-or-new-array मुझे लगता है कि अगर आपके पास एक रिफेंस है (और आपने अतिरिक्त गुण नहीं जोड़े हैं जिन्हें आप रखना चाहते हैं), तो नई सरणी बनाना बेहतर है, और कचरा कलेक्टर को पुराना छोड़ देता है, जो उपयुक्त होने पर चलाएगा। - Paul Brewczynski


यहां सबसे तेज़ कामकाजी कार्यान्वयन जबकि एक ही सरणी रखना ( "परिवर्तनशील"):

Array.prototype.clear = function() {
  while (this.length) {
    this.pop();
  }
};

FYI करें नक्शा परिभाषित करता है clear() तो यह तार्किक प्रतीत होता है clear() के लिये सरणी भी।

या एक के रूप में Underscore.js mixin:

_.mixin({
  clearArray: function(array) {
    while (array.length) {
      array.pop();
    }
  }
});

या एक साधारण समारोह:

function clearArray(array) {
  while (array.length) {
    array.pop();
  }
}

टाइपप्रति संस्करण:

function clearArray<T>(array: T[]) {
  while (array.length) {
    array.pop();
  }
}

एफवाईआई इसे सरल नहीं किया जा सकता है while (array.pop()): परीक्षण विफल हो जाएंगे।

और परीक्षण जो इसके साथ जाते हैं:

describe('Array', () => {
  it('should clear the array', () => {
    let array = [1, 2, 3, 4, 5];
    array.clear();
    expect(array.length).toEqual(0);
    expect(array[0]).toEqual(undefined);
    expect(array[4]).toEqual(undefined);

    // Even with undefined or null inside
    array = [1, undefined, 3, null, 5];
    array.clear();
    expect(array.length).toEqual(0);
    expect(array[0]).toEqual(undefined);
    expect(array[4]).toEqual(undefined);
  });
});

यहां अद्यतन जेएसपीआरएफ: http://jsperf.com/array-destroy/32  http://jsperf.com/array-destroy/152


256
2018-06-25 20:32



टीटी आपका उत्तर केवल एकमात्र है जो सही और तेज़ (एक ही समय में) है लेकिन कुछ कम "अपवॉट्स" है। खैर, ऐसा लगता है कि सुंदर समाधान जैसे लोग धीमे होते हैं: / - Ai_boy
@naomik लेकिन यह बुनियादी कार्यक्षमताओं में से एक है, जो डिफ़ॉल्ट रूप से वहां होना चाहिए था। - thefourtheye
@thefourtheye प्रदर्शन के लिए अच्छा समाधान, हालांकि मैं @ नोमिक से सहमत हूं, आपको मूल वस्तुओं को संशोधित नहीं करना चाहिए। यह कहकर कि यह बिंदु के बगल में होना चाहिए, समस्या यह है कि आप संशोधित कर रहे हैं वैश्विक, जो बुरा है। यदि आप दूसरों के उपयोग के लिए अपना कोड प्रदान कर रहे हैं, तो इसका कोई अप्रत्याशित दुष्प्रभाव नहीं होना चाहिए। कल्पना कीजिए कि क्या एक और पुस्तकालय है भी संशोधित Array.prototype और यह कुछ अलग कर रहा था, फिर आपके पूरे कोड में [].clear() थोड़ा गलत था। डीबग करना मजेदार नहीं होगा। तो, सामान्य संदेश है: ग्लोबल्स को संशोधित न करें। - jpillora
@thefourtheye वैश्विक दायरे को संशोधित करने का पूरा बिंदु इसलिए है क्योंकि आप नहीं जानेंगे अगर किसी और का कोड पहले से ही नाम का उपयोग कर रहा है (या होगा)। मैं स्थानीय दायरे के अंदर एक समारोह का सुझाव देता हूं। तो, आपके आवेदन / पुस्तकालय के अंदर Iife, कर function clear(arr) { while(arr.length) arr.pop(); }, फिर के साथ सरणी साफ़ करें clear(arr) के बजाय arr.clear()। - jpillora
यह पता चला है कि यह विधि बहुत धीमी है .splice() तथा .length=0। बेंचमार्क सही नहीं थे। मेरा अद्यतन उत्तर देखें। - Philippe Leybaert


एक और क्रॉस-ब्राउज़र अनुकूल और अधिक इष्टतम समाधान का उपयोग करना होगा splice सरणी ए की सामग्री को खाली करने की विधि नीचे दी गई है:

A.splice(0, A.length);


182
2017-11-15 09:49



यह और अधिक क्रॉस-ब्राउज़र अनुकूल क्यों है? एंबेंथ के साथ कौन से ब्राउज़र में समस्याएं हैं? - stricjux
@ जेएम 2 जो आप कह रहे हैं वह पूरी तरह से सच नहीं है। यह वास्तव में प्रश्न में सरणी को संशोधित करता है और बाद में सभी संदर्भ प्रभावित होते हैं। मेरे जेएसफ़ाइल पर परीक्षण देखें: jsfiddle.net/shamasis/dG4PH - Shamasis Bhattacharya
@alex नहीं यह नहीं करता है, splice सरणी को संशोधित करता है और हटाए गए प्रविष्टियों को वापस करता है। पहले दस्तावेज़ पढ़ें: developer.mozilla.org/en-US/docs/JavaScript/Reference/... - David
हम परिणामी सरणी का उपयोग करके वापस लौटने से रोक सकते हैं अल्पविराम ऑपरेटर: A.splice(0, A.length),0;। यह एक वापसी मूल्य छोड़ देगा 0 बस के रूप में A.length = 0; होगा। परिणामी सरणी अभी भी बनाई गई है और चाहिए स्क्रिप्ट धीमा चलाने के कारण: (jsperf ~ 56% धीमी)। ब्राउज़र कार्यान्वयन इस पर असर डालेगा हालांकि मुझे कोई कारण नहीं दिख रहा है splice सेटिंग से तेज होगा length। - Evan Kennedy
मैंने यह भी पाया है A.splice(0) भी काम करता है - corwin.amber


जिन उत्तरों के पास अब तक 2739 अपवॉट कम नहीं हैं, वे भ्रामक और गलत हैं।

सवाल यह है: "आप अपनी मौजूदा सरणी कैसे खाली करते हैं?" जैसे के लिये A = [1,2,3,4]

  1. कह रही है "A = [] जवाब है "अज्ञानी और बिल्कुल गलत है। [] == [] है असत्य

    ऐसा इसलिए है क्योंकि ये दो सरणी दो अलग-अलग, अलग-अलग वस्तुएं हैं, अपनी दो पहचानों के साथ, डिजिटल दुनिया में अपनी जगह ले रही हैं, प्रत्येक स्वयं ही।


मान लें कि आपकी मां आपको ट्रैश कैन खाली करने के लिए कहती है।

  • आप एक नया नहीं लाते हैं जैसे कि आपने जो किया है उसके लिए आपने जो किया है।
  • इसके बजाय, आप ट्रैश कैन खाली कर सकते हैं।
  • आप भरे हुए व्यक्ति को एक नए खाली कैन के साथ प्रतिस्थापित नहीं करते हैं, और आप भरे हुए कैन से "ए" लेबल नहीं लेते हैं और इसे नए जैसा चिपकाते हैं A = [1,2,3,4]; A = [];

एक सरणी वस्तु खाली करना सबसे आसान बात है:

A.length = 0;

इस तरह, "ए" के तहत केवल खाली नहीं है, बल्कि नए के रूप में भी साफ है!


  1. इसके अलावा, जब तक खाली हो, तब तक आपको हाथ से कूड़े को हटाने की आवश्यकता नहीं है! आपको मौजूदा मोड़ को पूरी तरह से खाली करने के लिए कहा गया था, पूरी तरह से, एक मोड़ में, कचरा लेने के लिए नहीं, जब तक खाली नहीं हो जाता, जैसा कि:

    while(A.length > 0) {
        A.pop();
    }
    
  2. न ही, अपने बाएं हाथ को कचरे के नीचे रखें, इसे अपनी सामग्री को खींचने में सक्षम होने के लिए शीर्ष पर अपने दाएं हाथ से रखें:

    A.splice(0, A.length);
    

नहीं, आपको इसे खाली करने के लिए कहा गया था:

A.length = 0;

यह एकमात्र कोड है जो किसी दिए गए जावास्क्रिप्ट सरणी की सामग्री को सही ढंग से खाली करता है।


61
2018-04-30 15:18



आपके सुझाए गए समाधान के साथ एकमात्र समस्या यह है कि कचरा अभी भी मौजूद है, यह सिर्फ इतना है कि आपने नोटिस बोर्ड को बदल दिया और कहा कि कोई कचरा नहीं है। पुरानी सरणी का संदर्भ अभी भी मौजूद होना चाहिए। क्या आप सुनिश्चित कर सकते हैं कि कंगन कलेक्टर .length = 0 सेट करते समय, सरणी और उसके गुणों के सभी संदर्भों को भी हटा देगा? मुझे लगता है कि यह हालांकि करता है, लेकिन मेरे लिए यह जादू है। A .clear () विधि कम से कम कहने के लिए भ्रम से बचने के लिए वांछनीय है। - momo
मैंने कभी नहीं कहा कि यह समाधान गलत है। समस्या यह है कि यह पूरा धागा पूरी तरह से अनावश्यक है। 3000 से अधिक वोट दिखाते हैं कि यह पता लगाने की कोशिश कर रहा है कि सबसे अच्छा तरीका क्या है कि इसे ईएमसीए क्रैक हेड डेवलपर्स के लिए ऐसी विधि जोड़ने के लिए एक वैध पर्याप्त मामला बनाना चाहिए। इसे समझने के माध्यम से किसी को भी जाना नहीं चाहिए। ऐसा करने के तीन-चार अलग-अलग तरीके हैं। कुछ मानक में, लंबाई समाधान दूसरों की तुलना में बहुत धीमी है। इसके अलावा, किसी भी उचित डेवलपर के लिए .length = 0 सेट करने का विचार संतोषजनक नहीं होगा। - momo
क्योंकि इसे पूरा करने के लिए, सभी संदर्भों को हटा दिया जाना चाहिए। । लम्बाई = 0 भी एक विधि कॉल नहीं है, इसलिए यदि 0 पर सेट होने पर अन्य कार्रवाइयां की जाती हैं (जो कि सेटर को परिभाषित करने के माध्यम से अधिकांश ब्राउज़रों में होती है) तो भी मैं वास्तव में विश्वास करने के लिए बहुत जादुई मानता हूं जो इसे माना जाता है करने के लिए। - momo
इसलिए, मैं इसे खुद को साफ़ करना चाहता हूं। एक स्पष्ट विधि प्रोटोटाइप किया जा सकता है लेकिन यह सिर्फ बदसूरत है। मेरा मुद्दा यह है कि यह कार्यान्वयन पहले से मौजूद होना चाहिए ताकि 10 000 से अधिक डेवलपर्स को केवल इस धागे को पढ़ने में घंटों खर्च न करें, उन सभी लोगों पर विचार न करें जिन्होंने अधिक समय बेंचमार्किंग बिताई। - momo
अपने सरणी को खाली करने का केवल एक ही तरीका है इसे नए आने वाले डेटा से भरें और इसे दोबारा छोड़ दें। अन्य सभी या तो नहीं हैं, या हास्यास्पद रूप से अक्षम और अक्षम्य सीपीयू भूखे हैं। एकमात्र व्यावहारिक विकल्प है A(n) = A.splice( 0, A.length ); यदि आपको अपनी पिछली सामग्री का बैकअप लेने की आवश्यकता है। अनुलेख Array.length यदि आप उस मूल तथ्य को याद करते हैं तो एक पठन-लेखन संपत्ति \ विधि है। मतलब, आप इसे एक नई लंबाई में विस्तारित कर सकते हैं, आप जिस भी लंबाई को चाहते हैं उसे ट्रिम नहीं कर सकते हैं, और दूसरों के बीच आप सभी सदस्यों को अपनी लंबाई को 0 तक छोटा कर सकते हैं। यह सरणी का स्विस-चाकू है। - Bekim Bacaj


प्रदर्शन का परीक्षण:

http://jsperf.com/array-clear-methods/3

a = []; // 37% slower
a.length = 0; // 89% slower
a.splice(0, a.length)  // 97% slower
while (a.length > 0) {
    a.pop();
} // Fastest

59
2018-05-14 07:14



प्रतिशत परिवर्तन जोड़ने से आपके प्लेटफ़ॉर्म को नोट किए बिना अधिक उपयोग नहीं किया जाता है। मेरी मशीन पॉप पर क्रोम 34 में केवल हल्के ढंग से तेज है लेकिन वास्तव में नवीनतम फ़ायरफ़ॉक्स में [] से धीमा है। - Matt Styles
विंडोज एनटी 6.3 64-बिट पर फ़ायरफ़ॉक्स 39.0 32-बिट में परीक्षण, एक = [] सबसे तेज़ है! - Reza-S4
Chrome के तहत इस परीक्षण परिणाम में निश्चित रूप से कुछ ख़राब है। पॉपिंग लूप कितना तेज़ हो सकता है तो अन्य 3 समाधान? - chqrlie
@chqrlie यह नहीं है। यह सबसे धीमी विधि है। बेंचमार्क परीक्षण त्रुटिपूर्ण है। - Philippe Leybaert
कृपया इस उत्तर को गलत के रूप में हटाएं, और नकली साक्ष्य के रूप में एक अर्थहीन दोषपूर्ण परीक्षण के लिंक। - James Wakefield


आप अपने सरणी को "साफ़" होने की अनुमति देने के लिए इसे अपनी जावास्क्रिप्ट फ़ाइल में जोड़ सकते हैं:

Array.prototype.clear = function() {
    this.splice(0, this.length);
};

फिर आप इसे इस तरह इस्तेमाल कर सकते हैं:

var list = [1, 2, 3];
list.clear();

या यदि आप यह सुनिश्चित करना चाहते हैं कि आप कुछ नष्ट नहीं करते हैं:

if (!Array.prototype.clear) {
    Array.prototype.clear = function() {
       this.splice(0, this.length);
    };
}

बहुत से लोग सोचते हैं कि आपको मूल वस्तुओं (जैसे ऐरे) को संशोधित नहीं करना चाहिए, और मैं सहमत हूं। कृपया इसे संभालने का निर्णय लेने में सावधानी बरतें।


32
2017-12-11 02:58



@naomik क्या आप अपने तर्क की व्याख्या कर सकते हैं कि ऐसी चीज क्यों कर रही है? - Undefined
यह ऐरे और स्ट्रिंग जैसे जावास्क्रिप्ट आदिम कार्यों को संशोधित करने के लिए "फहरा हुआ" है। आप संभवतः पहले से मौजूद फ़ंक्शन को अधिभारित कर सकते हैं और ऑब्जेक्ट क्लास को मिटा सकते हैं। एक अस्पष्ट जावास्क्रिप्ट इंजन हो सकता है जो पहले से ही स्पष्ट है () और उम्मीद करता है कि यह एक अलग तरीके से व्यवहार करे। ध्यान से चलना मैं बस इतना कहता हूं। - Design by Adrian
समस्या के बारे में जहां एक सरणी के सदस्यों पर एक foreach कर रहे हैं अचानक एक सहित शुरू हो जाएगा clear कुंजी? - ErikE
संदर्भ के रूप में: देशी वस्तुओं को एक बुरा अभ्यास क्यों बढ़ा रहा है? - Emile Bergeron


Array.prototype.clear = function() {
    this.length = 0;
};

और इसे कॉल करें: array.clear();


16
2018-02-22 21:28



कृपया देशी वस्तुओं के संशोधन को प्रोत्साहित न करें। - user633183
लोगों को स्वीकार्य उत्तर को पकड़ने और इसे प्रोटोटाइप फ़ंक्शन में रखने की प्रवृत्ति क्यों होती है? क्या आप वास्तव में अपनी परियोजनाओं में ऐसा करते हैं? क्या आपके पास प्रोटोटाइप परिवर्धन की एक बड़ी लाइब्रेरी है जिसमें आप प्रत्येक प्रोजेक्ट में शामिल हैं? - nurettin
क्यों नहीं array.length = 0 टाइप करें? - Design by Adrian
@naomik "कृपया देशी वस्तुओं के संशोधन को प्रोत्साहित न करें।" - मैं पूरी तरह से इस से सहमत हूं, लेकिन केवल वाक्य को दोहराकर ही घमंडी के रूप में आता है। इस तरह के समाधान का प्रस्ताव देने वाले किसी व्यक्ति को परिणामों की जानकारी नहीं है, और एक संक्षिप्त स्पष्टीकरण प्रदान करने के बजाय उन पर इस पंक्ति को छोड़ना या एक लिंक अन्य अर्थ नहीं बताता है "हम, आपके से ज्यादा लोग, आपको यह नहीं करने के लिए कहते हैं, क्योंकि हम बेहतर जानते हैं"। - John Weisz
संदर्भ के रूप में: देशी वस्तुओं को एक बुरा अभ्यास क्यों बढ़ा रहा है? - Emile Bergeron


थोड़ी देर के बारे में बहुत भ्रम और गलतफहमी है; उत्तर और टिप्पणियों दोनों में पॉप / शिफ्ट प्रदर्शन। जबकि / पॉप समाधान (अपेक्षित) है सबसे खराब प्रदर्शन। वास्तव में क्या हो रहा है कि सेटअप प्रत्येक नमूने के लिए केवल एक बार चलता है जो एक लूप में स्निपेट चलाता है। उदाहरण के लिए:

var arr = [];

for (var i = 0; i < 100; i++) { 
    arr.push(Math.random()); 
}

for (var j = 0; j < 1000; j++) {
    while (arr.length > 0) {
        arr.pop(); // this executes 100 times, not 100000
    }
}

मैंने एक नया परीक्षण बनाया है जो सही तरीके से काम करता है:

http://jsperf.com/empty-javascript-array-redux

चेतावनी: परीक्षण के इस संस्करण में भी आप वास्तव में वास्तविक अंतर नहीं देख सकते हैं क्योंकि सरणी क्लोनिंग अधिकांश परीक्षण समय लेती है। यह अभी भी दिखाता है कि splice सरणी को साफ़ करने का सबसे तेज़ तरीका है (नहीं लेना [] विचार में क्योंकि यह सबसे तेज़ है जबकि यह वास्तव में मौजूदा सरणी को साफ़ नहीं कर रहा है)।


15
2018-02-16 18:52



बहुत अच्छा मुद्दा! मैं सही बेंचमार्क परिणामों के साथ मूल उत्तर अपडेट करूंगा। - Philippe Leybaert
मुझे विश्वास नहीं है कि कोई भी उस बेंचमार्क त्रुटि को नहीं देखता है। आधे मिलियन से अधिक विचारों के साथ आप किसी को यह नोटिस करने की उम्मीद करेंगे। महान काम Diadistis - Philippe Leybaert


यदि आप स्मृति आवंटन में रूचि रखते हैं, तो आप कुछ दृष्टिकोण का उपयोग करके प्रत्येक दृष्टिकोण की तुलना कर सकते हैं यह jsfiddle क्रोम देव उपकरण 'टाइमलाइन टैब के संयोजन के साथ। सरणी को 'समाशोधन' के बाद कचरा संग्रह को मजबूर करने के लिए आप नीचे कचरा बिन आइकन का उपयोग करना चाहेंगे। यह आपको अपनी पसंद के ब्राउज़र के लिए एक और निश्चित उत्तर देना चाहिए। यहां बहुत सारे उत्तर पुराने हैं और मैं उन पर भरोसा नहीं करता हूं बल्कि उपरोक्त @ tanguy_k के उत्तर में परीक्षण करता हूं।

(उपर्युक्त टैब के लिए एक परिचय के लिए आप जांच सकते हैं यहाँ)

Stackoverflow मुझे jsfiddle की प्रतिलिपि बनाने के लिए मजबूर करता है तो यहां यह है:

<html>
<script>
var size = 1000*100
window.onload = function() {
  document.getElementById("quantifier").value = size
}

function scaffold()
{
  console.log("processing Scaffold...");
  a = new Array
}
function start()
{
  size = document.getElementById("quantifier").value
  console.log("Starting... quantifier is " + size);
  console.log("starting test")
  for (i=0; i<size; i++){
    a[i]="something"
  }
  console.log("done...")
}

function tearDown()
{
  console.log("processing teardown");
  a.length=0
}

</script>
<body>
    <span style="color:green;">Quantifier:</span>
    <input id="quantifier" style="color:green;" type="text"></input>
    <button onclick="scaffold()">Scaffold</button>
    <button onclick="start()">Start</button>
    <button onclick="tearDown()">Clean</button>
    <br/>
</body>
</html>

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


14
2017-12-11 23:19





A.splice(0);

मैंने बस कुछ कोड पर ऐसा किया है जिस पर मैं काम कर रहा हूं। यह सरणी को मंजूरी दे दी।


10
2018-01-29 19:24



नहीं, आपने अभी एक नामित सरणी कंटेनर को नए बनाए गए अनाम वाले के साथ बदल दिया है। `var ए = [1,2,3,4]; var बी; बी = एस्प्लिस (0); console.log (ए); console.log (बी); ' - Bekim Bacaj