Bagaimana cara menginisialisasi panjang array dalam JavaScript?

542

Sebagian besar tutorial yang saya baca pada array dalam JavaScript (termasuk w3schools dan devguru ) menyarankan Anda untuk menginisialisasi array dengan panjang tertentu dengan mengirimkan integer ke konstruktor Array menggunakan var test = new Array(4);sintaks.

Setelah menggunakan sintaks ini secara bebas di file js saya, saya menjalankan salah satu file melalui jsLint , dan itu panik:

Kesalahan: Masalah pada karakter baris 1 22: Diharapkan ')' dan sebaliknya melihat '4'.
var test = new Array (4);
Masalah pada baris 1 karakter 23: Diharapkan ';' dan bukannya melihat ')'.
var test = new Array (4);
Masalah pada baris 1 karakter 23: Diharapkan pengidentifikasi dan bukannya melihat ')'.

Setelah membaca penjelasan jsLint tentang perilakunya , sepertinya jsLint tidak benar-benar menyukai new Array()sintaks, dan sebaliknya lebih suka []ketika mendeklarasikan array.

Jadi saya punya beberapa pertanyaan:

Pertama, mengapa? Apakah saya menjalankan risiko dengan menggunakan new Array()sintaks? Apakah ada ketidakcocokan browser yang harus saya ketahui?

Dan kedua, jika saya beralih ke sintaks braket persegi, apakah ada cara untuk mendeklarasikan array dan mengatur panjangnya semua pada satu baris, atau apakah saya harus melakukan sesuatu seperti ini:

var test = [];
test.length = 4;
Michael Martin-Smucker
sumber
js standar juga menyarankan agar tidak menggunakannew Array()secara umum, tapi tidak apa-apa dengan menentukan ukuran. Saya pikir semuanya bermuara pada konsistensi kode melalui keseluruhan konteks.
cregox
Bagi mereka yang ingin melakukan preallocate struktur array yang lebih kaku, ada Typed Array . Perhatikan bahwa manfaat kinerja dapat bervariasi
rovyko

Jawaban:

397
  1. Mengapa Anda ingin menginisialisasi panjangnya? Secara teoritis tidak perlu untuk ini. Itu bahkan dapat mengakibatkan perilaku membingungkan, karena semua tes yang menggunakan lengthuntuk mengetahui apakah array kosong atau tidak akan melaporkan bahwa array tidak kosong.
    Beberapa tes menunjukkan bahwa pengaturan panjang awal array besar bisa lebih efisien jika array diisi setelahnya, tetapi kinerja yang didapat (jika ada) tampaknya berbeda dari browser ke browser.

  2. jsLint tidak suka new Array()karena konstruktornya ambigu.

    new Array(4);

    menciptakan array kosong dengan panjang 4. Tapi

    new Array('4');

    menciptakan array yang berisi nilai '4' .

Mengenai komentar Anda: Di JS Anda tidak perlu menginisialisasi panjang array. Itu tumbuh secara dinamis. Anda bisa menyimpan panjang dalam beberapa variabel, misalnya

var data = [];
var length = 5; // user defined length

