Bagaimana cara mengosongkan array dalam JavaScript?

2197

Apakah ada cara untuk mengosongkan array dan jika mungkin dengan .remove()?

Contohnya,

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

Bagaimana saya bisa mengosongkannya?

akano1
sumber
1
di sini patokan dengan berbagai kemungkinan: jsben.ch/#/7QyI1
EscapeNetscape

Jawaban:

4415

Cara menghapus array yang ada A:

Metode 1

(ini adalah jawaban asli saya untuk pertanyaan itu)

A = [];

Kode ini akan mengatur variabel Ake array kosong baru. Ini sempurna jika Anda tidak memiliki referensi ke array asli diA tempat lain karena ini benar-benar menciptakan array baru (kosong). Anda harus berhati-hati dengan metode ini karena jika Anda telah mereferensikan array ini dari variabel atau properti lain, array asli akan tetap tidak berubah. Hanya gunakan ini jika Anda hanya mereferensikan array dengan variabel aslinya A.

Ini juga solusi tercepat.

Contoh kode ini menunjukkan masalah yang dapat Anda temui saat menggunakan metode ini:

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

Metode 2 (seperti yang disarankan oleh Matthew Crumley )

A.length = 0

Ini akan menghapus array yang ada dengan menetapkan panjangnya ke 0. Beberapa berpendapat bahwa ini mungkin tidak bekerja di semua implementasi JavaScript, tetapi ternyata ini bukan masalahnya. Ini juga berfungsi ketika menggunakan "mode ketat" di ECMAScript 5 karena properti panjang array adalah properti baca / tulis.

Metode 3 (seperti yang disarankan oleh Anthony )

A.splice(0,A.length)

Menggunakan .splice()akan bekerja dengan sempurna, tetapi karena .splice()fungsi akan mengembalikan array dengan semua item yang dihapus, itu sebenarnya akan mengembalikan salinan dari array asli. Tingkatan yang dicapai menunjukkan bahwa ini tidak mempengaruhi kinerja apa pun.

Metode 4 (seperti yang disarankan oleh tanguy_k )

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

Solusi ini tidak terlalu ringkas, dan juga solusi paling lambat, bertentangan dengan tolok ukur sebelumnya yang dirujuk dalam jawaban asli.

Performa

Dari semua metode pembersihan array yang ada , metode 2 dan 3 sangat mirip dalam kinerjanya dan jauh lebih cepat daripada metode 4. Lihat benchmark ini .

Seperti yang ditunjukkan oleh Diadistis dalam jawaban mereka di bawah ini, tolok ukur asli yang digunakan untuk menentukan kinerja empat metode yang dijelaskan di atas cacat. Benchmark asli menggunakan kembali array yang telah dihapus sehingga iterasi kedua membersihkan sebuah array yang sudah kosong.

Tolok ukur berikut memperbaiki kekurangan ini: http://jsben.ch/#/hyj65 . Ini jelas menunjukkan bahwa metode # 2 (properti panjang) dan # 3 (sambatan) adalah yang tercepat (tidak menghitung metode # 1 yang tidak mengubah array asli).


Ini telah menjadi topik hangat dan menjadi penyebab banyak kontroversi. Sebenarnya ada banyak jawaban yang benar dan karena jawaban ini telah ditandai sebagai jawaban yang diterima untuk waktu yang sangat lama, saya akan memasukkan semua metode di sini. Jika Anda memilih jawaban ini, harap jawab dengan jawaban lain yang telah saya referensikan juga.

