18 Soru: Bir diziyi JavaScript'te nasıl boşaltabilirim?

tarafından oluşturulan soru Wed, Nov 11, 2015 12:00 AM

Bir diziyi boşaltmanın bir yolu var mı ve eğer varsa .remove() ile olabilir mi?

Örneğin,

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

Bunu nasıl boşaltabilirim?

    
2199
  1. burada farklı olasılıklara sahip bir kıyaslama noktası: jsben.ch/# /7QyI1
    2016-10-24 16: 17: 18Z
18 Yanıtlar                              18                         

Mevcut bir A dizisini temizleme yolları:

Yöntem 1

(bu soruya verdiğim asıl cevabımdı)

 
A = [];

Bu kod A değişkenini yeni bir boş diziye ayarlayacaktır. Bu, gerçekten de yepyeni (boş) bir dizi oluşturduğundan, A numaralı orijinal diziye referanslarınız yoksa mükemmeldir. Bu yönteme dikkat etmelisiniz, çünkü bu diziye başka bir değişken veya özellikten başvurduysanız, orijinal dizi değişmeden kalacaktır. Bunu, yalnızca diziye yalnızca A orijinal değişkeniyle başvurursanız kullanın.

Bu aynı zamanda en hızlı çözümdür.

Bu kod örneği, bu yöntemi kullanırken karşılaşabileceğiniz sorunu gösterir:

 
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']