for(var i = 0; i < length; i++) {
    data.push(createSomeObject());
}
Felix Kling
sumber
13
Jumlah objek dalam array ditentukan oleh pengguna, jadi saya membiarkan pengguna memilih nomor, kemudian menginisialisasi array dengan banyak slot. Kemudian saya menjalankan forloop yang berulang di atas panjang array dan mengisinya. Saya kira akan ada cara lain untuk melakukan ini dalam JavaScript, jadi jawaban sebenarnya untuk "Mengapa saya ingin melakukan ini?" adalah "Karena kebiasaan lama yang terbentuk saat pemrograman dalam bahasa lain." :)
Michael Martin-Smucker
4
@mlms Biarkan perulangan for iterate di atas angka yang ditentukan pengguna alih-alih harus mengatur panjang array lalu iterate di atasnya. Bukankah itu lebih masuk akal bagi Anda?
Šime Vidas
151
<blockquote> Mengapa Anda ingin menginisialisasi panjangnya? Secara teoritis tidak perlu untuk ini. Dan semua tes yang menggunakan panjang untuk mengetahui apakah array kosong atau tidak akan gagal. </blockquote> Um, kinerja mungkin? Lebih cepat untuk mengatur elemen array yang sudah ada daripada menambahkannya dengan cepat.
codehead
45
"waktu untuk menghentikan kebiasaan pemrograman lama" komentar benar-benar tidak perlu. bahasa terstruktur dengan baik akan selalu mengungguli ecmascript mombo jambo
user151496
10
@codehead: dalam menanggapi kutipan ini: "Lebih cepat untuk mengatur elemen array yang sudah ada daripada menambahkannya dengan cepat.": perhatikan bahwa new Array(10)tidak membuat array dengan 10 elemen yang tidak ditentukan. Ini hanya menciptakan array kosong dengan panjang 10. Lihat jawaban ini untuk kebenaran yang buruk: stackoverflow.com/questions/18947892/…
Milimetric
598
  • Array(5) memberi Anda sebuah array dengan panjang 5 tetapi tidak ada nilai, maka Anda tidak bisa mengulanginya.

  • Array.apply(null, Array(5)).map(function () {}) memberi Anda sebuah array dengan panjang 5 dan tidak terdefinisi sebagai nilai, sekarang bisa diulangi.

  • Array.apply(null, Array(5)).map(function (x, i) { return i; }) memberi Anda sebuah array dengan panjang 5 dan nilai 0,1,2,3,4.

  • Array(5).forEach(alert)tidak melakukan apa-apa, Array.apply(null, Array(5)).forEach(alert)memberi Anda 5 peringatan

  • ES6memberi kami Array.fromjadi sekarang Anda juga dapat menggunakanArray.from(Array(5)).forEach(alert)

  • Jika Anda ingin menginisialisasi dengan nilai tertentu, ini bagus untuk diketahui ...
    Array.from('abcde'), Array.from('x'.repeat(5))
    atauArray.from({length: 5}, (v, i) => i) // gives [0, 1, 2, 3, 4]

Ruben Stolk
sumber
11
Ini yang saya cari. Saya ingin menerapkan peta di atas urutan logis; ini harus dilakukan. Terima kasih!
jedd.ahyoung
3
mengapa Array.apply () memberikannya tidak didefinisikan sebagai nilai?
wdanxna
5
@wdanxna ketika Arraydiberikan beberapa argumen, ia mengulangi argumentsobjek dan secara eksplisit menerapkan setiap nilai ke array baru. Ketika Anda memanggil Array.applydengan array atau objek dengan properti panjang Arrayakan menggunakan panjang untuk secara eksplisit mengatur setiap nilai array baru. Inilah sebabnya mengapa Array(5)memberikan array 5 elisions, sementara Array.apply(null, Array(5))memberikan array 5 undefined. Untuk informasi lebih lanjut, lihat jawaban ini .
KylePlusPlus
2
apakah ada perbedaan antara Array (5) dan Array baru (5)?
Petr Hurtak
2
The Array.apply(null, Array(5)) juga dapat ditulis sebagai Array.apply(null, {length: 5}). Sebenarnya tidak ada banyak perbedaan, tetapi yang terakhir jelas bahwa tujuannya adalah untuk membuat array length 5, dan bukan array yang mengandung5
AlexMorley-Finch
272

Dengan ES2015.fill() sekarang Anda bisa melakukan:

// `n` is the size you want to initialize your array
// `0` is what the array will be filled with (can be any other value)
Array(n).fill(0)

Yang jauh lebih ringkas daripada Array.apply(0, new Array(n)).map(i => value)

Hal ini dimungkinkan untuk menjatuhkan 0di .fill()dan berjalan tanpa argumen, yang akan mengisi array dengan undefined. ( Namun, ini akan gagal di dalam Skrip )

