Una raccolta indicizzata è una struttura di dati in cui vengono archiviati gli elementi
a cui si accede tramite indici numerati. I valori archiviati in una raccolta indicizzata vengono
indici numerati assegnati a partire da 0
, un pattern chiamato "indicizzazione zero".
Puoi quindi accedere ai valori archiviati in una raccolta indicizzata facendo riferimento
i relativi indici.
Array
Un array è un container che può contenere zero o più valori di qualsiasi tipo di dati, inclusi oggetti complessi o altri array. I valori archiviati in un array a volte chiamati "elementi" dell'array.
Crea un array
Come per i tipi di dati primitivi, esistono due approcci per creare un array:
un valore letterale di array o richiamando il costruttore Array()
integrato di JavaScript
con new Array()
. L'assegnazione di un array a una variabile offre un'elevata portabilità
e iterabile di assegnazione
più valori in un singolo identificatore.
La sintassi dei valori letterali array utilizza un insieme di parentesi ([]
) che circondano zero o più
valori di dati separati da virgole:
const myArray = [];
La sintassi del costruttore di array utilizza l'oggetto Array
integrato di JavaScript come
con la parola chiave new
:
const myArray = new Array();
Sia la sintassi dei valori letterali dell'array che la sintassi dei costruttori dell'array consentono di compilare un array con informazioni al momento della creazione, sebbene le sintassi siano leggermente diverse da quelle vengono definiti. La sintassi dei valori letterali array utilizza valori separati da virgole tra parentesi quadre, che hanno lo stesso aspetto dell'array risultante:
const myArray = [ true, null, "String", false ];
myArray;
> [ true, null, "String", false ]
La sintassi del costruttore di array prende come argomenti valori separati da virgole, con eccezione comportamentale speciale:
const myArray = new Array( true, null, "String", false );
myArray;
> Array(4) [ true, null, "String", false ]
Quando al costruttore Array
viene passato un singolo valore numerico, tale valore
non viene assegnata alla posizione zero nell'array risultante. Invece, un array
viene creato con il numero di aree vuote per i valori. Ciò non impone alcun
limitazioni all'array. Gli elementi possono essere aggiunti e rimossi nello stesso modo.
come nel caso di un valore letterale di array.
// Firefox:\
const myArray = new Array( 10 );
myArray;
> Array(10) [ <10 empty slots> ]
// Chrome:
const myArray = new Array( 10 );
myArray;
> (10) [empty × 10]
Gli array contenenti slot vuoti (a volte chiamati "matrici sparse") sono speciali
d'uso diversi. Anziché contenere un valore undefined
o null
in modo esplicito, vuoto
gli slot vengono spesso, ma non sempre, trattati come valori undefined
altrove in
lingua.
Puoi creare accidentalmente un array sparso utilizzando la sintassi letterale dell'array omissione di un valore tra le virgole quando crei un valore letterale di array:
const myArray = [ true,, true, false ];
myArray;
> Array(4) [ true, <1 empty slot>, true, false ]
Nonostante non venga considerato un valore significativo in tutti i contesti, uno spazio vuoto viene preso in considerazione nella lunghezza totale dell'array, generando potenzialmente risultati imprevisti durante l'iterazione oltre i valori di un array:
const myArray = [ 1,, 3, 4 ];
myArray.length;
> 4
for( const myValue of myArray ) {
console.log( myValue + 10 );
}
> 11
> NaN
> 13
> 14
Questo comportamento è un blocco di alcune delle prime decisioni di progettazione di JavaScript. Evita di utilizzare array sparsi in uno sviluppo moderno.
Come per le primitive, un valore letterale array
eredita proprietà e metodi dal costruttore corrispondente.
Poiché un array è una forma speciale di oggetto, la sintassi letterale dell'array e
La sintassi new Array()
genera risultati funzionalmente identici: un oggetto che
eredita il prototipo dal costruttore 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 []
Poiché i due risultati sono identici e la sintassi dei valori letterali dell'array è più concisa
e letterale, consigliamo vivamente di utilizzare sempre la sintassi del valore letterale dell'array anziché
Sintassi new Array()
.
Accedi ai valori degli array
Puoi accedere ai singoli elementi all'interno dell'array utilizzando la notazione parentesi quadra, un
insieme di parentesi ([]
) dopo l'array o il relativo identificatore che contiene un
numero che fa riferimento all'indice di quell'elemento:
[ "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
Gli array in JavaScript non sono associativi, il che significa che non puoi usare una stringa arbitraria come indice. Tuttavia, il valore numerico valori utilizzati per accedere agli elementi in un array sono costretti a un valore di stringa dietro le scene, vale a dire che è possibile usare un valore stringa contenente solo caratteri:
const myArray = [ "My string", 50, true ];
myArray[ 2 ];
> true
myArray[ "2" ];
> true
Se provi ad accedere a un elemento esterno a quelli definiti nell'array,
undefined
, non è un errore:
const myArray = [ "My string", 50, true ];
myArray[ 9 ];
> undefined
Destrutturazione del compito
La destrutturazione dell'assegnazione è un modo conciso per estrarre un intervallo di valori o oggetti e assegnandoli a un insieme una procedura chiamata a volte "unpacking" la struttura originale dei dati, senza modificare l'array o l'oggetto originale.
La distruzione dell’assegnazione utilizza un elenco di identificatori di tipo array o oggetto
per tenere traccia dei valori. Nella sua forma più semplice, chiamata binding pattern.
destrutturante, ogni valore viene estratto dall'array o dall'oggetto e assegnato a un
variabile corrispondente, inizializzata utilizzando let
o const
(o 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
Utilizza le parentesi graffe ({}
) per destrutturare un oggetto e le parentesi quadre ([]
) per
destrutturare un array.
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
La distruzione di un array avviene in ordine sequenziale, da sinistra a destra. Ciascuna identificatore nell'assegnazione destrutturante corrisponde all'elemento del array con lo stesso indice:
const myArray = [ 1, 2, 3 ];
const [ myElement, mySecondElement, myThirdElement ] = myArray;
myElement;
> 1
mySecondElement;
> 2
myThirdElement;
> 3
Questo è anche il comportamento predefinito quando si destruttura un oggetto. Tuttavia, se utilizzati nell'assegnazione destrutturante corrispondono alle chiavi del modello proprietà, questi identificatori vengono compilati con la proprietà corrispondente a prescindere dall'ordine in cui sono specificati:
const myObject = { firstValue: 1, secondValue: 2, thirdValue 3 };
const { secondValue, thirdValue, firstValue } = myObject;
firstValue;
> 1
secondValue;
> 2
thirdValue;
> 3
Gli elementi possono essere ignorati omettendo un identificatore:
const myArray = [ 1, 2, 3 ];
const [ firstValue,, secondValue ] = myArray;
firstValue;
> 1
secondValue;
> 3
La destrutturazione della sintassi consente anche di assegnare valori predefiniti nel caso in cui una struttura
è uno spazio vuoto, come nel caso di un array sparsa, oppure
Valore undefined
.
const myArray = [ true, ];
const [ firstValue = "Default string.", secondValue = "Default string." ] = myArray;
firstValue;
> true
secondValue;
> "Default string."
La decostruzione non forza i valori a tipi particolari. Ciò significa che
Valori "falsy", ad esempio vuoto
stringhe (""
) o null
, sono comunque considerate valori scomposti significativi:
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
Operatore di distribuzione
Utilizza l'operatore di distribuzione (...
), introdotto in ES6 per espandere un dati iterabile
come un array, una stringa o un oggetto letterale in singoli elementi.
L'operatore distribuito è immediatamente seguito dalla struttura dei dati da espandere
o l'identificatore di una variabile contenente questa struttura di dati.
const myArray = [ 1, 2, 3 ];
console.log( ...myArray );
> 1 2 3
La sintassi di diffusione viene utilizzata principalmente per copiare e combinare array:
const myArray = [ 4, 5, 6 ];
const mySecondArray = [1, 2, 3, ...myArray ];
mySecondArray;
> Array(6) [ 1, 2, 3, 4, 5, 6 ]
Puoi utilizzare la sintassi distribuita solo nei seguenti contesti:
Per array e stringhe, la sintassi di diffusione si applica solo dove zero o più argomenti
in una chiamata di funzione o gli elementi di un array. Il primo esempio
la sintassi dell'operatore di diffusione in questa sezione funziona perché trasmette ...myArray
come
un argomento al metodo console.log
integrato.
Ad esempio, non puoi assegnare i dati distribuiti a una variabile esterna con un altro array:
const myArray = [ 1, 2, 3 ];
const spreadVariable = ...myArray;
> Uncaught SyntaxError: Unexpected token '...'
Tuttavia, copi un array distribuendo l'array originale in un valore letterale dell'array:
const myArray = [ 1, 2, 3 ];
const spreadArray = [ ...myArray ];
spreadArray;
> Array(3) [ 1, 2, 3 ]
Per unire gli elementi che compongono due o più array in un unico array:
const myArray = [ 1, 2, 3 ];
const mySecondArray = [ 4, 5, 6 ];
const myNewArray = [ ...myArray, ...mySecondArray ];
myNewArray;
> Array(6) [ 1, 2, 3, 4, 5, 6 ]
Oppure per passare gli elementi di un array come singoli argomenti in una chiamata di funzione:
const myArray = [ true, false ];
const myFunction = ( myArgument, mySecondArgument ) => {
console.log( myArgument, mySecondArgument );
};
myFunction( ...myArray );
> true false
L'operatore di distribuzione è stato ampliato per lavorare con i valori letterali degli oggetti in ES2018. Come per gli array, puoi utilizzare l'operatore di diffusione per duplicare o unire oggetti:
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 }
L'operatore di diffusione crea "shallow" copie. Ciò significa che non vengono copiati prototipo dell'oggetto originale e non enumerabile proprietà.
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 { … }
Tieni presente che array e oggetti non possono essere utilizzati in modo intercambiabile. Non puoi distribuire un oggetto in un array o un array in un oggetto.
Operatore REST
Sebbene la sintassi dell'operatore stesso sia la stessa, l'operatore resto (...
)
esegue la funzione opposta in base al contesto in cui è utilizzata. Invece di
espandere una struttura di dati iterabile in singoli elementi, come avviene per
destrutturare un compito o come
parametro di funzione, l'operatore rimanente combina
in una struttura di dati iterabile. Il nome deriva dal fatto che si tratta di
utilizzato per raccogliere "il resto" di un insieme di valori di dati.
Quando viene utilizzata con un'assegnazione destrutturante, la sintassi è denominata "proprietà REST" a riga di comando.
const myArray = [ "First", "Second", "Third", "Fourth", "Fifth" ];
[ myFirstElement, mySecondElement, ...remainingElements ] = myArray;
myFirstElement;
> "First"
mySecondElement;
> "Second"
remainingElements;
> Array(3) [ "Third", "Fourth", "Fifth"]
Quando utilizzato per fornire un numero indefinito di argomenti a una funzione, la sintassi è chiamata "parametro resto" sintassi:
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%
Gli array digitati sono una funzionalità di ES6 progettata per archiviare dati binari strutturati, per ad esempio quando lavori con i file caricati WebGL.
Come per i simboli, %TypedArray%
funzione intrinseca (generalmente documentata come %TypedArray%
o @@TypedArray
pertanto non può essere scambiata per una proprietà globale) non è una funzione costruttore in
vale a dire convenzionale e non è possibile richiamarlo con new
o chiamarlo direttamente.
%TypedArray%
si riferisce invece a una superclasse principale di un individuo
ognuno dei quali funziona con uno specifico formato di dati binari. La
la superclasse %TypedArray%
intrinseca fornisce proprietà e metodi di utilità che
tutte le sottoclassi del costruttore %TypedArray%
e le relative istanze ereditano.
Verifica le tue conoscenze
Dato "const myArray = [ 30, 50, 70 ];", cosa fa "myArray[1]" restituire?
70
Se "myArray" ha tre valori, cosa restituisce "myArray[9]"?
Undefined
9
Null