Skip to content

Commit cd721ea

Browse files
authored
Merge pull request #235 from Dorin-David/Article/iterables
review iterables
2 parents f0c2eee + 5f7491b commit cd721ea

File tree

1 file changed

+26
-26
lines changed

1 file changed

+26
-26
lines changed

1-js/05-data-types/06-iterable/article.md

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33

44
Gli oggetti *iterabili* sono una generalizzazione degli array. Questo concetto consente a qualsiasi oggetto di essere utilizzato in un ciclo `for..of`.
55

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.
77

88
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.
99

1010
## Symbol.iterator
1111

12-
Possiamo spiegare semplicemente il funzionamento degli oggetti iterabili costruendone uno nostro.
12+
Possiamo spiegare meglio il funzionamento degli oggetti iterabili costruendone uno nostro.
1313

1414
Ad esempio, abbiamo un oggetto, che non è un array, ma sembra essere adatto ad un `for..of`.
1515

@@ -25,12 +25,12 @@ let range = {
2525
// for(let num of range) ... num=1,2,3,4,5
2626
```
2727

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).
2929

3030
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`.
3131
2. La possibilità di avanzare di `for..of` funziona *solamente con l'oggetto ritornato*.
3232
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.
3434

3535
Qui l'implementazione completa per `range`:
3636

@@ -49,7 +49,7 @@ range[Symbol.iterator] = function() {
4949
current: this.from,
5050
last: this.to,
5151

52-
// 3. next() viene invocato ad ogni iterazione del ciclo for..ot
52+
// 3. next() viene invocato ad ogni iterazione del ciclo for..of
5353
next() {
5454
// 4. dovrebbe ritornare il valore sotto forma di oggetto {done:.., value :...}
5555
if (this.current <= this.last) {
@@ -70,11 +70,11 @@ for (let num of range) {
7070
Da notare la caratteristica fondamentale degli oggetti iterabili: un importante separazione di concetti:
7171

7272
- 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.
7474

7575
Quindi, l'oggetto iteratore è separato da quello su cui itera.
7676

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.
7878

7979
Come nel seguente codice:
8080

@@ -102,14 +102,14 @@ for (let num of range) {
102102
}
103103
```
104104

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? . E molte volte può andare bene.
106106

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.
108108

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 un infinita 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.
111111
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.
113113
114114
Ovviamente, il ciclo `for..of` diventerebbe infinito. Possiamo comunque fermarlo con `break`.
115115
```
@@ -141,7 +141,7 @@ for (let char of str) {
141141

142142
Normalmente, il funzionamento degli iteratori è nascosto al codice esterno. C'è un ciclo `for..of` , che funziona, e questo è tutto ciò che serve sapere.
143143

144-
Ma per capire approfonditamente, vediamo come creare esplicitamente un iteratore.
144+
Ma per approfondire, vediamo come creare esplicitamente un iteratore.
145145

146146
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":
147147

@@ -166,7 +166,7 @@ Raramente è necessario, ma ci fornisce maggiore controllo sul processo di itera
166166

167167
## Iteratori e simil-array [#array-like]
168168

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.
170170

171171
- Gli *oggetti iterabili* sono oggetti che implementano il metodo `Symbol.iterator`, come descritto sopra.
172172
- *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); // (*)
213213
alert(arr.pop()); // World (il metodo funziona)
214214
```
215215

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.
217217

218218
Si comporta allo stesso modo con un oggetto iterabile:
219219

@@ -228,7 +228,7 @@ La sintassi completa di `Array.from` consente di fornire una funzione opzionale
228228
Array.from(obj[, mapFn, thisArg])
229229
```
230230

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`.
232232

233233
Ad esempio:
234234

@@ -241,7 +241,7 @@ let arr = Array.from(range, num => num * num);
241241
alert(arr); // 1,4,9,16,25
242242
```
243243

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:
245245

246246
```js run
247247
let str = '𝒳😂';
@@ -254,7 +254,7 @@ alert(chars[1]); // 😂
254254
alert(chars.length); // 2
255255
```
256256

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.
258258

259259
Tecnicamente qui facciamo la stessa cosa:
260260

@@ -271,7 +271,7 @@ alert(chars);
271271

272272
...Ma è più breve.
273273

274-
Possiamo anche eseguire uno `slice` consapevolmente:
274+
Possiamo anche eseguire un surrogato di `slice`:
275275

276276
```js run
277277
function slice(str, start, end) {
@@ -292,15 +292,15 @@ alert( str.slice(1, 3) ); // spazzatura (due pezzi da coppie surrogate different
292292
Gli oggetti che possono essere utilizzati in `for..of` vengono detti *iterabili*.
293293

294294
- 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.
300300

301301

302302
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.
303303

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.
305305

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

Comments
 (0)