AP.
sumber
1
@AralRoca Anda selalu dapat menggunakan Polyfill yang disediakan di halaman MDN, atau pertimbangkan untuk menggunakan Modernizr .
AP.
4
Ya, silakan coba sebelum Anda berkomentar
AP.
1
@ GarretWilson dan @Christian Ada di spec . When Array is called as a function rather than as a constructor, it also creates and initializes a new Array object. Thus the function call Array(…) is equivalent to the object creation expression new Array(…) with the same arguments
AP.
1
@ AP., Nolnya mubazir. DoArray(n).fill()
Pacerier
2
@ Peracer Saya tidak berpikir 0 itu berlebihan. Menurut definisi tipe es6, ini adalah tanda tangan fungsi: fill (nilai: T, mulai ?: angka, akhir ?: angka): ini; Karenanya nilai isian sepertinya tidak opsional. Kompilasi naskah akan gagal saat pemanggilan fungsi ditulis di atas.
Micha Schwab
152
[...Array(6)].map(x => 0);
// [0, 0, 0, 0, 0, 0]

ATAU

Array(6).fill(0);
// [0, 0, 0, 0, 0, 0]

Catatan: Anda tidak dapat mengulangi slot kosong yaitu Array(4).forEach(() => …)


ATAU

( naskah aman )

Array(6).fill(null).map((_, i) => i);
// [0, 1, 2, 3, 4, 5]

ATAU

Metode klasik menggunakan fungsi (berfungsi di browser apa saja)

function NewArray(size) {
    var x = [];
    for (var i = 0; i < size; ++i) {
        x[i] = i;
        return x;
    }
}

var a = NewArray(10);
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Membuat array bersarang

Saat membuat array 2D dengan fillintuitif harus membuat instance baru. Tetapi apa yang sebenarnya akan terjadi adalah array yang sama akan disimpan sebagai referensi.

var a = Array(3).fill([6]);
// [  [6], [6], [6]  ]

a[0].push(9);
// [  [6, 9], [6, 9], [6, 9]  ]

Larutan

var a = [...Array(3)].map(x => []);

a[0].push(4, 2);
// [  [4, 2], [], []  ]

Jadi Array 3x2 akan terlihat seperti ini:

[...Array(3)].map(x => Array(2).fill(0));
// [  [0, 0], [0, 0], [0, 0]  ]

Array N-dimensi

function NArray(...dimensions) {
    var index = 0;
    function NArrayRec(dims) {
        var first = dims[0], next = dims.slice().splice(1); 
        if(dims.length > 1) 
            return Array(dims[0]).fill(null).map((x, i) => NArrayRec(next ));
        return Array(dims[0]).fill(null).map((x, i) => (index++));
    }
    return NArrayRec(dimensions);
}

var arr = NArray(3, 2, 4);
// [   [  [ 0,  1,  2,  3 ] , [  4,  5,  6,  7]  ],
//     [  [ 8,  9,  10, 11] , [ 12, 13, 14, 15]  ],
//     [  [ 16, 17, 18, 19] , [ 20, 21, 22, 23]  ]   ]

Inisialisasi papan catur

var Chessboard = [...Array(8)].map((x, j) => {
    return Array(8).fill(null).map((y, i) => {
        return `${String.fromCharCode(65 + i)}${8 - j}`;
    });
});

// [ [A8, B8, C8, D8, E8, F8, G8, H8],
//   [A7, B7, C7, D7, E7, F7, G7, H7],
//   [A6, B6, C6, D6, E6, F6, G6, H6],
//   [A5, B5, C5, D5, E5, F5, G5, H5],
//   [A4, B4, C4, D4, E4, F4, G4, H4],
//   [A3, B3, C3, D3, E3, F3, G3, H3],
//   [A2, B2, C2, D2, E2, F2, G2, H2],
//   [A1, B1, C1, D1, E1, F1, G1, H1] ]
Vlad
sumber
1
a[0].push(9); // [ [6, 9], [6], [6] ] seharusnya a[0].push(9); // [ [6, 9], [6, 9], [6, 9] ] karena setiap array bersarang disimpan sebagai referensi, sehingga bermutasi satu array mempengaruhi sisanya. Anda mungkin salah ketik, meskipun saya pikir :)
Alex_Zhong
@Alex_Zhong tru itu, terima kasih, kehilangan itu dalam edit
Vlad
68

