Pertanyaan Mengapa indeks string dalam larik javascript tidak menambah ukuran panjang?


Dalam contoh di bawah ini, array2.length hanya sepuluh, ketika dalam pikiran saya, seharusnya 13. Mengapa indeks "string keyed" tidak menambah panjang array? Saya dapat menyimpan banyak hal dan masih mengaksesnya, dan debugger VS menunjukkan bahwa array tersebut disimpan dengan benar. Jadi mengapa panjangnya tidak bertambah?

var array2 = new Array();
array2["a"] = new Array();
array2["b"] = new Array();
array2["c"] = new Array();
for (var i = 0; i < 10; ++i)
    array2[i] = new Array();

var nothing = "";
for (var i = 0; i < array2.length; ++i)
    nothing = "";

35
2018-03-02 01:39


asal


Jawaban:


Array Javascript tidak boleh memiliki "indeks string". Javascript Array secara eksklusif diindeks secara numerik. Saat Anda menetapkan "string index", Anda mengatur properti objek. Ini setara:

array.a = 'foo';
array['a'] = 'foo';

Properti tersebut bukan bagian dari "penyimpanan data" dari array.

Jika Anda ingin "associative arrays", Anda perlu menggunakan objek:

var obj = {};
obj['a'] = 'foo';

Mungkin visualisasi yang paling sederhana adalah menggunakan notasi literal, bukan new Array:

// numerically indexed Array
var array = ['foo', 'bar', 'baz'];

// associative Object
var dict = { foo : 42, bar : 'baz' };

79
2018-03-02 01:45



Karena panjangnya didefinisikan menjadi satu ditambah indeks angka terbesar dalam larik.

var xs = [];
xs[10] = 17;
console.log( xs.length ); //11

Untuk alasan ini, Anda sebaiknya hanya menggunakan array untuk menyimpan hal-hal yang diindeks oleh angka, menggunakan objek biasa jika Anda ingin menggunakan string sebagai kunci. Juga, sebagai sidenote, itu adalah praktik yang lebih baik untuk menggunakan literal seperti [] atau {} dari pada new Array dan new Object.


11
2018-03-02 01:44



Anda tidak menambahkan item ke array; Anda menambahkan properti ke Array obyek.


7
2018-03-02 01:43



indeks "string keyed" bukan indeks sama sekali, tetapi properti. array2["a"] sama dengan mengatakan array2.a. Ingat bahwa Anda dapat mengatur properti pada setiap jenis variabel dalam javascript, yang persis seperti yang Anda lakukan di sini.


2
2018-03-02 01:44



Seperti dikatakan di atas, gunakan objek untuk array asosiatif.

Jika Anda tidak, Anda tidak akan selalu menyadari bahwa Anda melakukan kesalahan, sampai Anda dengan polos menggunakan "panjang" sebagai indeks larik:

var myArray = [];
myArray["foo"] = "bar"; //works
console.log(myArray["foo"]) //print "bar"
myArray["length"] = "baz" //crash with a "RangeError: Invalid array length"

Itu karena Anda mengganti length atribut array dengan String, yang tidak valid.


1
2017-09-25 09:27



Anda dapat mendorong objek ke array, secara otomatis akan diindeks (integer). Jika Anda ingin menambahkan indeks seperti yang Anda inginkan, maka Anda ingin menjadikannya sebagai objek


0
2017-07-03 06:29