Philippe Leybaert
sumber
184
while (A.length) { A.pop(); }, tidak perlu untuk> 0
Ivan Black
327
> 0IMHO lebih mudah dibaca. Dan tidak ada perbedaan kinerja antara keduanya.
Philippe Leybaert
10
@daghan, sama sekali tidak jelas apa yang ingin Anda katakan. bmemegang referensi ke array lama bahkan setelah aditugaskan yang baru. cdan dterus referensi array yang sama. Oleh karena itu perbedaan dalam output diharapkan.
shovavnik
9
@DiegoJancic Method # 1 tidak masuk hitungan karena tidak menghapus array. Itu menciptakan yang baru. Seharusnya tidak dimasukkan dalam patokan.
Philippe Leybaert
44
Anda tidak dapat menggunakan while(A.pop())jika item dalam array adalah falsey. Ambil contoh A = [2, 1, 0, -1, -2] akan menghasilkan A yang menyamakan [2, 1]. Bahkan while(A.pop() !== undefined)tidak berfungsi karena Anda dapat memiliki array dengan undefined sebagai salah satu nilai. Mungkin mengapa kompiler tidak mengoptimalkannya.
Jonathan Gawrych
2461

Jika Anda perlu mempertahankan array asli karena Anda memiliki referensi lain yang harus diperbarui juga, Anda dapat menghapusnya tanpa membuat array baru dengan menetapkan panjangnya ke nol:

A.length = 0;
Matthew Crumley
sumber
17
apa yang dikatakan ECMAScript 5 Standard tentang ini?
Pacerier
212
@Pacerier: Masih berfungsi di ES5. Dari bagian 15.4: "... setiap kali properti panjang diubah, setiap properti yang namanya adalah indeks array yang nilainya tidak lebih kecil dari panjang baru dihapus secara otomatis"
Matthew Crumley
2
@ Einar: Array JavaScript selalu diperluas agar sesuai dengan apa pun yang Anda masukkan, jadi ketika Anda menyebutnya myarray.push(whatever)menambahkan satu panjang. Jadi pengaturan panjang memotong array, tapi itu tidak permanen.
Matthew Crumley
12
@LosManos Bahkan dalam mode ketat, lengthadalah properti khusus, tetapi tidak hanya baca, jadi tetap bekerja.
Matthew Crumley
11
@ MatewCrumley Saya melakukan beberapa tes, dan sepertinya a.length = 0 tidak efisien membersihkan seluruh array. jsperf.com/length-equal-0-or-new-array Saya pikir jika Anda memiliki satu refence (dan Anda belum menambahkan properti tambahan yang ingin Anda pertahankan), lebih baik untuk membuat array baru, dan membuat tua untuk pengumpul sampah, yang akan berjalan bila perlu.
Paul Brewczynski
289

Di sini, implementasi tercepat bekerja dengan tetap mempertahankan array yang sama ("bisa berubah"):

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

FYI tidak dapat disederhanakan menjadi while (array.pop()): tes akan gagal.

FYI Map and Set define clear(), akan terlihat logis clear()untuk Array juga.

Versi TypeScript:

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

Tes terkait:

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

Di sini jsPerf yang diperbarui: http://jsperf.com/array-destroy/32 http://jsperf.com/array-destroy/152

tanguy_k
sumber
5
TT jawaban Anda adalah satu-satunya yang benar dan cepat (pada saat yang sama) tetapi memiliki "upvote" yang jauh lebih sedikit. Nah, tampaknya orang menyukai solusi cantik yang lambat: /
obenjiro
@naomik Tapi ini adalah salah satu fungsi dasar, yang seharusnya ada di sana secara default.
thefourtheye
7
@thefourtheye Solusi yang bagus untuk kinerja, meskipun saya setuju dengan @naomik, Anda tidak boleh memodifikasi objek asli. Mengatakan bahwa seharusnya ada di samping intinya, masalahnya adalah Anda memodifikasi global , yang buruk. Jika Anda memberikan kode untuk digunakan orang lain, maka kode tersebut tidak akan memiliki efek samping yang tidak terduga. Bayangkan jika perpustakaan lain juga memodifikasi Array.prototypedan melakukan sesuatu yang sedikit berbeda, maka seluruh kode Anda [].clear()sedikit salah. Ini tidak akan menyenangkan untuk di-debug. Jadi, pesan umumnya adalah: Jangan memodifikasi global.
jpillora
3
@thefourtheye Inti dari tidak mengubah lingkup global adalah karena Anda tidak akan tahu apakah kode orang lain sudah (atau akan) menggunakan nama tersebut. Saya menyarankan fungsi di dalam lingkup lokal. Jadi, di dalam IIFE aplikasi / pustaka Anda , lakukan function clear(arr) { while(arr.length) arr.pop(); }, lalu hapus array dengan clear(arr)alih - alih arr.clear().
jpillora
2
Ternyata metode ini jauh lebih lambat daripada .splice()dan .length=0. Tolok ukurnya tidak benar. Lihat jawaban saya yang diperbarui.
Philippe Leybaert
216