Terpendek:

[...Array(1000)]
Michael Mammoliti
sumber
11
Terpilih, tetapi satu peringatan, Anda benar-benar tidak boleh memulai garis dalam JS dengan [tanpa menggunakan ;karena akan mencoba untuk meringkas garis di atas. Jadi cara yang aman untuk menggunakan baris ini dapat diprediksi di bagian mana pun dari kode adalah:;[...Array(1000)]//.whateverOpsNeeded()
AP.
tidak juga. coba di alat pengembang. [...Array(5)].map((item, index) => ({ index })) coba ini juga:[...Array(5)]; console.log('hello');
Michael Mammoliti
2
Coba gunakan dalam file js multi-line. Jika baris pertama Anda const a = 'a'dan baris berikutnya [...Array(5)].//irrelevent. Menurut Anda apa yang akan diselesaikan oleh baris pertama? Itu const a = 'a'[...Array(5)]yang akan menghasilkan:Uncaught SyntaxError: Unexpected token ...
AP.
7
Itu benar tetapi dalam kasus ini saya akan mengatakan bahwa masalahnya ada di tempat lain, titik koma dan linting adalah hal yang penting saat ini.
Michael Mammoliti
8
@AP contoh itu persis alasan mengapa banyak panduan gaya mengamanatkan mengakhiri setiap pernyataan dengan titik koma. const a = 'a'akan menjadi kesalahan Lint dalam kasus itu. Bagaimanapun, itu benar-benar tidak ada hubungannya dengan jawaban ini.
graup
41

Memperkenalkan ES6 Array.fromyang memungkinkan Anda membuat Arraydari setiap "array-seperti" atau iterables objek:

Array.from({length: 10}, (x, i) => i);
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Dalam hal ini {length: 10}mewakili definisi minimal objek "seperti array" : objek kosong dengan hanya lengthproperti yang ditentukan.

Array.from memungkinkan argumen kedua untuk memetakan di atas array yang dihasilkan.

Alexander Shutau
sumber
2
@dain saya pikir [... Array (10)] lebih baik stackoverflow.com/a/47929322/4137472
Alexander Shutau
1
Mengapa lebih baik Penggunaan konstruktor Array tidak disarankan, dan beberapa linter juga bisa mengeluh
Cristian Traìna
26

Ini akan menginisialisasi properti panjang menjadi 4:

var x = [,,,,];
Šime Vidas
sumber
3
Itu pintar. Itu tidak memiliki fleksibilitas konstruktor, karena Anda tidak dapat menggunakan variabel untuk mengatur panjangnya, tetapi ia menjawab pertanyaan saya seperti yang saya sebutkan semula, jadi +1.
Michael Martin-Smucker
12
Bayangkan lakukan itu untuk 300 item ketika kinerja benar-benar penting!
Marco Luglio
9
Mungkin tidak ada banyak peningkatan kinerja ketika praallocating array dengan ukuran sekecil itu. Perbedaan kinerja akan lebih dirasakan saat membuat array yang lebih besar. Dan dalam kasus-kasus itu, menginisialisasi mereka dengan koma akan sedikit berlebihan.
Marco Luglio
6
Saya pikir ini akan menghasilkan hasil yang berbeda di browser yang berbeda karena koma terakhir, kadang-kadang 4 dan kadang-kadang 5, lihat stackoverflow.com/questions/7246618/…
jperelli
1
Bagaimana dengan var size = 42; var myArray = eval("["+",".repeat(size)+"]");? (Tidak seserius itu;)
xoxox
15

Saya terkejut belum ada solusi fungsional yang disarankan yang memungkinkan Anda untuk mengatur panjang dalam satu baris. Berikut ini didasarkan pada UnderscoreJS:

var test = _.map(_.range(4), function () { return undefined; });
console.log(test.length);

Untuk alasan yang disebutkan di atas, saya akan menghindari melakukan ini kecuali saya ingin menginisialisasi array ke nilai tertentu. Sangat menarik untuk dicatat ada perpustakaan lain yang mengimplementasikan jangkauan termasuk Lo-dash dan Lazy, yang mungkin memiliki karakteristik kinerja yang berbeda.

christang
sumber
Sihir hitam garis bawah benar-benar tidak diperlukan di sini. Ketergantungan seperti gula, kelihatannya manis pada awalnya, tetapi sebelum Anda menyadarinya, Anda menderita diabetes.
Romain Vincent
9

Tolonglah orang-orang tidak meninggalkan kebiasaan lama Anda dulu. Ada perbedaan besar dalam kecepatan antara mengalokasikan memori sekali kemudian bekerja dengan entri dalam array itu (seperti yang lama), dan mengalokasikannya berkali-kali ketika array tumbuh (yang tidak dapat dihindari apa yang dilakukan sistem di bawah tenda dengan metode yang disarankan lainnya) .

Tentu saja tidak ada yang penting, sampai Anda ingin melakukan sesuatu yang keren dengan array yang lebih besar. Lalu itu terjadi.

Melihat sepertinya masih ada opsi di JS saat ini untuk mengatur kapasitas awal array, saya menggunakan yang berikut ...

var newArrayWithSize = function(size) {
  this.standard = this.standard||[];
  for (var add = size-this.standard.length; add>0; add--) {
   this.standard.push(undefined);// or whatever
  }
  return this.standard.slice(0,size);
}

Ada pengorbanan yang terlibat:

  • Metode ini memakan waktu selama yang lain untuk panggilan pertama ke fungsi, tetapi sangat sedikit waktu untuk panggilan kemudian (kecuali meminta array yang lebih besar).
  • The standardArray tidak permanen cadangan ruang sebanyak array terbesar Anda minta.

Tetapi jika itu sesuai dengan apa yang Anda lakukan, mungkin ada hasilnya. Penempatan waktu yang tidak resmi

for (var n=10000;n>0;n--) {var b = newArrayWithSize(10000);b[0]=0;}

di cukup cepat (sekitar 50 ms untuk 10.000 mengingat bahwa dengan n = 1000000 butuh sekitar 5 detik), dan

for (var n=10000;n>0;n--) {
  var b = [];for (var add=10000;add>0;add--) {
    b.push(undefined);
  }
}

lebih dari satu menit (sekitar 90 detik untuk 10.000 pada konsol chrome yang sama, atau sekitar 2000 kali lebih lambat). Itu tidak hanya alokasi, tetapi juga 10.000 dorongan, untuk loop, dll.

wils
sumber
jika setiap kali Anda mencapai akhir array yang Anda duplikat, kompleksitas memasukkan nilai n masih O (n) sehingga tidak ada perbedaan dalam kompleksitas (tetapi lebih lambat).
Tomer Wolberg
@TomerWolberg, saya sudah mengubah kata-kata saya. Ini masalah apakah metode dorong memiliki kompleksitas yang lebih tinggi daripada inisialisasi / salinan anggota individu dengan irisan. AFAIK bahwa mereka berdua waktu yang konstan, setidaknya mereka bisa jadi saya menggunakan kata 'kecepatan' sebagai gantinya.
wils
8

(ini mungkin lebih baik sebagai komentar, tetapi terlalu lama)

Jadi, setelah membaca ini saya ingin tahu apakah pra-alokasi sebenarnya lebih cepat, karena secara teori seharusnya. Namun, blog ini memberikan beberapa saran untuk mencegahnya http://www.html5rocks.com/en/tutorials/speed/v8/ .

Jadi masih ragu, saya mengujinya. Dan ternyata itu ternyata lebih lambat.

var time = Date.now();
var temp = [];
for(var i=0;i<100000;i++){
    temp[i]=i;
}
console.log(Date.now()-time);


var time = Date.now();
var temp2 = new Array(100000);
for(var i=0;i<100000;i++){
    temp2[i] = i;
}
console.log(Date.now()-time); 

Kode ini menghasilkan yang berikut setelah beberapa santai berjalan:

$ node main.js 
9
16
$ node main.js 
8
14
$ node main.js 
7
20
$ node main.js 
9
14
$ node main.js 
9
19
j03m
sumber
3
Menarik, itu sepertinya tidak terduga, jadi saya membuat tes JSPerf . Hasil Chrome cocok dengan tes Node Anda, tetapi Firefox dan IE sedikit lebih cepat ketika Anda pra-mengalokasikan ruang untuk array.
Michael Martin-Smucker
1
@ MichaelMartin-Smucker Tunggu ... apakah ini berarti V8 sebenarnya tidak sepenuhnya dioptimalkan dan sempurna?!?!? : P
Zeb McCorkle
1
@ MichaelMartin-Smucker - Saya baru saja menjalankan jsperf Anda di Chrome Versi 42.0.2311.90 (Lebih spesifik - Pengujian di Chrome 42.0.2311.90 32-bit pada Windows Server 2008 R2 / 7 64-bit) dan array berukuran dinamis 69% lebih lambat .
Yellen
1
Dito. (Saya menulis tes simpul asli) Di chrome 42.0.2311.90 pada windows secara dinamis berukuran 81% lebih lambat :). Tapi tes asli kami sudah lebih dari setahun yang lalu sekarang. Waktu terus berjalan, slippin ....
j03m
1
Menarik ... dari hasil di jsperf sepertinya pra-alokasi mendapat dorongan besar di Chrome 38. Masa depan!
Michael Martin-Smucker
8
var arr=[];
arr[5]=0;
alert("length="+arr.length); // gives 6
pengguna1067305
sumber
2
Ya, namun console.log (arr) memberikan [5: 0]ini adalah array yang jarang dan mungkin bukan yang diinginkan.
dreftymac
7