Yöntem 2 ( önerildiği şekilde .com /kullanıcılar /2214 /matthew-crumley "> Matthew Crumley )

 
A.length = 0

Bu, uzunluğunu 0 olarak ayarlayarak varolan diziyi temizleyecektir. Bazıları bunun tüm JavaScript uygulamalarında çalışmayabileceğini, ancak durumun böyle olmadığını ortaya koydu. ECMAScript 5'te "katı mod" kullanılırken de çalışır, çünkü bir dizinin uzunluk özelliği bir okuma /yazma özelliğidir.

Yöntem 3 ( önerildiği şekilde) .com /kullanıcılar /1047275 /Anthony "> Anthony )

 
A.splice(0,A.length)

.splice()'u kullanmak mükemmel çalışır, ancak .splice() işlevi kaldırılan tüm öğelerin bulunduğu bir dizi döndüreceğinden, aslında orijinal dizinin bir kopyasını döndürür. Karşılaştırmalar bunun performans üzerinde hiçbir etkisi olmadığını göstermektedir.

Yöntem 4 ( tanguy_k )

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

Bu çözüm çok özlü değildir ve ayrıca orijinal cevabında referans verilen önceki kriterlere aykırı olarak en yavaş çözümdür.

Performans

varolan diziyi temizlemenin tüm yöntemleri arasında, yöntem 2 ve 3 performansta çok benzer ve yöntem 4'ten çok daha hızlıdır. = "http://jsben.ch/#/hyj65" rel = "noreferrer"> kriter .

Diadistis tarafından belirtildiği gibi /113570 "> cevap , yukarıda tarif edilen dört yöntemin performansını belirlemek için kullanılan orijinal kriterler kusurludur. Orijinal kıyaslama temizlenen diziyi yeniden kullandı, böylece ikinci yineleme zaten boş bir diziyi temizliyordu.

Aşağıdaki kriter bu açığı düzeltir: http://jsben.ch/#/hyj65 . # 2 (length özelliği) ve # 3 (splice) yöntemlerinin en hızlı olduğunu açıkça gösteriyor (orijinal diziyi değiştirmeyen 1 numaralı yöntemi değil).


Bu sıcak bir konu ve çok fazla tartışmanın nedeni oldu. Aslında birçok doğru cevap var ve bu cevap çok uzun zamandır kabul edilen cevap olarak işaretlendiğinden, tüm yöntemleri buraya ekleyeceğim. Bu cevaba oy verirseniz, lütfen referans aldığım diğer cevapları da iptal edin.

    
3930
2017-05-23 12: 34: 51Z
  1. while (A.length) { A.pop(); }, > 0'a gerek yok
    2014-08-08 12: 41: 44Z
  2. > 0 daha okunaklı IMHO. Ve ikisi arasında hiçbir performans farkı yok.
    2014-08-08 19: 46: 55Z
  3. @ daghan, ne söylemeye çalıştığınız belli değil. b, a yeni bir atadıktan sonra bile eski diziye referansta bulunur. c ve d aynı diziye başvurmaya devam ediyor. Bu nedenle çıktılardaki fark bekleniyor.
    2014-08-17 08: 03: 34Z
  4. @ DiegoJancic Yöntem # 1, diziyi temizlememesi nedeniyle saymıyor. Yeni bir tane yaratır. Bir kıyaslamaya dahil edilmemelidir.
    2014-11-07 14: 15: 21Z
  5. Dizideki bir öğenin falsey olması durumunda while(A.pop())'u kullanamazsınız. Örneğin, A = [2, 1, 0, -1, -2], A [2, 1] 'e eşit sonuç verecektir. while(A.pop() !== undefined) bile çalışmıyor, çünkü değerlerden biri olarak tanımsız bir diziye sahip olabilirsiniz. Muhtemelen derleyici neden onu optimize etmedi.
    2015-01-09 01: 29: 46Z

Özgün diziyi saklamanız gerekiyorsa, güncelleştirilmesi gereken başka başvurularınız da varsa, uzunluğunu sıfıra ayarlayarak yeni bir dizi oluşturmadan temizleyebilirsiniz:

 
A.length = 0;
    
2351
2011-12-01 23: 35: 59Z
  1. @ Acorn Evet, tüm tarayıcılarda çalışacaktır.
    2011-05-10 22: 01: 37Z
  2. ECMAScript 5 Standard bu konuda ne diyor?
    2011-06-21 07: 00: 03Z
  3. @ Pacerier: Hala ES5'te çalışıyor. Bölüm 15.4'ten: "... uzunluk özelliği ne zaman değiştirilirse, adı yeni uzunluktan küçük olmayan bir dizi dizini olan her özellik otomatik olarak silinir"
    2011-06-21 07: 43: 57Z
  4. @ LosManos Sıkı modda bile, length özel bir özelliktir, ancak yalnızca okunmaz, bu yüzden çalışmaya devam eder.
    2013-01-04 14: 18: 50Z
  5. @ MattewCrumley Bazı testler yaptım ve a.length = 0 gibi göründüğü gibi tüm diziyi etkin bir şekilde temizlemiyor gibi görünüyor. jsperf.com/length-equal-0-or-new-array Tek bir sınırlamanız varsa (ve saklamak istediğiniz ilave özellikler eklememişseniz), yeni bir dizi oluşturmak daha iyidir ve uygun olduğunda çalışacak olan çöp toplayıcıya eski kalıyor.
    2013-11-16 19: 08: 45Z

Burada en hızlı çalışan uygulama , aynı diziyi tutarken ("değiştirilebilir"):

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

FYI, while (array.pop()) ile basitleştirilemez: testler başarısız olur.

FYI Harita ve clear() tanımla, Ayarla Dizi için clear()’a sahip olmak mantıklı görünüyor de.

TypeScript sürümü:

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

İlgili testler:

 
describe('clearArray()', () => {
  test('clear regular array', () => {
    const array = [1, 2, 3, 4, 5];
    clearArray(array);
    expect(array.length).toEqual(0);
    expect(array[0]).toEqual(undefined);
    expect(array[4]).toEqual(undefined);
  });

  test('clear array that contains undefined and null', () => {
    const array = [1, undefined, 3, null, 5];
    clearArray(array);
    expect(array.length).toEqual(0);
    expect(array[0]).toEqual(undefined);
    expect(array[4]).toEqual(undefined);
  });
});

İşte güncellenmiş jsPerf: http://jsperf.com/array-destroy/32 http://jsperf.com/array-yok /152

    
271
2019-03-11 10: 12: 43Z
  1. TT cevabınız doğru ve hızlı olan (aynı zamanda) ancak biraz daha "" oylanan "tek cevap. Öyle görünüyor ki, insanlar yavaş olan güzel çözümleri severler: /
    2013-06-26 05: 09: 59Z
  2. @ naomik Ancak bu, varsayılan olarak orada olması gereken temel işlevlerden biridir.
    2013-08-19 04: 43: 21Z
  3. @ thefourtheye Performans için iyi bir çözüm, @ naomik ile aynı fikirdeyim, ancak yerel nesneleri değiştirmemelisiniz. Meselenin yanında olması gerektiğini söyleyen sorun, küreselleri değiştiriyor olmanız, ki bu kötü. Kodunuzu başkalarının kullanması için veriyorsanız, öngörülemeyen yan etkileri olmamalıdır. Başka bir kitaplığın ayrıca Array.prototype'u değiştirip değiştirmediğini ve bunun biraz farklı bir şey yaptığını hayal edin, o zaman [].clear() kodunuzun tamamı boyunca biraz yanlıştı. Bu hata ayıklamak için eğlenceli olmazdı. Bu nedenle, genel ileti şudur: Globalleri değiştirmeyin.
    2013-09-14 10: 39: 33Z
  4. @ thefourtheye Genel kapsamı değiştirmemenin asıl amacı, bir başkasının kodu zaten varsa (veya olacaksa), bilmeyeceğiniz olmasıdır. adını kullanarak. Yerel kapsamda bir işlev öneririm. Bu nedenle, uygulamanızın /kütüphanesinin IIFE içinde function clear(arr) { while(arr.length) arr.pop(); } yapın, ardından clear(arr) ile dizileri temizleyin. arr.clear()’un.
    2013-09-15 04: 58: 22Z
  5. Bu yöntemin .splice() ve .length=0'dan çok daha yavaş olduğu ortaya çıktı. Kriterler doğru değildi. Güncellenmiş cevabımı gör.
    2015-02-17 01: 30: 59Z

Daha çapraz tarayıcı dostu ve daha uygun bir çözüm, A dizisinin içeriğini aşağıdaki gibi boşaltmak için splice yöntemini kullanmak olacaktır:

A.splice(0, A.length);

    
199
2012-02-26 22: 28: 36Z
  1. Neden bu tarayıcılar arası daha kolay? Hangi tarayıcılarda A.length ile sorunları var?
    2011-11-21 15: 12: 04Z
  2. @ jm2 söyledikleriniz tamamen doğru değil. Aslında söz konusu diziyi değiştirir ve ardından tüm referanslar etkilenir. JsFiddle'ımdaki teste bakın: jsfiddle.net/shamasis/dG4PH
    2012-09-26 12: 38: 21Z
  3. @ alex hayır, hayır, splice diziyi değiştirir ve silinen girdileri döndürür. Önce dokümanları okuyun: developer.mozilla.org/tr -ABD /docs /JavaScript /Referans /...
    2012-10-29 16: 22: 18Z
  4. Elde edilen dizinin virgül operatörü : A.splice(0, A.length),0;. Bu, 0'un vereceği gibi A.length = 0;'luk bir getiri değeri bırakacaktır. Sonuçta ortaya çıkan dizi hala yaratılır ve betiğin daha yavaş çalışmasına neden olur: ( jsperf ~% 56 daha yavaş). Tarayıcı uygulaması bunu etkileyecek, ancak splice'un length'u ayarlamaktan daha hızlı olması için hiçbir neden göremiyorum.
    2013-08-18 03: 47: 08Z
  5. Sadece A.splice(0)'un da çalıştığını gördüm.
    2014-12-04 17: 49: 13Z

Şu ana kadar 2739 en az oy alan cevaplar yanıltıcı ve yanlıştır.

Soru şudur: "Mevcut dizinizi nasıl boşaltırsınız?" Örneğin. A = [1,2,3,4] için.

  1. "A = [] cevaptır" demek cahil ve kesinlikle yanlıştır. [] == [] yanlıştır .

    Bunun nedeni, bu iki dizinin, her biri kendi başına olan dijital dünyadaki kendi alanını kaplayan, kendi iki kimlikleri olan, birbirinden ayrı iki ayrı nesne olmasıdır.


Diyelim ki annen çöp tenekesini boşaltmanı istiyor.

  • İstediğiniz şeyi yaptınız gibi yeni bir tane getirmediniz.
  • Bunun yerine, çöp tenekesini boşaltırsınız.
  • Doldurulmuş kutuyu yeni bir boş kutu ile değiştirmeyin ve "A" etiketini doldurulmuş kutudan alamaz ve A = [1,2,3,4]; A = [];'da olduğu gibi yenisine yapıştırırsınız.

Bir dizi nesnesini boşaltmak, şimdiye kadarki en kolay şeydir:

 
A.length = 0;

Bu şekilde, "A" altındaki kutu yalnızca boş değil, aynı zamanda yeni olduğu kadar temiz!


  1. Ayrıca, çöp kutusu boşalıncaya kadar elle çıkarmanız gerekmez! Mevcut olanı bir kerede tamamen boşaltmanız istendi, sırayla boşaltılana kadar çöpleri almamanız istendi:

     
    while(A.length > 0) {
        A.pop();
    }
    
  2. Ayrıca, sol elinizi çöpün altına koymak, içeriğini olduğu gibi dışarı çıkarabilmek için sağ üstte tutarken:

     
    A.splice(0, A.length);
    

Hayır, sizden boşaltmanız istendi:

 
A.length = 0;

Bu, belirli bir JavaScript dizisinin içeriğini doğru şekilde boşaltan tek koddur.

    
78
2017-08-05 20: 20: 09Z
  1. Önerilen çözümünüzle ilgili tek sorun, çöpün hala var olması, ilan panosunun hiçbir çöp olmadığını söylemesidir. Eski diziye bir başvuru hala mevcut olmalıdır. Çöp toplayıcısının .length = 0 değerini ayarlarken, diziye ve özelliklerine yapılan tüm başvuruları da kaldıracağından emin misiniz? Bence öyle ama sanırım bu sihir. Az söylemek zorluğun önüne geçmek için bir .clear () yöntemi istenir.
    2016-08-15 09: 52: 04Z
  2. Bu çözümün yanlış olduğunu asla söylemedim. Sorun, bu iş parçacığının tamamen gereksiz olmasıdır. 3000'den fazla oy, en iyi yolun ne olduğunu anlamaya çalışmanın EMCA çatlak geliştirme uzmanlarının böyle bir yöntem eklemesi için yeterince geçerli bir durum olması gerektiğini gösteriyor. Kimse bunu çözmek zorunda kalmamalı. Bunu yapmanın üç dört yolu var. Bazı kriterlerde, uzunluk çözümleri diğerlerinden çok daha yavaştır. Ayrıca, makul bir geliştirici için .length = 0 değerini ayarlama fikri tatmin edici olmayacaktır.
    2016-08-15 14: 40: 37Z
  3. Ne yapılması gerektiğine bağlı olarak, tüm referanslar kaldırılmalıdır. .length = 0 bir yöntem çağrısı bile değildir, bu yüzden 0 olarak ayarlandığında yapılan diğer eylemler varsa (ki bu, setter'ı tanımlayıcı aracılığıyla çoğu tarayıcıda bulunur), aslında ne gerekiyorsa yapması gerektiğine güvenmesi için çok büyülü olacağını düşünüyorum. yapmak için.
    2016-08-15 14: 43: 39Z
  4. Bu nedenle, kendim temizlemeyi tercih ederim. Net bir yöntem prototipleştirilebilir ancak bu çok çirkindir. Demek istediğim şu ki, bu uygulama zaten mevcut olmalı, böylece 10.000'den fazla geliştirici, daha fazla zaman kıyaslaması yapan diğerlerini göz önünde bulundurmadan, sadece bu konuyu okumak için saat harcamak zorunda kalmadı.
    2016-08-15 14: 47: 34Z
  5. dizinizi boşaltmak için yeni gelen verileri doldurup yeniden atmanın tek bir yolu var. Diğerleri ya değil, ya da gülünç verimsiz ve affedilmez cpu aç. Pratik olan tek seçenek A(n) = A.splice( 0, A.length );’dur;ious içerik. Not; Array.length Bu temel gerçeği kaçırmanız durumunda okuma-yazma özelliği \yöntemidir. Yani, onu yeni bir uzunluğa genişletebilirsin, istediğin uzunluğa kadar kesemezsin, diğerleri arasında ise uzunluğunu 0'a kadar kısaltarak tüm üyelerini atabilirsin. Bu, dizinin İsviçre bıçağı.
    2016-08-15 18: 34: 15Z

Performans testi:

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
    
61
2015-11-11 19: 41: 42Z
  1. Yüzde değişikliklerini eklemek, platformunuzu da belirtmeden fazla kullanılmaz. Makinemde pop, Chrome 34'te yalnızca çok daha hızlı, ancak aslında en son Firefox'ta [] öğesinden daha yavaş.
    2014-05-15 10: 56: 02Z
  2. Windows NT 6.3 64-bit'te Firefox 39.0 32-bit'te test etme 64-bit, a = [] en hızlı!
    2015-04-15 08: 59: 40Z
  3. Chrome'da bu test sonucunda kesinlikle balık bir şey var. Patlama döngüsü ne kadar cehennemde diğer 3 çözümden daha hızlı olabilir?
    2016-01-30 00: 48: 24Z
  4. @ chqrlie Öyle değil. Bu en yavaş yöntem. Kriter testi hatalı.
    2016-11-17 04: 13: 55Z
  5. Lütfen bu cevabı yanlış olduğu için silin ve anlamsız kusurlu bir teste sahte kanıt olarak bağlanın.
    2017-05-08 05: 35: 48Z

Dizilerinizin "silinmesine" izin vermek için bunu JavaScript dosyanıza ekleyebilirsiniz:

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

Ardından bu şekilde kullanabilirsiniz:

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

Veya bir şeyi mahvetmediğinizden emin olmak istiyorsanız:

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

Birçok insan yerel nesneleri (Array gibi) değiştirmemeniz gerektiğini düşünüyor ve ben de aynı fikirdeyim. Lütfen bunun nasıl kullanılacağına karar verirken dikkatli olun.

    
35
2014-09-24 18: 02: 03Z
  1. @ naomik Böyle bir şeyi yapmanın neden kaşlarını çattığının nedenini açıklayabilir misiniz?
    2013-09-16 16: 24: 40Z
  2. Array ve String gibi javascript ilkel işlevlerini değiştirmek için "kaşlarını çattı". Zaten var olan bir işlevi aşırı yükleyebilir ve nesne sınıfını çöpe atabilirsiniz. Zaten clear () değerine sahip ve farklı bir şekilde davranmasını bekleyen gizli bir javascript motoru olabilir. Dikkatli bir şekilde basmak tüm söylediklerim.
    2014-03-25 15: 20: 29Z
  3. Bir dizinin üyeleri üzerinde foreale işlem yapmanın aniden clear anahtar dahil olmak üzere aniden başlayacağı soruna ne dersiniz?
    2015-08-14 00: 00: 38Z
  4. 2017-09-12 16: 03: 21Z

Süre ile ilgili çok fazla kafa karışıklığı ve yanlış bilgi var; cevaplarda ve yorumlarda pop /shift performansı. While /pop çözümü (beklenildiği gibi) en kötü performansa sahip. Gerçekte ne olduKurulum, snippet'i bir döngüde çalıştıran her örnek için yalnızca bir kez çalışır. örneğin:

 
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
    }
}