Solusi cross-browser yang lebih ramah dan lebih optimal adalah dengan menggunakan splicemetode ini untuk mengosongkan konten array A seperti di bawah ini:

A.splice(0, A.length);

Anthony
sumber
49
Mengapa ini lebih ramah lintas-browser? Browser apa yang bermasalah dengan A.length?
stricjux
4
@ jm2 apa yang Anda katakan tidak sepenuhnya benar. Ini benar-benar mengubah array yang dimaksud dan selanjutnya semua referensi terpengaruh. Lihat tes di jsFiddle saya: jsfiddle.net/shamasis/dG4PH
Shamasis Bhattacharya
3
@alex tidak tidak, splicememodifikasi array dan mengembalikan entri yang dihapus. Baca dokumen terlebih dahulu: developer.mozilla.org/en-US/docs/JavaScript/Reference/…
David Hellsing
3
Kita bisa mencegah array yang dihasilkan dari yang dikembalikan dengan menggunakan operator koma : A.splice(0, A.length),0;. Ini akan meninggalkan nilai kembali dari 0sepertiA.length = 0; . Array yang dihasilkan masih dibuat dan harus menyebabkan script untuk menjalankan lebih lambat: ( jsperf ~ 56% lebih lambat). Implementasi browser akan memengaruhi ini meskipun saya tidak melihat alasan mengapa splicelebih cepat dari pengaturan length.
Evan Kennedy
8
Saya juga menemukan bahwa itu A.splice(0)juga berfungsi.
corwin.amber
97

Jawaban yang tidak kurang dari 2739 yang diputuskan sekarang menyesatkan dan salah.

Pertanyaannya adalah: "Bagaimana Anda mengosongkan array yang ada?" Misalnya untuk A = [1,2,3,4].

  1. Mengatakan " A = []adalah jawabannya" bodoh dan sama sekali tidak benar. [] == []itu salah .

    Ini karena kedua array ini adalah dua objek terpisah, masing-masing, dengan dua identitas mereka sendiri, mengambil ruang mereka sendiri di dunia digital, masing-masing dengan sendirinya.


Katakanlah ibumu meminta Anda untuk mengosongkan tempat sampah.

  • Anda tidak membawa yang baru seolah-olah Anda telah melakukan apa yang Anda minta.
  • Sebaliknya, Anda mengosongkan tempat sampah.
  • Anda tidak mengganti yang diisi dengan kaleng kosong yang baru, dan Anda tidak mengambil label "A" dari kaleng yang diisi dan menempelkannya ke yang baru seperti di A = [1,2,3,4]; A = [];

Mengosongkan objek array adalah yang termudah:

A.length = 0;

Dengan cara ini, kaleng di bawah "A" tidak hanya kosong, tetapi juga sebersih baru!


  1. Selain itu, Anda tidak perlu membuang sampah dengan tangan sampai kalengnya kosong! Anda diminta untuk mengosongkan yang sudah ada, sepenuhnya, dalam satu giliran, untuk tidak mengambil sampah sampai kaleng kosong, seperti pada:

    while(A.length > 0) {
        A.pop();
    }
  2. Juga, untuk meletakkan tangan kiri Anda di bagian bawah tempat sampah, memegangnya dengan tangan kanan Anda di bagian atas untuk dapat menarik isinya seperti pada:

    A.splice(0, A.length);