Ini solusi lain

var arr = Array.apply( null, { length: 4 } );
arr;  // [undefined, undefined, undefined, undefined] (in Chrome)
arr.length; // 4

Argumen pertama apply()adalah objek yang mengikat ini, yang tidak kami pedulikan di sini, jadi kami atur null.

Array.apply(..)memanggil Array(..)fungsi dan menyebarkan nilai { length: 3 }objek sebagai argumennya.

zangw
sumber
Saya tidak mengerti mengapa jawaban ini mendapat downvote. Sebenarnya ini hack yang bagus. Berarti Anda tidak dapat menggunakan new Array(n)untuk menginisialisasi array seperti ini new Array(n).map(function(notUsed,index){...}), tetapi dengan pendekatan ini, seperti yang disebutkan @ zangw, Anda dapat melakukannya. +1 dari saya.
Victor.Palyvoda
3

Konstruktor array memiliki sintaks yang ambigu , dan JSLint hanya menyakiti perasaan Anda.

Juga, kode contoh Anda rusak, varpernyataan kedua akan memunculkan a SyntaxError. Anda sedang mengatur properti lengtharray test, jadi tidak perlu yang lain var.

Sejauh pilihan Anda, array.lengthadalah satu-satunya "bersih". Pertanyaannya adalah, mengapa Anda perlu mengatur ukuran di tempat pertama? Cobalah untuk memperbaiki kode Anda untuk menghilangkan ketergantungan itu.

