You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/05-data-types/06-iterable/article.md
+26-26Lines changed: 26 additions & 26 deletions
Original file line number
Diff line number
Diff line change
@@ -3,13 +3,13 @@
3
3
4
4
Gli oggetti *iterabili* sono una generalizzazione degli array. Questo concetto consente a qualsiasi oggetto di essere utilizzato in un ciclo `for..of`.
5
5
6
-
Ovviamente, gli array sono oggetti iterabili. Ma ci sono molti altri oggetti integrati, che sono altrettanto iterabili. Ad esempio, anche le stringhe sono iterabili. Come vedremo a breve, molti operatori si appoggiano a questo.
6
+
Ovviamente, gli array sono oggetti iterabili. Ma ci sono molti altri oggetti integrati, che sono altresì iterabili. Ad esempio, le stringhe.
7
7
8
8
Se un oggetto rappresenta una collezione (lista, insieme) di qualcosa, allora `for..of` è un ottimo modo per eseguire un ciclo, quindi ora vedremo come farlo funzionare correttamente.
9
9
10
10
## Symbol.iterator
11
11
12
-
Possiamo spiegare semplicemente il funzionamento degli oggetti iterabili costruendone uno nostro.
12
+
Possiamo spiegare meglio il funzionamento degli oggetti iterabili costruendone uno nostro.
13
13
14
14
Ad esempio, abbiamo un oggetto, che non è un array, ma sembra essere adatto ad un `for..of`.
15
15
@@ -25,12 +25,12 @@ let range = {
25
25
// for(let num of range) ... num=1,2,3,4,5
26
26
```
27
27
28
-
Per rendere iterabile l'oggetto `range` (e poter quindi utilizzare correttamente `for..of`) abbiamo bisogno di aggiungere un metodo chiamato `Symbol.iterator` (uno speciale simbolo integrato).
28
+
Per rendere iterabile l'oggetto `range` (e poter quindi utilizzare correttamente `for..of`) abbiamo bisogno di aggiungervi un metodo chiamato `Symbol.iterator` (uno speciale simbolo integrato).
29
29
30
30
1. Quando `for..of` inizia, prova a chiamare questo metodo (o ritorna un errore se non lo trova). Il metodo deve ritornare un *iteratore* -- un oggetto con il metodo `next`.
31
31
2. La possibilità di avanzare di `for..of` funziona *solamente con l'oggetto ritornato*.
32
32
3. Quando `for..of` vuole il prossimo valore, chiama `next()` su quell'oggetto.
33
-
4. Il risultato di `next()` deve avere la forma `{done: Boolean, value: any}`, dove `done=true` significa che l'iterazione è completa, altrimenti `value` deve contenere il nuovo valore.
33
+
4. Il risultato di `next()` deve avere la forma `{done: Boolean, value: any}`, dove `done=true` significa che l'iterazione è completa, altrimenti `value` deve contenere il valore successivo.
// 3. next() viene invocato ad ogni iterazione del ciclo for..ot
52
+
// 3. next() viene invocato ad ogni iterazione del ciclo for..of
53
53
next() {
54
54
// 4. dovrebbe ritornare il valore sotto forma di oggetto {done:.., value :...}
55
55
if (this.current<=this.last) {
@@ -70,11 +70,11 @@ for (let num of range) {
70
70
Da notare la caratteristica fondamentale degli oggetti iterabili: un importante separazione di concetti:
71
71
72
72
- Il `range` stesso non possiede un metodo `next()`.
73
-
- Invece, un altro oggetti, chiamato "iteratore" viene creato dalla chiamata `range[Symbol.iterator]()`, e gestisce l'intera iterazione.
73
+
- Invece, un altro oggetto, detto "iteratore", viene creato dalla chiamata `range[Symbol.iterator]()`, e gestisce l'intera iterazione.
74
74
75
75
Quindi, l'oggetto iteratore è separato da quello su cui itera.
76
76
77
-
Tecnicamente, potremmo unirli e utilizzare `range` stesso, per rendere il codice più semplice
77
+
Tecnicamente, per rendere il codice più semplice, potremmo unirli e utilizzare `range` stesso.
78
78
79
79
Come nel seguente codice:
80
80
@@ -102,14 +102,14 @@ for (let num of range) {
102
102
}
103
103
```
104
104
105
-
Ora `range[Symbol.iterator]()` ritorna l'oggetto `range` stesso: questo ha necessariamente il metodo `next()` e memorizza il progresso di iterazione in `this.current`. Più corto? Si. E molte volte può andare bene.
105
+
Ora `range[Symbol.iterator]()` ritorna l'oggetto `range` stesso: questo ha il metodo `next()`necessario e memorizza il progresso dell'iterazione in `this.current`. Più corto? Sì. E molte volte può andare bene.
106
106
107
-
Il lato negativo è che ora è impossibile avere due cicli `for..of` che iterano sull'oggetto contemporaneamente: infatti condividerebbero lo stesso stato di iterazione, poiché c'è solo un oggetto iteratore -- l'oggetto stesso. In ogni caso due cicli `for..of` simultanei sono molto rari, realizzabili solo in alcun scenari asincroni.
107
+
Il lato negativo è che ora è impossibile avere due cicli `for..of` che iterano sull'oggetto contemporaneamente: infatti condividerebbero lo stesso stato di iterazione, poiché c'è solo un oggetto iteratore -- l'oggetto stesso. In ogni caso due cicli `for..of` simultanei sono molto rari, persino in alcuni scenari asincroni.
108
108
109
-
```smart header="Infiniti oggetti iterabili"
110
-
Sono possibili anche infiniti oggetti iterabili. Ad esempio, l'oggetto `range` diventa infinito su `range.to = Infinity`. Oppure possiamo creare un oggetto iterabile che generi uninfinita sequenza di numeri pseudo-casuali.
109
+
```smart header="Iteratori infiniti"
110
+
Sono possibili anche iteratori infiniti. Ad esempio, l'oggetto `range` diventa infinito quando `range.to = Infinity`. Oppure possiamo creare un oggetto iterabile che generi un'infinita sequenza di numeri pseudo-casuali.
111
111
112
-
Non c'è alcun limite su `next`, può ritornare più e più valori.
112
+
Non c'è alcun limite per `next`: può ritornare più e più valori.
113
113
114
114
Ovviamente, il ciclo `for..of` diventerebbe infinito. Possiamo comunque fermarlo con `break`.
115
115
```
@@ -141,7 +141,7 @@ for (let char of str) {
141
141
142
142
Normalmente, il funzionamento degli iteratori è nascosto al codice esterno. C'è un ciclo `for..of` , che funziona, e questo è tutto ciò che serve sapere.
143
143
144
-
Ma per capire approfonditamente, vediamo come creare esplicitamente un iteratore.
144
+
Ma per approfondire, vediamo come creare esplicitamente un iteratore.
145
145
146
146
Proveremo ad iterare su una stringa allo stesso modo di un ciclo `for..of`, ma con una chiamata diretta. Questo codice crea un iteratore per stringhe e lo richiama "manualmente":
147
147
@@ -166,7 +166,7 @@ Raramente è necessario, ma ci fornisce maggiore controllo sul processo di itera
166
166
167
167
## Iteratori e simil-array [#array-like]
168
168
169
-
Ci sono due termini ufficiali che sembrano simili, ma sono diversi. E' utile essere certi di aver ben capito la differenza per evitare confusione.
169
+
Ci sono due termini ufficiali che sembrano simili, ma sono diversi. Dobbiamo essere certi di aver ben capito la differenza per evitare confusione.
170
170
171
171
- Gli *oggetti iterabili* sono oggetti che implementano il metodo `Symbol.iterator`, come descritto sopra.
172
172
-*Array-like* (simil-array) sono oggetti che hanno indici e una proprietà `length`, per questo assomigliano ai classici array.
@@ -213,7 +213,7 @@ let arr = Array.from(arrayLike); // (*)
213
213
alert(arr.pop()); // World (il metodo funziona)
214
214
```
215
215
216
-
`Array.from` alla riga `(*)` prende l'oggetto, esamina se questo è un iterabile o un array-like, successivamente crea un nuova array e copia al suo interno tutti gli elementi.
216
+
`Array.from` alla riga `(*)` prende l'oggetto, controlla se questo è un iterabile o un array-like, e successivamente crea un nuovo array e copia al suo interno tutti gli elementi.
217
217
218
218
Si comporta allo stesso modo con un oggetto iterabile:
219
219
@@ -228,7 +228,7 @@ La sintassi completa di `Array.from` consente di fornire una funzione opzionale
228
228
Array.from(obj[, mapFn, thisArg])
229
229
```
230
230
231
-
Il secondo argomento `mapFn`dovrebbe essere la funzione da applicare ad ogni elemento prima di aggiungerlo all'array, mentre `thisArg` ci consente di impostare `this`.
231
+
Il secondo argomento `mapFn`(opzionale) è una funzione da applicare ad ogni elemento prima di aggiungerlo all'array, mentre `thisArg` ci consente di impostare `this`.
232
232
233
233
Ad esempio:
234
234
@@ -241,7 +241,7 @@ let arr = Array.from(range, num => num * num);
241
241
alert(arr); // 1,4,9,16,25
242
242
```
243
243
244
-
Qui utilizziamo `Array.from` per convertire una strina in un array di caratteri:
244
+
Qui utilizziamo `Array.from` per convertire una stringa in un array di caratteri:
245
245
246
246
```js run
247
247
let str ='𝒳😂';
@@ -254,7 +254,7 @@ alert(chars[1]); // 😂
254
254
alert(chars.length); // 2
255
255
```
256
256
257
-
A differenza di `str.split`, si basa sulla natura (oggetto iterabile) del tipo stringa e quindi, proprio come `for..of`, funziona correttamente con le coppie surrogate.
257
+
A differenza di `str.split`, si basa sulla caratteristica di oggetto iterabile del tipo stringa e quindi, proprio come `for..of`, funziona correttamente con le coppie surrogate.
258
258
259
259
Tecnicamente qui facciamo la stessa cosa:
260
260
@@ -271,7 +271,7 @@ alert(chars);
271
271
272
272
...Ma è più breve.
273
273
274
-
Possiamo anche eseguire uno `slice` consapevolmente:
274
+
Possiamo anche eseguire un surrogato di `slice`:
275
275
276
276
```js run
277
277
functionslice(str, start, end) {
@@ -292,15 +292,15 @@ alert( str.slice(1, 3) ); // spazzatura (due pezzi da coppie surrogate different
292
292
Gli oggetti che possono essere utilizzati in `for..of` vengono detti *iterabili*.
293
293
294
294
- Tecnicamente, gli oggetti iterabili devono implementare un metodo chiamato `Symbol.iterator`.
295
-
- Il risultato di `obj[Symbol.iterator]` viene chiamato un *iteratore*. Esso si occupa di gestire l'intero processo di iterazione.
296
-
- Un iteratore deve avere un metodo denominato `next()` che ritorna un oggetto `{done: Boolean, value: any}`, qui`done:true` indica la fine dell'iterazione, altrimenti `value` contiene il prossimo valore.
297
-
- Il metodo `Symbol.iterator` viene invocato automaticamente da `for..of`, ma possiamo anche farlo noi direttamente.
298
-
- Gli oggetti iterabili integrati come le stringhe o gli array, implementano `Symbol.iterator`.
299
-
- L'iterato che opera con le stringhe è a conoscenza dell'esistenza delle coppie surrogate.
295
+
- Il risultato di `obj[Symbol.iterator]` viene chiamato *iteratore*. Esso si occupa di gestire l'intero processo di iterazione.
296
+
- Un iteratore deve avere un metodo denominato `next()` che ritorni un oggetto `{done: Boolean, value: any}`;`done:true` indica la fine dell'iterazione, altrimenti `value` contiene il prossimo valore.
297
+
- Il metodo `Symbol.iterator` viene invocato automaticamente da `for..of`, ma possiamo anche farlo manualmente.
298
+
- Gli oggetti iterabili integrati, come le stringhe o gli array, implementano `Symbol.iterator`.
299
+
- L'iteratore che opera con le stringhe è a conoscenza dell'esistenza delle coppie surrogate.
300
300
301
301
302
302
Gli oggetti che hanno indici e la proprietà `length` vengono definiti *array-like*. Questo tipo di oggetti possono anche possedere altri metodi e proprietà, ma non possiedono gli stessi metodi integrati dagli array.
303
303
304
-
Se guardassimo dentro la specifica -- vedremmo che la maggior parte dei metodi integrati assumono di operare con oggetti iterabili o array-like piuttosto che con "veri" array, poiché con questi si riesce ad operare in maniera più astratta.
304
+
Se guardassimo dentro la specifica -- vedremmo che la maggior parte dei metodi integrati suppongono di operare con oggetti iterabili o array-like invece che con "veri" array, poiché con i primi si riesce ad operare in maniera più astratta.
305
305
306
-
`Array.from(obj[, mapFn, thisArg])` crea un vero `Array` a partire da un oggetto `obj` iterabile o da un array-like, possiamo cosi applicare i classici metodi dedicati ad array. C'è la possibilità di fornire due argomenti opzionali `mapFn` e `thisArg` che consento di applicare una funzione ad ogni elemento.
306
+
`Array.from(obj[, mapFn, thisArg])` crea un vero `Array` a partire da un oggetto `obj` iterabile o da un array-like; possiamo così applicare i classici metodi dedicati agli array. C'è anche la possibilità di fornire due argomenti opzionali `mapFn` e `thisArg` che consento di applicare una funzione ad ogni elemento prima di aggiungerlo all'array finale.
0 commit comments