Tidak, Anda diminta mengosongkannya:

A.length = 0;

Ini adalah satu-satunya kode yang secara benar mengosongkan isi dari array JavaScript yang diberikan.

Bekim Bacaj
sumber
11
Satu-satunya masalah dengan solusi yang Anda sarankan adalah bahwa sampah masih ada, hanya saja Anda mengubah papan pengumuman dengan mengatakan bahwa tidak ada sampah. Referensi ke array lama masih harus ada. Bisakah Anda yakin pengumpul sampah saat mengatur .length = 0, juga akan menghapus semua referensi ke array dan propertinya? Saya pikir memang demikian, tetapi bagi saya itu adalah sihir. Metode .clear () diinginkan untuk menghindari kebingungan untuk sedikitnya.
mmm
8
Saya tidak pernah menyatakan bahwa solusi ini salah. Masalahnya adalah seluruh utas ini sama sekali tidak perlu. Lebih dari 3.000 suara menunjukkan bahwa mencoba mencari tahu apa cara terbaik adalah membuatnya menjadi kasus yang cukup valid bagi pengembang crack head EMCA untuk menambahkan metode seperti itu. Tidak ada yang harus melalui mencari tahu. Ada tiga - empat cara berbeda untuk melakukannya. Dalam beberapa tolok ukur, solusi panjang jauh lebih lambat daripada yang lain. Selain itu, gagasan pengaturan .length = 0, untuk pengembang yang masuk akal tidak akan memuaskan.
mmm
2
Karena untuk mencapai apa yang seharusnya, semua referensi harus dihilangkan. .length = 0 bahkan bukan pemanggilan metode, jadi jika ada tindakan lain yang diambil ketika diatur ke 0 (yang ada di sebagian besar peramban melalui define setter). Saya masih akan menganggapnya terlalu ajaib untuk benar-benar percaya bahwa ia melakukan apa yang seharusnya. melakukan.
mmm
7
Karena itu, saya lebih suka membersihkannya sendiri. Metode yang jelas dapat diujicobakan tetapi itu hanya jelek. Maksud saya adalah implementasi ini harus sudah ada sehingga lebih dari 10.000 pengembang tidak perlu menghabiskan berjam-jam membaca hanya utas ini, tidak mempertimbangkan semua yang lain yang menghabiskan lebih banyak waktu benchmarking.
mmm
1
hanya ada satu cara untuk mengosongkan array Anda, mengisinya dengan data masuk baru dan membuangnya lagi. Yang lain tidak, atau sangat tidak efisien dan tidak bisa dimaafkan. Satu-satunya alternatif praktis adalah A(n) = A.splice( 0, A.length );jika Anda perlu membuat cadangan konten Anda sebelumnya. ps Array.lengthadalah properti baca-tulis \ metode jika Anda melewatkan fakta dasar itu. Artinya, Anda dapat memperluasnya ke panjang baru, Anda tidak dapat memotongnya ke panjang mana pun yang Anda inginkan, dan di antaranya Anda dapat membuang semua anggota dengan memperpendek panjangnya menjadi 0. Ini adalah pisau Swiss array.
Bekim Bacaj
63

Uji kinerja:

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
kenshou.html
sumber
9
Menambahkan perubahan persentase tidak banyak digunakan tanpa juga memperhatikan platform Anda. Di komputer saya, pop hanya lebih cepat di Chrome 34 tetapi sebenarnya lebih lambat dari [] di Firefox terbaru.
Matt Styles
2
Pengujian di Firefox 39.0 32-bit pada Windows NT 6.3 64-bit, a = [] adalah yang tercepat!
Reza-S4
5
Pasti ada sesuatu yang mencurigakan dalam hasil tes ini di bawah Chrome. Bagaimana sih lingkaran popping bisa menjadi lebih cepat daripada 3 solusi lainnya?
chqrlie
9
@ chqrlie Bukan. Ini metode paling lambat. Tes patokan cacat.
Philippe Leybaert
15
Hapus jawaban ini karena salah, dan tautan ke tes cacat yang tidak berarti sebagai bukti palsu.
James Wakefield
35