Doğru çalışan yeni bir test oluşturdum:

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

Uyarı: testin bu sürümünde bile gerçek farkı göremezsiniz, çünkü diziyi klonlamak test süresinin çoğunu kaplar. Yine de splice'un diziyi temizlemenin en hızlı yolu olduğunu gösterir ([]'u dikkate almaz çünkü en hızlı olduğu halde gerçekte varolan diziyi temizlemez).

    
17
2015-02-16 19: 03: 58Z
  1. Çok iyi nokta! Orijinal cevabı doğru kıyaslama sonuçlarıyla güncelleyeceğim.
    2015-02-16 23: 50: 43Z
  2. Kimsenin bu kıyaslama hatasını tespit edemediğine inanamıyorum. Yarım milyondan fazla görüşle birisinin bunu fark etmesini beklersiniz. Harika iş Diadistis
    2015-02-17 00: 15: 43Z

Bellek ayırma ile ilgileniyorsanız, her bir yaklaşımı chrome dev araçlarıyla birlikte bu jsfiddle gibi bir şey kullanarak karşılaştırabilirsiniz. 'zaman çizelgesi sekmesi. Diziyi 'temizledikten sonra' bir çöp toplama işlemini zorlamak için alttaki çöp kutusu simgesini kullanmak isteyeceksiniz. Bu size seçtiğiniz tarayıcı için daha kesin bir cevap verecektir. Buradaki cevapların çoğu eski ve ben onlara güvenmiyordum, ancak yukarıdaki @ tanguy_k'ın cevabındaki gibi test ettim.

