Koleksi yang diindeks

Kumpulan terindeks adalah struktur data di mana elemen-elemen disimpan dan diakses menggunakan indeks bernomor. Nilai yang disimpan dalam koleksi yang diindeks akan menetapkan indeks bernomor mulai dari 0, sebuah pola yang disebut "pengindeksan nol". Anda kemudian dapat mengakses nilai yang disimpan dalam koleksi yang diindeks dengan mereferensikan indeksnya.

Array

{i>Array<i} adalah kontainer yang dapat menampung nol atau lebih nilai dari jenis data apa pun, termasuk objek kompleks atau array lainnya. Nilai-nilai yang disimpan dalam {i>array <i}disimpan terkadang disebut "elemen" dari himpunan (array).

Membuat array

Seperti jenis data primitif, ada dua pendekatan untuk membuat array: sebagai literal array, atau dengan memanggil konstruktor Array() bawaan JavaScript dengan new Array(). Menetapkan array ke variabel memberikan hasil yang sangat portabel dan iterable untuk menetapkan beberapa nilai ke satu ID.

Sintaksis literal array menggunakan sepasang tanda kurung ([]) yang mengelilingi nol atau lebih comma separated data:

const myArray = [];

Sintaksis konstruktor array menggunakan objek Array bawaan JavaScript sebagai konstruktor dengan kata kunci new:

const myArray = new Array();

Sintaksis konstruktor array dan literal array memungkinkan Anda mengisi array dengan informasi baru saat dibuat, meskipun sintaksnya sedikit berbeda dalam hal bagaimana ditentukan. Sintaksis literal array menggunakan nilai yang dipisahkan koma di antara tanda kurung, yang terlihat sama dengan larik yang dihasilkan:

const myArray = [ true, null, "String", false ];

myArray;
> [ true, null, "String", false ]

Sintaksis konstruktor array menggunakan nilai yang dipisahkan koma sebagai argumen, dengan satu pengecualian perilaku khusus:

const myArray = new Array( true, null, "String", false );

myArray;
> Array(4) [ true, null, "String", false ]

Jika satu nilai numerik diteruskan ke konstruktor Array, nilai tersebut tidak ditetapkan ke posisi nol dalam larik yang dihasilkan. Sebagai gantinya, array dibuat dengan sejumlah slot kosong untuk nilai. Hal ini tidak memaksakan batasan pada himpunan (array). Item dapat ditambahkan dan dihapus dengan cara yang sama seperti dengan literal array.

// Firefox:\
const myArray = new Array( 10 );

myArray;
> Array(10) [ <10 empty slots> ]
// Chrome:
const myArray = new Array( 10 );

myArray;
> (10) [empty × 10]

Array yang berisi slot kosong (terkadang disebut "array sparse") bersifat khusus penggunaan. Alih-alih berisi nilai undefined atau null secara eksplisit, kosongkan slot sering kali, namun tidak selalu, diperlakukan sebagai nilai undefined di tempat lain dalam di bahasa target.

Anda dapat secara tidak sengaja membuat {i>array <i}renggang menggunakan {i>syntax<i} literal array dengan menghilangkan nilai di antara koma saat Anda membuat literal array:

const myArray = [ true,, true, false ];

myArray;
> Array(4) [ true, <1 empty slot>, true, false ]

Meskipun tidak diperlakukan sebagai nilai yang berarti dalam semua konteks, slot kosong diperhitungkan dalam panjang total {i>array<i}, yang berpotensi mengarah ke hasil yang tidak terduga saat melakukan iterasi nilai-nilai array:

const myArray = [ 1,, 3, 4 ];

myArray.length;
> 4

for( const myValue of myArray ) {
  console.log( myValue + 10 );
}
> 11
> NaN
> 13
> 14

Perilaku ini merupakan sisa dari beberapa keputusan desain JavaScript yang paling awal. Menghindari penggunaan array sparse dalam pengembangan modern.