Anda dapat menambahkan ini ke file JavaScript Anda untuk memungkinkan array Anda "dihapus":

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

Maka Anda dapat menggunakannya seperti ini:

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

Atau jika Anda ingin memastikan Anda tidak menghancurkan sesuatu:

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

Banyak orang berpikir Anda tidak boleh memodifikasi objek asli (seperti Array), dan saya cenderung setuju. Harap berhati-hati dalam memutuskan bagaimana menangani hal ini.

lintah
sumber
1
@naomik Bisakah Anda menjelaskan alasan Anda mengapa melakukan hal seperti itu disukai?
ditentukan
17
Ini "disukai" untuk memodifikasi fungsi primitif javascript seperti Array dan String. Anda mungkin bisa membebani fungsi yang sudah ada dan membuang kelas objek. Mungkin ada mesin javascript yang tidak jelas yang sudah memiliki jelas () dan mengharapkannya berperilaku berbeda. Tapak hati-hati semua yang saya katakan.
Desain oleh Adrian
Bagaimana dengan masalah di mana melakukan pendahuluan terhadap anggota array tiba-tiba akan mulai termasuk clearkunci?
ErikE
19

Ada banyak kebingungan dan informasi yang salah mengenai sementara; kinerja pop / shift baik dalam jawaban dan komentar. Solusi while / pop memiliki (seperti yang diharapkan) kinerja terburuk . Apa yang sebenarnya terjadi adalah bahwa pengaturan hanya berjalan satu kali untuk setiap sampel yang menjalankan cuplikan dalam satu lingkaran. misalnya:

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

Saya telah membuat tes baru yang berfungsi dengan benar:

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

Peringatan: bahkan dalam versi tes ini, Anda tidak dapat benar-benar melihat perbedaan nyata karena mengkloning array memakan sebagian besar waktu pengujian. Itu masih menunjukkan bahwa itu spliceadalah cara tercepat untuk menghapus array (tidak []mempertimbangkan karena sementara itu tercepat itu tidak benar-benar membersihkan array yang ada).

Diadistis
sumber
Poin yang sangat bagus! Saya akan memperbarui jawaban asli dengan hasil benchmark yang benar.
Philippe Leybaert
Saya tidak percaya tidak ada yang melihat kesalahan patokan itu. Dengan lebih dari setengah juta tampilan, Anda akan mengharapkan seseorang memperhatikannya. Karya hebat Diadistis
Philippe Leybaert
15

Jika Anda tertarik dengan alokasi memori, Anda dapat membandingkan setiap pendekatan menggunakan sesuatu seperti jsfiddle ini bersama dengan tab garis waktu alat dev krom. Anda akan ingin menggunakan ikon tempat sampah di bagian bawah untuk memaksa pengumpulan sampah setelah 'membersihkan' array. Ini akan memberi Anda jawaban yang lebih pasti untuk peramban pilihan Anda. Banyak jawaban di sini sudah tua dan saya tidak akan bergantung pada mereka melainkan menguji seperti pada jawaban @ tanguy_k di atas.

(untuk pengantar ke tab tersebut Anda dapat memeriksa di sini )

Stackoverflow memaksa saya untuk menyalin jsfiddle jadi ini dia:

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

Dan Anda harus mencatat bahwa itu mungkin tergantung pada jenis elemen array, karena javascript mengelola string berbeda dari tipe primitif lainnya, belum lagi array objek. Jenisnya dapat memengaruhi apa yang terjadi.

matanster
sumber
15

Anda dapat dengan mudah membuat fungsi untuk melakukan itu untuk Anda, mengubah panjangnya atau bahkan menambahkannya ke Array asli sebagai remove()fungsi untuk digunakan kembali.

Bayangkan Anda memiliki array ini:

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

Oke, jalankan saja ini:

arr.length = 0; //change the length

dan hasilnya adalah:

[] //result