(yukarıda belirtilen sekmeye giriş için burada )

Stackoverflow, beni jsfiddle'ı kopyalamaya zorlar, işte burada:

 
<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>

Ayrıca javascript, nesneleri dizilerden bahsetmek yerine, diğer ilkel türlerden farklı şekilde dizeleri yönettiğinden, dizi öğelerinin türüne bağlı olabileceğini unutmayın. Tür, olanları etkileyebilir.

    
14
2013-12-11 23: 19: 59Z
 
Array.prototype.clear = function() {
    this.length = 0;
};

Arayın: array.clear();

    
14
2017-11-16 08: 15: 55Z
  1. Lütfen yerel nesnelerin değiştirilmesini teşvik etmeyin.
    2013-07-07 06: 53: 01Z
  2. insanlar neden kabul edilen cevabı alıp bir prototip işlevine sokma eğilimine sahipler? Bunu gerçekten projelerinizde yapıyor musunuz? Her projeye dahil ettiğiniz büyük bir prototip ilavesi kütüphaneniz var mı?
    2013-11-29 11: 05: 52Z
  3. Neden sadece array.length = 0 yazmıyorsunuz?
    2014-03-25 15: 24: 00Z
  4. @ naomik "Lütfen yerel nesnelerin değiştirilmesini teşvik etmeyin." - Buna tamamen katılıyorum, ancak cümleyi tekrar ediyorum tek başına kibirli olarak karşımıza çıkar. Böyle bir çözümü öneren biri muhtemelen sonuçların farkında değildir ve kısa bir açıklama veya bir bağlantı sağlamak yerine bu çizgiyi üzerlerine bırakmak, biz, sizden daha zeki insanları söylememekten başka bir şey ifade etmiyor. Bunu yapın, çünkü daha iyisini biliyoruz ".
    2016-12-11 11: 20: 06Z
  5. 2017-09-12 16: 02: 49Z