Seperti halnya primitif, literal array mewarisi properti dan metode dari konstruktor yang sesuai. Karena {i>array <i}adalah bentuk khusus dari objek, {i>array <i}syntax literal dan Sintaksis new Array() memberikan hasil yang identik secara fungsional: objek yang mewarisi prototipenya dari konstruktor Array.

const arrayLiteral = [];
const arrayConstructor = new Array();

typeof arrayLiteral;
> "object"

arrayLiteral;
> Array []
    length: 0
    <prototype>: Array []

typeof arrayConstructor;
> "object"

arrayConstructor;
> Array []
    length: 0
    <prototype>: Array []

Karena kedua hasil tersebut identik, dan sintaksis literal array lebih ringkas dan literal, kami sangat menyarankan untuk selalu menggunakan sintaks literal array daripada Sintaksis new Array().

Mengakses nilai array

Anda dapat mengakses elemen individual dalam {i>array<i} menggunakan notasi tanda kurung, sebuah tanda kurung siku ([]) yang mengikuti array atau ID-nya yang berisi angka yang mengacu pada indeks elemen itu:


[ "My string", "My other string" ][ 1 ];
> "My other string"

const myArray = [ "My string", 50, true ];

myArray[ 0 ];
> "My string"

myArray[ 1 ];
> 50

myArray[ 2 ];
> true

Array di JavaScript tidak bersifat asosiatif, artinya Anda tidak dapat menggunakan string acak sebagai indeks. Namun, model nilai yang digunakan untuk mengakses elemen dalam array dikonversi menjadi nilai string di belakang adegan, yang berarti Anda bisa menggunakan nilai {i>string <i}yang hanya berisi angka karakter:

const myArray = [ "My string", 50, true ];

myArray[ 2 ];
> true

myArray[ "2" ];
> true

Mencoba mengakses elemen di luar yang ditentukan dalam hasil {i>array<i} undefined, bukan error:

const myArray = [ "My string", 50, true ];

myArray[ 9 ];
> undefined

Penetapan destrukturisasi

Penguraian tugas adalah cara ringkas untuk mengekstrak rentang nilai dari array atau objek dan menetapkannya ke sekumpulan pengenal, proses yang terkadang disebut "{i>unpacking<i}" struktur data asli, meskipun tidak memodifikasi array atau objek asli.

Penetapan destrukturisasi menggunakan daftar ID seperti array atau objek untuk untuk melacak nilai. Dalam bentuk yang paling sederhana, disebut pola binding destrukturisasi, setiap nilai diekstrak dari array atau objek dan ditetapkan ke variabel yang sesuai, diinisialisasi menggunakan let atau const (atau var):

const myArray = [ "A string", "A second string" ];
const [ myFirstElement, mySecondElement ] = myArray;

const myObject = { firstValue: false, secondValue: true };
const { myProp, mySecondProp } = myObject;

myFirstElement;
> "My string"

mySecondElement;
> "Second string"

myProp;
> false

mySecondProp;
> true

Gunakan tanda kurung kurawal ({}) untuk menguraikan objek, dan tanda kurung siku ([]) untuk mengurai {i>array<i}.

const myArray = [ false, true ];
const myObject = { firstValue: false, secondValue: true };

const [ myProp, mySecondProp ] = myObject;
> Uncaught TypeError: myObject is not iterable

const { myElement, mySecondElement } = myArray;

myElement
> undefined

mySecondElement;
> undefined

Penguraian array terjadi secara berurutan, dari kiri ke kanan. Masing-masing dalam tugas destrukturisasi sesuai dengan elemen array dengan indeks yang sama:

const myArray = [ 1, 2, 3 ];
const [ myElement, mySecondElement, myThirdElement ] = myArray;

myElement;
> 1

mySecondElement;
> 2

myThirdElement;
> 3