cara mudah mengosongkan array ...

Juga menggunakan loop yang tidak perlu tetapi hanya cara lain untuk melakukan itu:

/* 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(); 
  }
}

Ada juga cara rumit yang dapat Anda pikirkan, misalnya sesuatu seperti ini:

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

Jadi jika arr memiliki 5 item, itu akan memecah 5 item dari 0, yang berarti tidak ada yang tersisa dalam array.

Juga cara lain seperti cukup menetapkan kembali array misalnya:

arr = []; //[]

Jika Anda melihat fungsi Array, ada banyak cara lain untuk melakukan ini, tetapi yang paling direkomendasikan adalah mengubah panjangnya.

Seperti yang saya katakan di awal, Anda juga dapat membuat prototipe remove () karena itu adalah jawaban untuk pertanyaan Anda. Anda cukup memilih salah satu metode di atas dan membuat prototipe untuk objek Array di JavaScript, seperti:

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

dan Anda bisa menyebutnya seperti ini untuk mengosongkan array apa pun di aplikasi javascript Anda:

arr.remove(); //[]
Alireza
sumber
arr.length = 0; // ubah panjangnya
Ajay Malhotra
14
Array.prototype.clear = function() {
    this.length = 0;
};

Dan menyebutnya: array.clear();

Bendegúz
sumber
77
Tolong jangan mendorong modifikasi objek asli.
Terima kasih
21
mengapa orang memiliki kecenderungan untuk mengambil jawaban yang diterima dan memasukkannya ke dalam fungsi prototipe? Apakah Anda benar-benar melakukan ini dalam proyek Anda? Apakah Anda memiliki perpustakaan tambahan prototipe besar yang Anda sertakan dalam setiap proyek?
nurettin
4
Mengapa tidak mengetik saja array.length = 0?
Desain oleh Adrian
10
@naomik "Tolong jangan mendorong modifikasi objek asli." - Saya sepenuhnya setuju dengan ini, tetapi hanya mengulangi kalimat itu sendiri dengan arogan. Seseorang yang mengusulkan solusi semacam itu kemungkinan besar tidak menyadari konsekuensinya, dan menjatuhkan garis ini pada mereka alih-alih memberikan penjelasan singkat atau tautan tidak menyampaikan makna selain "kami, orang-orang yang lebih pintar dari Anda, memberi tahu Anda untuk tidak melakukan ini, karena kita tahu lebih baik " .
John Weisz
12

A.splice(0);

Saya hanya melakukan ini pada beberapa kode yang sedang saya kerjakan. Itu membersihkan array.

David Campbell
sumber
Tidak, Anda baru saja menukar wadah array bernama dengan wadah anonim yang baru dibuat. `var A = [1,2,3,4]; var B; B = A.splice (0); console.log (A); console.log (B); '
Bekim Bacaj
12

Jika Anda menggunakan

a = []; 

Kemudian Anda menetapkan referensi array baru ke a, jika referensi dalam sudah ditugaskan ke variabel lain, maka itu tidak akan mengosongkan array itu juga dan karenanya pengumpul sampah tidak akan mengumpulkan memori itu.

Misalnya

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

atau

a.length = 0;

Ketika kita tentukan a.length , kami hanya mengatur ulang batas array dan memori untuk elemen array lainnya akan dihubungkan oleh pengumpul sampah.

Alih-alih kedua solusi ini lebih baik.

a.splice(0,a.length)

dan

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

Sesuai jawaban sebelumnya oleh kenshou.html, metode kedua lebih cepat.

Dange Laxmikant
sumber
10
Selain salah a.length, saya tidak melihat apa yang ditambahkan jawaban baru ini ke utas?
Bergi
@Bergi Saya hanya ingin fokus tentang representasi memori aktual tentang array
Laxmikant Dange
Apakah Anda memiliki sumber untuk mengonfirmasi mesin JS mana yang akan membuat array baru ketika a.length=0;dilakukan? Bagaimana mesin itu bertindak untuk a.length=500;dan a.length=4;?
joeytwiddle
Saya mencobanya di sebagian besar browser, seperti IE, Firefox, Chrome, itu menciptakan array baru. Jika Anda menetapkan panjang lebih besar dari 0 maka akan membuat array dengan elemen yang tidak ditentukan, yaitu hanya akan menampung beberapa lokasi memori.
Laxmikant Dange
1
var a = [1]; var b = a; a.length = 0; console.log(b)cetakan Array [ ], jadi sepertinya tidak menciptakan array baru untuk saya.
John Montgomery
9

Gunakan versi modifikasi dari saran awal Jan :

var originalLength = A.length;
for (var i = originalLength; i > 0; i--) {
     A.pop();
}
cssimsek
sumber
12
Mengapa Anda ingin melakukan hal seperti itu? Mengapa menambahkan dua variabel lagi dan banyak kode untuk melakukan hal yang sama?
Killah
6

Jika Anda menggunakan konstanta maka Anda tidak punya pilihan:

const numbers = [1, 2, 3]

Anda tidak dapat menetapkan ulang:

numbers = []

Anda hanya dapat memotong:

numbers.length = 0
Damjan Pavlica
sumber
5

masukkan deskripsi gambar di sini

Untuk Mengosongkan Lokasi memori saat ini dari sebuah array gunakan: 'myArray.length = 0'atau'myArray.pop() UN-till its length is 0'

  • length: Anda dapat mengatur properti panjang untuk memotong array kapan saja. Saat Anda memperluas array dengan mengubah properti panjangnya, jumlah elemen aktual bertambah.
  • pop() : Metode pop menghapus elemen terakhir dari array dan mengembalikan yang mengembalikan nilai yang dihapus.
  • shift(): Metode shift menghapus elemen pada indeks nol dan menggeser nilai pada indeks berturut-turut ke bawah, lalu mengembalikan nilai yang dihapus.

Contoh:

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() | [] Buat Array dengan lokasi memori baru dengan menggunakan Array constructoratau array literal.

    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() : Dengan menggunakan fungsi slice kita mendapatkan salinan elemen yang dangkal dari array asli, dengan alamat memori baru, sehingga setiap modifikasi pada cloneArr tidak akan mempengaruhi ke array | asli yang sebenarnya.

    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);
Yash
sumber
"length: Pops hingga panjang array berukuran tertentu." Siapa yang memberitahumu omong kosong ini?
Bekim Bacaj
@BekimBacaj Intinya, ia melakukan efek yang sama. Seharusnya itu mengatakan length = ?bukan hanya length.
Tuupertunut
@ BekimBacaj saya telah memperbarui jawaban saya, saya hanya berasumsi bahwa panjang muncul hingga panjang, tetapi saya memperbaiki sekarang bahwa panjang hanya memotong atau meningkatkan ukuran array.
Yash
3

Saya terkejut belum ada yang menyarankan ini:

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

Ini menghasilkan array dalam keadaan yang sangat berbeda dari solusi lain. Dalam arti tertentu, array telah 'dikosongkan':

xs
=> Array [ <4 empty slots> ]

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

xs.length
=> 4

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

Anda dapat menghasilkan array yang setara dengan [,,,,]atauArray(4)

Cauterite
sumber
7
Ini bisa menjadi jawaban yang bagus untuk pertanyaan yang berbeda: "Bagaimana mengubah semua elemen dalam array menjadi elemen yang tidak terdefinisi".
Ruben
Meskipun secara internal ada perbedaan antara elemen yang tidak terdefinisi dan slot kosong ("lubang")
Cauterite
-9

Gunakan di bawah ini jika Anda perlu mengosongkan Angular 2+ FormArray.

public emptyFormArray(formArray:FormArray) {
    for (let i = formArray.controls.length - 1; i >= 0; i--) {
        formArray.removeAt(i);
    }
}
Manish Jain
sumber
10
Ini tidak relevan dan bahkan tidak JavaScript.
Emile Bergeron