A.splice(0);

Bunu sadece üzerinde çalışıyorum bazı kodlarla yaptım. Diziyi temizledi.

    
11
2014-01-29 19: 47: 09Z
  1. Hayır, yeni oluşturulmuş anonim bir adla adlandırılmış bir dizi konteynerini değiştirdiniz. `var A = [1,2,3,4]; var B; B = A. splice (0); console.log (A); console.log (B); '
    2016-11-09 08: 25: 34Z

kullanıyorsanız

 
a = []; 

Ardından, a'daki bir referans başka bir değişkene atanmışsa, a'ya yeni dizi referansı atarsınız, o zaman bu diziyi de boşalmaz ve dolayısıyla çöp toplayıcı bu belleği toplamaz.

Örn.

 
var a=[1,2,3];
var b=a;
a=[];
console.log(b);// It will print [1,2,3];

veya

 
a.length = 0;

a.length'u belirlediğimizde, dizinin sınırlarını sıfırlıyoruz ve geri kalan dizi öğelerinin çöp toplayıcı tarafından bağlanacağı bellek belleği.

Bu iki çözüm yerine daha iyidir.

 
a.splice(0,a.length)

ve

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

kenshou.html tarafından verilen önceki cevaba göre, ikinci yöntem daha hızlıdır.

    
10
2018-01-18 11: 36: 29Z
  1. a.length'da yanlış olmasının dışında, bu yeni cevabın konuya ne eklediğini görmüyorum?
    2014-12-01 14: 33: 05Z
  2. @ Bergi Dizi ile ilgili gerçek bellek gösterimi üzerinde durmak istiyorum
    2014-12-02 09: 30: 55Z
  3. a.length=0; gerçekleştirildiğinde hangi JS motorlarının yeni bir dizi oluşturacağını onaylamak için herhangi bir kaynağınız var mı? Bu motorlar a.length=500; ve a.length=4; için nasıl davranırlar?
    2014-12-13 18: 38: 53Z
  4. IE, Firefox, Chrome gibi çoğu tarayıcıda denedim, yeni bir dizi oluşturuyor. Uzunluğu 0'dan büyük olarak ayarlarsanız, tanımlanmamış öğelere sahip bir dizi oluşturur, yani yalnızca bazı bellek konumlarını tutar.
    2014-12-16 15: 21: 07Z
  5. var a = [1]; var b = a; a.length = 0; console.log(b), Array [ ]’u yazdırıyor, bu yüzden bana yeni bir dizi oluşturuyor gibi görünmüyor.
    2017-09-15 19: 10: 48Z

Bunu yapmak için kolayca bir işlev oluşturabilir, uzunluğu değiştirebilir veya hatta yeniden kullanmak için remove() işlevi olarak yerel Dizi 'yi ekleyebilirsiniz.

Bu dizinin sizde olduğunu hayal edin:

 
var arr = [1, 2, 3, 4, 5]; //the array

Tamam, sadece şunu çalıştırın:

 
arr.length = 0; //change the length

ve sonuç:

 
[] //result

bir diziyi boşaltmanın kolay yolu ...

Ayrıca gerekli olmayan bir döngü kullanarak ancak bunu yapmanın başka bir yolunu kullanın:

 
/* could be arr.pop() or arr.splice(0)
don't need to return as main array get changed */

function remove(arr) {
  while(arr.length) {
    arr.shift(); 
  }
}

Bunun gibi düşünebileceğiniz zor bir yol da var, örneğin şunun gibi:

 
arr.splice(0, arr.length); //[]

Eğer arr 5 maddeye sahipse, 0'dan 5 maddeye eklenir, yani dizide hiçbir şey kalmaz.

Ayrıca, örneğin diziyi yeniden atamak gibi başka yollar da olabilir:

 
arr = []; //[]

Dizi işlevlerine bakarsanız, bunu yapmanın başka yolları da vardır, ancak en çok önerileni uzunluğu değiştirmek olabilir.

Dediğim gibi, sorunuzun cevabı olarak remove () prototipini de kullanabilirsiniz. yukarıdaki yöntemlerden birini seçip, JavaScript içindeki Array nesnesine prototip yapabilirsiniz:

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

javascript uygulamanızdaki herhangi bir diziyi boşaltmak için basitçe bu şekilde çağırabilirsiniz:

 
arr.remove(); //[]
    
9
2018-08-02 13: 15: 27Z
üniv>

Jan 'in ilk önerisini değiştirilmiş bir sürümünü kullanın:

 
var originalLength = A.length;
for (var i = originalLength; i > 0; i--) {
     A.pop();
}
    
8
2017-05-23 12: 26: 36Z
  1. Neden böyle bir şey yapmak istersiniz? Aynı şeyi yapmak için neden iki değişken daha ve bir sürü kod ekleyin?
    2014-09-14 22: 51: 03Z

Sabitleri kullanırsanız başka seçeneğiniz yoktur:

 
const numbers = [1, 2, 3]

Yeniden atayamazsınız:

 
numbers = []

Yalnızca kesebilirsiniz:

 
numbers.length = 0
    
5
2017-02-23 00: 39: 28Z

Henüz kimsenin bunu önermediğine şaşırdım:

 
let xs = [1,2,3,4];
for (let i in xs)
    delete xs[i];

Bu, diğer çözümlerden oldukça farklı bir durumda bir dizi verir. Bir anlamda, dizi 'boşaltıldı':

 
xs
=> Array [ <4 empty slots> ]

[...xs]
=> Array [ undefined, undefined, undefined, undefined ]

xs.length
=> 4

xs[0]
=> ReferenceError: reference to undefined property xs[0]

[,,,,] veya Array(4) ile eşdeğer bir dizi oluşturabilirsiniz

    
3
2017-03-03 08: 02: 01Z
  1. Farklı bir soruya iyi bir cevap olabilir: "Dizideki tüm öğeler tanımsız öğelere nasıl dönüştürülür".
    2017-03-25 18: 54: 58Z

 buraya resim açıklamasını girin

Bir dizinin Geçerli bellek konumunu boşaltmak için şunu kullanın: 'myArray.length = 0' veya 'myArray.pop() UN-till its length is 0'

  • length : Herhangi bir zamanda bir diziyi kesecek uzunluk özelliği. Bir diziyi uzunluk özelliğini değiştirerek genişlettiğinizde, gerçek öğelerin sayısı artar.
  • pop() : Pop yöntemi kaldırılır bir dizideki son öğe ve kaldırılan değeri döndüren döner.
  • shift() : Vardiya yöntemi kaldırılır sıfır dizininde öğe ve ardışık dizinlerdeki değerleri aşağı kaydırır, ardından kaldırılan değeri döndürür.

Örnek:

 
var arr = ['77'];
arr.length = 20;
console.log("Increasing : ", arr); // (20) ["77", empty × 19]
arr.length = 12;
console.log("Truncating : ", arr); // (12) ["77", empty × 11]

var mainArr = new Array();
mainArr = ['1', '2', '3', '4'];

var refArr = mainArr;
console.log('Current', mainArr, 'Refered', refArr);

refArr.length = 3;
console.log('Length: ~ Current', mainArr, 'Refered', refArr);

mainArr.push('0');
console.log('Push to the End of Current Array Memory Location \n~ Current', mainArr, 'Refered', refArr);

mainArr.poptill_length(0);
console.log('Empty Array \n~ Current', mainArr, 'Refered', refArr);

Array.prototype.poptill_length = function (e) {
  while (this.length) {
    if( this.length == e ) break;

    console.log('removed last element:', this.pop());
  }
};

  • new Array() | [] Oluştur Array constructor veya array literal'u kullanarak yeni bellek konumuna sahip bir Dizi.

     
    mainArr = []; // a new empty array is addressed to mainArr.
    
    var arr = new Array('10'); // Array constructor
    arr.unshift('1'); // add to the front
    arr.push('15'); // add to the end
    console.log("After Adding : ", arr); // ["1", "10", "15"]
    
    arr.pop(); // remove from the end
    arr.shift(); // remove from the front
    console.log("After Removing : ", arr); // ["10"]
    
    var arrLit = ['14', '17'];
    console.log("array literal « ", indexedItem( arrLit ) ); // {0,14}{1,17}
    
    function indexedItem( arr ) {
        var indexedStr = "";
        arr.forEach(function(item, index, array) {
            indexedStr += "{"+index+","+item+"}";
            console.log(item, index);
        });
        return indexedStr;
    }
    
  • slice() : Dilim işlevini kullanarak, orijinal diziden elementlerin sığ bir kopyasını alıyoruz, yeni bellek adresiyle, Böylece cloneArr üzerindeki herhangi bir değişiklik gerçek bir | orijinal diziye etki etmeyecek.

     
    var shallowCopy = mainArr.slice(); // this is how to make a copy
    
    var cloneArr = mainArr.slice(0, 3); 
    console.log('Main', mainArr, '\tCloned', cloneArr);
    
    cloneArr.length = 0; // Clears current memory location of an array.
    console.log('Main', mainArr, '\tCloned', cloneArr);
    
3
2017-11-29 12: 54: 47Z
  1. "length: Bir dizinin uzunluğu Belirtilen Boyutta olana kadar açılır." Sana bu saçmalığı kim söyledi?
    2016-11-13 11: 09: 21Z
  2. @ BekimBacaj Özünde, aynı etkiyi yapar. Muhtemelen 49 söylemeliydiSadece length = ? yerine 310.
    2017-01-09 14: 53: 22Z
  3. @ BekimBacaj cevabımı güncelledim, sadece uzunluğun boyuna kadar çıkacağını varsaydım, ancak şimdi bu uzunluk sadece bir dizinin boyutunu küçültür veya arttırıyor düzelttim.
    2017-11-29 12: 57: 42Z

Angular 2+ FormArray öğesini boşaltmanız gerekirse, aşağıdan kullanın.

 length     
- 7
2017-05-11 17: 28: 28Z
  1. Bu alakasız ve hatta JavaScript değil.
    2017-09-12 16: 13: 32Z
public emptyFormArray(formArray:FormArray) {
    for (let i = formArray.controls.length - 1; i >= 0; i--) {
        formArray.removeAt(i);
    }
}
kaynak yerleştirildi İşte