Ini juga merupakan perilaku default saat menguraikan struktur objek. Namun, jika yang digunakan dalam tugas destrukturisasi cocok dengan kunci milik objek properti, pengidentifikasi tersebut diisi dengan properti yang sesuai nilai, apa pun urutannya:

const myObject = { firstValue: 1, secondValue: 2, thirdValue 3 };
const { secondValue, thirdValue, firstValue } = myObject;

firstValue;
> 1

secondValue;
> 2

thirdValue;
> 3

Elemen dapat dilewati dengan menghilangkan ID:

const myArray = [ 1, 2, 3 ];
const [ firstValue,, secondValue ] = myArray;

firstValue;
> 1

secondValue;
> 3

Sintaksis destrukturisasi juga memungkinkan Anda menetapkan nilai default jika terjadi destrukturisasi bisa berupa slot kosong, seperti pada kasus larik renggang, atau Nilai undefined.

const myArray = [ true, ];
const [ firstValue = "Default string.", secondValue = "Default string." ] = myArray;

firstValue;
> true

secondValue;
> "Default string."

Dekonstruksi tidak memaksa nilai ke jenis tertentu. Hal ini berarti bahwa Nilai "falsy", seperti kosong string ("") atau null, masih dianggap sebagai nilai hasil dekonstruksi yang bermakna:

const myArray = [ false, null, 0, "",, undefined ];
const [ falseValue = true, nullValue = true, zeroValue = true, emptyStringValue = true, emptySlot = true, undefinedValue = true ] = myArray;

falseValue;
> false;

nullValue;
> null

zeroValue;
> 0

emptyStringValue;
> ""

emptySlot;
> true

undefinedValue;
> true

Operator sebar

Menggunakan operator penyebaran (...), yang diperkenalkan di ES6 untuk memperluas data iterable seperti array, string, atau literal objek ke dalam elemen individual. Operator {i>spreadsheet<i} segera diikuti oleh struktur data yang akan diperluas atau ID variabel yang berisi struktur data tersebut.

const myArray = [ 1, 2, 3 ];

console.log( ...myArray );
> 1 2 3

Sintaksis selisih digunakan terutama untuk menyalin dan menggabungkan array:

const myArray = [ 4, 5, 6 ];
const mySecondArray = [1, 2, 3, ...myArray ];

mySecondArray;
> Array(6) [ 1, 2, 3, 4, 5, 6 ]

Anda dapat menggunakan sintaksis tersebar hanya dalam konteks berikut:

Untuk array dan string, sintaksis sebar hanya berlaku jika nol atau beberapa argumen dalam panggilan fungsi atau elemen dalam array. Contoh pertama sintaksis operator tersebar di bagian ini berfungsi karena meneruskan ...myArray sebagai argumen ke metode console.log bawaan.

Misalnya, Anda tidak dapat menetapkan data yang disebar ke variabel di luar array lain:

const myArray = [ 1, 2, 3 ];
const spreadVariable = ...myArray;
> Uncaught SyntaxError: Unexpected token '...'

Namun, Anda menyalin array dengan menyebarkan array asli ke literal array:

const myArray = [ 1, 2, 3 ];
const spreadArray = [ ...myArray ];

spreadArray;
> Array(3) [ 1, 2, 3 ]

Untuk menggabungkan elemen yang membentuk dua array atau lebih menjadi satu array:

const myArray = [ 1, 2, 3 ];
const mySecondArray = [ 4, 5, 6 ];
const myNewArray = [ ...myArray, ...mySecondArray ];

myNewArray;
> Array(6) [ 1, 2, 3, 4, 5, 6 ]

Atau, untuk meneruskan elemen array sebagai argumen individual dalam panggilan fungsi:

const myArray = [ true, false ];
const myFunction = ( myArgument, mySecondArgument ) => {
    console.log( myArgument, mySecondArgument );
};

myFunction( ...myArray );
> true false

Operator {i>spreadsheet<i} diperluas agar dapat bekerja dengan literal objek di ES2018. Seperti halnya array, Anda dapat menggunakan operator penyebaran untuk menduplikasi atau menggabungkan objek:

const myObj = { myProperty : true };
const mySecondObj = { ...myObj };

mySecondObj;
> Object { myProperty: true }
const myFirstObj = { myProperty : true };
const mySecondObj = { additionalProperty : true };
const myMergedObj = { ...myFirstObj, ...mySecondObj };

myMergedObj;
> Object { myProperty: true, additionalProperty: true }

Operator penyebaran membuat "shallow" (dangkal) salinan. Artinya, kode ini tidak menyalin prototipe objek asli dan non-enumerable properti baru.

const myCustomPrototype = { protoProp: "My prototype." };
const myObj = Object.create( myCustomPrototype, {
    myEnumerableProp: {
        value: true,
        enumerable: true
    },
    myNonEnumerableProp: {
        value: false,
        enumerable: false
    }
});
const myNewObj = { ...myObj };

myObj;
> Object { myEnumerableProp: true,  }
    myEnumerableProp: true
    myNonEnumerableProp: false
    <prototype>: Object { protoProp: "My prototype." }

myNewObj;
> Object { myEnumerableProp: true }
    myEnumerableProp: true
    <prototype>: Object {  }

Perlu diingat bahwa array dan objek tidak dapat digunakan secara bergantian. Anda tidak bisa sebarkan objek ke dalam array, atau array.

Operator istirahat

Meskipun sintaksis operator itu sendiri sama, operator sisanya (...) melakukan fungsi yang berlawanan berdasarkan konteks yang digunakannya. Daripada fokus pada memperluas struktur data iterable menjadi elemen individu, seperti pada tugas destrukturisasi atau sebagai parameter fungsi, operator sisanya menggabungkan elemen ke dalam struktur data yang iterable. Namanya berasal dari digunakan untuk mengumpulkan "sisanya" dari satu set nilai data.

Saat digunakan dengan tugas destrukturisasi, sintaksisnya disebut "rest property" sintaksis.

const myArray = [ "First", "Second", "Third", "Fourth", "Fifth" ];

[ myFirstElement, mySecondElement, ...remainingElements ] = myArray;

myFirstElement;
> "First"

mySecondElement;
> "Second"

remainingElements;
> Array(3) [ "Third", "Fourth", "Fifth"]

Jika digunakan untuk memberikan argumen dalam jumlah tak terbatas ke fungsi, {i>syntax<i}nya disebut "rest parameter" sintaksis:

function myFunction( ...myParameters ) {
    let result = 0;
    myParameters.forEach( ( myParam ) => {
        result += myParam;
    });
    return result;
};

myFunction( 2, 2 );
> 4

myFunction( 1, 1, 1, 10, 5 );
> 18

myFunction( 10, 11, 25 );
> 46

%TypedArray%

Array berjenis adalah fitur ES6 yang didesain untuk menyimpan data biner terstruktur, untuk saat bekerja dengan file yang diunggah atau WebGL.

Seperti halnya Simbol, %TypedArray% fungsi intrinsik (biasanya didokumentasikan sebagai %TypedArray% atau @@TypedArray sehingga tidak dapat disangka properti global) bukan fungsi konstruktor di arti konvensional, dan Anda tidak dapat memanggilnya dengan new atau memanggilnya secara langsung. Sebaliknya, %TypedArray% mengacu pada superclass induk individu mereka, yang masing-masing bekerja dengan format data biner tertentu. Tujuan superclass %TypedArray% intrinsik menyediakan properti dan metode utilitas yang semua subclass konstruktor %TypedArray% dan instance-nya mewarisi.

Menguji pemahaman Anda

Mengingat `const myArray = [ 30, 50, 70 ];` apa fungsi `myArray[1]` kembali?

50
30
70

Jika `myArray` memiliki tiga nilai, apa yang ditampilkan oleh `myArray[9]`?

Undefined
Pesan error
9
Null