Ivo Wetzel
sumber
Woops, awasi baik pada detik itu var test. Itu adalah salinan dan tempelan ceroboh di pihak saya.
Michael Martin-Smucker
@IvoWetzel, Anda ingin mengatur ukuran untuk meningkatkan kinerja. Array JS adalah array dinamis . Jika Anda tidak mengatur ukuran (atau lebih tepatnya, kapasitasnya), JS akan mengalokasikan array ukuran standar. Jika Anda kemudian menambahkan lebih banyak elemen daripada yang bisa muat, itu harus menumbuhkan array, yang berarti bahwa secara internal akan mengalokasikan array baru dan kemudian menyalin semua elemen.
Domi
3

Dengan asumsi bahwa panjang Array adalah konstan. Dalam Javascript, Ini yang kami lakukan:

const intialArray = new Array(specify the value);

mohan babu
sumber
2

Seperti dijelaskan di atas, menggunakan new Array(size)agak berbahaya. Alih-alih menggunakannya secara langsung, letakkan di dalam "fungsi pembuat array". Anda dapat dengan mudah memastikan bahwa fungsi ini bebas bug dan Anda terhindar dari bahaya menelepon new Array(size)langsung. Selain itu, Anda dapat memberikan nilai awal default opsional. createArrayFungsi ini melakukan hal itu:

function createArray(size, defaultVal) {
    var arr = new Array(size);
    if (arguments.length == 2) {
        // optional default value
        for (int i = 0; i < size; ++i) {
            arr[i] = defaultVal;
        }
    }
    return arr;
}
Domi
sumber
1

Dalam sebagian besar jawaban, disarankan ke fillarray karena jika tidak, "Anda tidak dapat mengulanginya" , tetapi ini tidak benar. Anda dapat mengulangi array yang kosong, hanya saja tidak dengan forEach. Sementara loop, untuk loop dan untuk loop saya bekerja dengan baik.

const count = Array(5);

Tidak bekerja.

console.log('---for each loop:---');
count.forEach((empty, index) => {
    console.log(`counting ${index}`);
});

Pekerjaan ini:

console.log('---for of loop:---');
for (let [index, empty] of count.entries()) {
  console.log(`counting for of loop ${index}`);
}

console.log('---for i loop:---');
for (let i = 0, il = count.length; i < il; ++i) {
  console.log(`counting for i loop ${i}`);
}

console.log('---while loop:---');
let index = 0;
while (index < count.length) { 
  console.log(`counting while loop ${index}`); 
  index++; 
}

Periksa biola ini dengan contoh di atas.

Juga angulars *ngForberfungsi dengan baik dengan array kosong:

<li *ngFor="let empty of count; let i = index" [ngClass]="
  <span>Counting with *ngFor {{i}}</span>
</li>
Melayu
sumber
-1

Anda dapat mengatur panjang array dengan menggunakan array.length = youValue

Jadi itu akan terjadi

var myArray = [];
myArray.length = yourValue;
ajoposor
sumber
-3

Alasan Anda tidak boleh menggunakan new Arrayditunjukkan oleh kode ini:

var Array = function () {};

var x = new Array(4);

alert(x.length);  // undefined...

Beberapa kode lain dapat mengacaukan dengan variabel Array. Saya tahu ini agak terlalu jauh bahwa siapa pun akan menulis kode seperti itu, tetapi masih ...

Juga, seperti yang dikatakan Felix King, antarmuka sedikit tidak konsisten, dan dapat menyebabkan beberapa bug yang sangat sulit dilacak.

Jika Anda menginginkan array dengan length = x, diisi dengan undefined (seperti yang new Array(x)akan dilakukan), Anda bisa melakukan ini:

var x = 4;
var myArray = [];
myArray[x - 1] = undefined;

alert(myArray.length); // 4
nickf
sumber
48
Menurut alasan ini Anda tidak boleh menggunakan alertdan undefined, karena beberapa kode lain dapat mengacaukannya. Contoh kedua kurang dapat dibaca daripada new Array(4), dan tidak memberi Anda hasil yang sama: jsfiddle.net/73fKd
Alexey Lebedev
25
Jawaban ini aneh
Marco Demaio
6
Anda tidak dapat menghindari orang main-main dengan objek global dalam JavaScript; hanya tidak melakukan itu atau menggunakan kerangka kerja di mana orang melakukan itu.
Richard Connamacher
Dalam chrome repl saat ini: j = new Array (4); j.length; // hasil dalam 4
Parris