Skip to content

Commit 567aac3

Browse files
authored
Merge pull request #165 from javascript-tutorial/sync-468e3552
Sync with upstream @ 468e355
2 parents b64406d + 0a59ec9 commit 567aac3

File tree

7 files changed

+89
-57
lines changed

7 files changed

+89
-57
lines changed

1-js/02-first-steps/08-operators/article.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ alert( x ); // 5
223223

224224
Il fatto che il simbolo `=` sia un operatore e non un costrutto "magico" del linguaggio, ha delle interessanti implicazioni.
225225

226-
Molti operatori in Javascript restituiscono un valore. Questo è ovvio per `+` e `-`, ma è altrettanto vero per `=`.
226+
Tutti gli operatori in Javascript restituiscono un valore. Questo è ovvio per `+` e `-`, ma è altrettanto vero per `=`.
227227

228228
La chiamata `x = value` scrive `value` in `x` *e quindi lo restituisce*.
229229

@@ -480,4 +480,4 @@ for (*!*a = 1, b = 3, c = a * b*/!*; a < 10; a++) {
480480
}
481481
```
482482
483-
Questo "trick" viene utilizzato in molti framework JavaScript, per questo l'abbiamo menzionato. Ma solitamente non migliora la leggibilità del codice, quindi dovremmo pensarci bene prima di scrivere questo tipo di espressioni.
483+
Questo "trick" viene utilizzato in molti framework JavaScript, per questo l'abbiamo menzionato. Ma solitamente non migliora la leggibilità del codice, quindi dovremmo pensarci bene prima di scrivere questo tipo di espressioni.

1-js/02-first-steps/18-javascript-specials/article.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -275,9 +275,9 @@ Abbiamo studiato tre modi per creare funzioni in JavaScript:
275275
```
276276
277277
278-
- Le funzioni possono avere variabili locali: queste vengono dichiarate all'interno del ciclo. Queste variabili sono visibili solamente all'interno della funzione.
278+
- Le funzioni possono avere variabili locali: queste vengono dichiarate all'interno della funzione stessa o nella lista parametri. Queste variabili sono visibili solamente all'interno della funzione.
279279
- I parametri possono avere valori di default: `function sum(a = 1, b = 2) {...}`.
280-
- Le funzioni ritornano sempre qualcosa. Se non c'è nessuna istruzione `return`, allora il risultato `undefined`.
280+
- Le funzioni ritornano sempre qualcosa. Se non c'è nessuna istruzione `return`, allora viene restituito `undefined`.
281281

282282
Per più informazioni: vedi <info:function-basics>, <info:arrow-functions-basics>.
283283

1-js/03-code-quality/01-debugging-chrome/article.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ Ci sono dei bottoni appositi nella parte superiore del pannello di destra. Provi
135135
Continuando a cliccare eseguiremo lo script un passo per volta.
136136

137137
<span class="devtools" style="background-position:-62px -192px"></span> -- "Step over": esegue il prossimo comando, ma *non entra nella funzione*, hotkey `key:F10`.
138-
: Molto simile al comando "Step", ma si comporta diversamente nel caso in cui la prossima istruzione sia una chiamata a funzione. Cioè: non una funzione built-in come `alert`, ma una funzione definita da noi.
138+
: Molto simile al comando "Step", ma si comporta diversamente nel caso in cui l'istruzione successiva sia una chiamata a funzione. O meglio: non una funzione built-in come `alert`, ma una funzione definita da noi.
139139

140140
Il comando "Step" entra nella funzione e mette in pausa l'esecuzione, mentre "Step over" esegue la chiamata a funzione, saltandone il contenuto.
141141

1-js/05-data-types/10-destructuring-assignment/article.md

Lines changed: 78 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,22 @@
22

33
Le due strutture dati più utilizzate in JavaScritp sono `Object` e `Array`.
44

5-
Gli oggetti ci consentono di raccogliere molti pezzi di informazione in una singola entità, mentre gli array ci consentono di memorizzare collezioni ordinate. Possiamo quindi costruire un oggetto o un array e gestirlo come singola entità, oppure passarlo ad una funzione.
5+
- Gli oggetti ci consentono di creare un'unica entità che memorizza elementi nel formato chiave-valore
6+
- Gli array ci consentono di raccogliere elementi in elenchi ordinati.
67

7-
*L'assegnamento di destrutturazione* è una speciale sintassi che ci consente di "spacchettare" oggetti o array in un insieme di variabili, che in molti casi possono risultare più comode.
8-
La destrutturazione inoltre funziona molto bene con le funzione complesse che richiedono molti parametri, valori di default, molto presto vedremo come gestire anche questi.
8+
A volte, quando li passiamo ad una funzione, potebbe non èssere necessario tutto l'oggetto/array, ma solo una parte di esso.
9+
10+
*L'assegnamento di destrutturazione (Destructuring assignment)* è una speciale sintassi che ci consente di "spacchettare" oggetti o array in un gruppi di variabili, questo a volte risulta molto convenente.
11+
12+
La destrutturazione funziona alla grande anche con funzioni complesse che hanno molti parametri, valori predefiniti e così via. Presto lo vedremo.
913

1014
## Destrutturazione di un array
1115

12-
Un esempio di come un array viene destrutturato in variabili:
16+
Ecco un esempio di come un array viene destrutturato in variabili:
1317

1418
```js
1519
// abbiamo un array con nome e cognome
16-
let arr = ["Ilya", "Kantor"]
20+
let arr = ["John", "Smith"]
1721

1822
*!*
1923
// assegnamento di destrutturazione
@@ -22,20 +26,25 @@ let arr = ["Ilya", "Kantor"]
2226
let [firstName, surname] = arr;
2327
*/!*
2428

25-
alert(firstName); // Ilya
26-
alert(surname); // Kantor
29+
alert(firstName); // John
30+
alert(surname); // Smith
2731
```
2832

2933
Ora possiamo lavorare con le variabili piuttosto che con i membri dell'array.
3034

31-
Risulta utile se combinata con `split` o altri metodi che ritorna un array:
35+
Risulta utilissima se combinata con `split` o altri metodi che ritornano un array:
3236

33-
```js
34-
let [firstName, surname] = "Ilya Kantor".split(' ');
37+
```js run
38+
let [firstName, surname] = "John Smith".split(' ');
39+
alert(firstName); // John
40+
alert(surname); // Smith
3541
```
3642

43+
Come puoi vedere, la sintassi è semplice. Ci sono però molti dettagli peculiari. Vediamo altri esempi, per capirlo meglio.
44+
45+
3746
````smart header="\"Destrutturazione\" non significa \"distruzione\"."
38-
Viene chiamato "assegnamento di destrutturazione", perché "destrutturizza" copiando gli elementi all'interno di variabili. Ma l'array stesso non viene modificato.
47+
Viene chiamato "assegnamento di destrutturazione", perché "destrutturizza" copiando gli elementi all'interno di variabili. Ma l'array in sè non viene modificato.
3948
4049
E' solo un modo breve per scrivere:
4150
```js
@@ -45,8 +54,9 @@ let surname = arr[1];
4554
```
4655
````
4756

48-
````smart header="Ignora gli elementi con la virgola"
49-
Possono essere ignorati degli elementi dell'array inserendo una virgola:
57+
````smart header="Ignora gli elementi usando la virgola"
58+
59+
Gli elementi indesiderati dell'array possono anche essere ignorati tramite una virgola aggiuntiva:
5060
5161
```js run
5262
*!*
@@ -57,10 +67,10 @@ let [firstName, , title] = ["Julius", "Caesar", "Consul", "of the Roman Republic
5767
alert( title ); // Consul
5868
```
5969
60-
Nel codice sopra, il secondo elemento viene ignorato, il terzo viene assegnato a `title`, il resto dell'array viene ignorato.
70+
Nel codice sopra, il secondo elemento viene saltato, il terzo viene assegnato a `title`, il resto dell'array viene ignorato (visto che sono state inserite ulteriori variabili).
6171
````
6272

63-
````smart header="Funziona con qualsiasi itarabile"
73+
````smart header="Funziona con qualsiasi itarabile sulla destra"
6474
6575
... In realtà, possiamo utilizzarlo con qualsiasi iterabile, non solamente con array:
6676
@@ -69,24 +79,25 @@ let [a, b, c] = "abc"; // ["a", "b", "c"]
6979
let [one, two, three] = new Set([1, 2, 3]);
7080
```
7181
82+
Funziona, perchè internamente un'assegnazione di destrutturazione lavora iterando sul valore di destra. E' una specie di "zucchero sintattico" per chiamare `for..of` sul valore a destra di `=` assegnando i valori.
7283
````
7384

74-
7585
````smart header="Assegna a qualsiasi cosa ci sia dalla parte sinistra"
7686
7787
Possiamo inserire qualsiasi cosa sia "assegnabile" alla sinistra.
7888
7989
Ad esempio, la proprietà di un oggetto:
8090
```js run
8191
let user = {};
82-
[user.name, user.surname] = "Ilya Kantor".split(' ');
92+
[user.name, user.surname] = "John Smith".split(' ');
8393
84-
alert(user.name); // Ilya
94+
alert(user.name); // John
95+
alert(user.surname); // Smith
8596
```
8697
8798
````
8899

89-
````smart header="Cicla con .entries()"
100+
````smart header="Eseguire cicli con .entries()"
90101
91102
Nel capitolo precedente abbiamo visto il metodo [Object.entries(obj)](mdn:js/Object/entries).
92103
@@ -98,70 +109,92 @@ let user = {
98109
age: 30
99110
};
100111
101-
// ciclo su chiavi e valori
112+
// ciclo su chiavi/valori
102113
*!*
103114
for (let [key, value] of Object.entries(user)) {
104115
*/!*
105116
alert(`${key}:${value}`); // name:John, poi age:30
106117
}
107118
```
108119
109-
...Lo stesso vale per map:
120+
Codice simile usando `Map` è più semplice, visto che è iterabile:
121+
110122
111123
```js run
112124
let user = new Map();
113125
user.set("name", "John");
114126
user.set("age", "30");
115127
116128
*!*
129+
// Map itera le coppie [key, value], molto comodo per la destrutturazione
117130
for (let [key, value] of user) {
118131
*/!*
119132
alert(`${key}:${value}`); // name:John, then age:30
120133
}
121134
```
122135
````
123136

137+
124138
```smart header="Il trucco dello scambio di varibili"
125-
Un metodo molto conosciuto per lo scambio dei valori di due variabili:
139+
c'è un trucco molto conosciuto per scambiare i valori di due variabili usando l'assegnamento di destrutturazione:
140+
126141
127142
```js run
128143
let guest = "Jane";
129144
let admin = "Pete";
130145
131146
// Scambio dei valori: rende guest=Pete, admin=Jane
147+
*!*
132148
[guest, admin] = [admin, guest];
149+
*/!*
133150
134151
alert(`${guest} ${admin}`); // Pete Jane (scambiati con successo!)
135152
```
136153

137-
Qui creiamo un array temporaneo di due varibili e lo destrutturiamo immediatamente invertendo l'ordine delle variabili.
154+
Nell'esempio creiamo un array temporaneo di due varibili e lo destrutturiamo immediatamente invertendo l'ordine delle variabili.
155+
Nello stesso modo potemmo scambiare i valori di più di sue variabili.
138156

139-
In questo modo possiamo invertire l'ordine di più di due variabili.
140157

158+
### L'operatore rest '...'
141159

142-
### L'operatore resto '...'
160+
Di solito, se l'array è più lungo della lista a sinistra, gli elementi in eccesso vengono ignorati.
143161

144-
Se invece vogliamo destrutturare tutto, non solamente il primo elemento, ma raccogliere anche quello che segue -- passiamo un ulteriore parametro nella forma `"..."`:
162+
Ad esempio, qui vengono presi solo i primi 2 elementi, i restanti vengono semplicemente ignorati:
145163

146164
```js run
147-
let [name1, name2, *!*...rest*/!*] = ["Julius", "Caesar", *!*"Consul", "of the Roman Republic"*/!*];
165+
let [name1, name2] = ["Julius", "Caesar", "Consul", "of the Roman Republic"];
148166

149167
alert(name1); // Julius
150168
alert(name2); // Caesar
169+
// Gli elementi successivi non vengono assegnati
170+
```
171+
172+
Se vogliamo anche ottenere tutto ciò che segue, possiamo aggiungere un altro parametro che raccoglie "il resto" utilizzando tre punti `" ... "`:
173+
174+
```js run
175+
let [name1, name2, *!*...rest*/!*] = ["Julius", "Caesar", *!*"Consul", "of the Roman Republic"*/!*];
151176
152177
*!*
153-
// Da notare che il tipo di `rest` è Array.
178+
// rest è un array di elementi, che parte dal terzo
154179
alert(rest[0]); // Consul
155180
alert(rest[1]); // of the Roman Republic
156181
alert(rest.length); // 2
157182
*/!*
158183
```
159184

160-
La variabile `rest` è un array dei valori dell'array rimanenti. Possiamo utilizzare qualsiasi altro nome di variabile al posto di `rest`, è sufficiente accertarsi di inserire i tre punti prima del nome.
185+
186+
La variabile `rest` è un array dei valori dell'array rimanenti.
187+
188+
Possiamo utilizzare qualsiasi altro nome di variabile al posto di `rest`, è sufficiente accertarsi di inserire i tre punti prima del nome e di posizionarlo alla fine nell'assegnamento di destrutturazione.
189+
190+
```js run
191+
let [name1, name2, *!*...titles*/!*] = ["Julius", "Caesar", "Consul", "of the Roman Republic"];
192+
// now titles = ["Consul", "of the Roman Republic"]
193+
```
161194

162195
### Valori di default
163196

164-
Se ci sono meno valori nell'array delle variabili da assegnare, non ci sarà alcun errore. I valori assenti vengono considerati undefined:
197+
Se ci sono meno elementi nell'array delle variabili da assegnare, non ci sarà alcun errore. I valori assenti vengono considerati undefined:
165198

166199
```js run
167200
*!*
@@ -172,7 +205,7 @@ alert(firstName); // undefined
172205
alert(surname); // undefined
173206
```
174207

175-
Se volessimo utilizzare un nostro valore di "default", potremmo fornirlo con la sintassi `=`:
208+
Se volessimo assegnare un nostro valore di "default", potremmo indicarlo con la sintassi `=`:
176209

177210
```js run
178211
*!*
@@ -184,9 +217,11 @@ alert(name); // Julius (dall'array)
184217
alert(surname); // Anonymous (valore di default)
185218
```
186219

187-
I valori di default possono essere anche espressioni complesse o anche delle chiamate a funzione. Verranno presi in considerazione solamente se non verrà fornito alcun valore.
220+
I valori di default possono essere anche espressioni complesse o chiamate a funzione. Verranno presi in considerazione solamente se non verrà fornito alcun valore.
221+
222+
223+
Ad esempio, qui usiamo la funzione `prompt` per due defaults:
188224

189-
Ad esempio, qui usiamo la funzione `prompt` come default. La chiamata avverrà solamente nel secondo caso:
190225

191226
```js run
192227
// viene eseguito solo il prompt per il cognome
@@ -196,11 +231,11 @@ alert(name); // Julius (dall'array)
196231
alert(surname); // qualsiasi cosa provenga dal prompt
197232
```
198233

199-
234+
Attenzione: la funzione `prompt` verrà eseguita solo per il valore vancante (`surname`).
200235

201236
## Destrutturazione di oggetti
202237

203-
L'assegnamento di destrutturazione funziona allo stesso modo con gli oggetti.
238+
L'assegnamento di destrutturazione funziona anche con gli oggetti.
204239

205240
La sintassi è:
206241

@@ -228,7 +263,10 @@ alert(width); // 100
228263
alert(height); // 200
229264
```
230265

231-
Le proprietà `options.title`, `options.width` e `options.height` vengono assegnate alle variabili corrispondenti. L'ordine non ha importanza. Questo codice funzionerebbe allo stesso modo:
266+
Le proprietà `options.title`, `options.width` e `options.height` vengono assegnate alle variabili corrispondenti.
267+
268+
L'ordine non ha importanza. Questo codice funzionerebbe comunque:
269+
232270

233271
```js
234272
// cambiato l'ordine delle proprietà in let {...}
@@ -237,7 +275,9 @@ let {height, width, title} = { title: "Menu", height: 200, width: 100 }
237275

238276
Il pattern alla sinistra potrebbe essere anche più complesso e specificare una mappatura tra proprietà e variabili.
239277

240-
Se volessimo assegnare una proprietà ad una variabile con un altro nome, ad esempio, la proprietà `options.width` vogliamo inserirla in una variabile chiamata `w`, allora possiamo specificarlo con i due punti:
278+
279+
Se volessimo assegnare una proprietà ad una variabile con un altro nome, ad esempio, la proprietà `options.width` vogliamo assegnarla ad una variabile chiamata `w`, allora possiamo specificarlo con i due punti:
280+
241281

242282
```js run
243283
let options = {
@@ -326,7 +366,7 @@ let { title } = options;
326366
alert(title); // Menu
327367
```
328368

329-
### The rest pattern "..."
369+
### Il modelo rest "..."
330370

331371
Cosa succede se l'oggetto possiede più proprietà delle variabili da noi fornite? Possiamo prendere solamente alcune ed assegnare tutto ciò che avanza da un'altra parte?
332372

1-js/06-advanced-functions/10-bind/article.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ The call to `mul.bind(null, 2)` creates a new function `double` that passes call
247247
248248
That's called [partial function application](https://en.wikipedia.org/wiki/Partial_application) -- we create a new function by fixing some parameters of the existing one.
249249
250-
Please note that here we actually don't use `this` here. But `bind` requires it, so we must put in something like `null`.
250+
Please note that we actually don't use `this` here. But `bind` requires it, so we must put in something like `null`.
251251
252252
The function `triple` in the code below triples the value:
253253

1-js/09-classes/02-class-inheritance/article.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ class Rabbit extends Animal {
150150
let rabbit = new Rabbit("White Rabbit");
151151
152152
rabbit.run(5); // White Rabbit runs with speed 5.
153-
rabbit.stop(); // White Rabbit stands still. White rabbit hides!
153+
rabbit.stop(); // White Rabbit stands still. White Rabbit hides!
154154
```
155155
156156
Ora `Rabbit` contiene il metodo `stop`, che richiama al suo interno il metodo `super.stop()`.

1-js/99-js-misc/03-currying-partials/article.md

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ function curried(...args) {
155155
if (args.length >= func.length) { // (1)
156156
return func.apply(this, args);
157157
} else {
158-
return function pass(...args2) { // (2)
158+
return function(...args2) { // (2)
159159
return curried.apply(this, args.concat(args2));
160160
}
161161
}
@@ -164,18 +164,10 @@ function curried(...args) {
164164

165165
When we run it, there are two `if` execution branches:
166166

167-
1. Call now: if passed `args` count is the same as the original function has in its definition (`func.length`) or longer, then just pass the call to it.
168-
2. Get a partial: otherwise, `func` is not called yet. Instead, another wrapper `pass` is returned, that will re-apply `curried` providing previous arguments together with the new ones. Then on a new call, again, we'll get either a new partial (if not enough arguments) or, finally, the result.
167+
1. If passed `args` count is the same or more than the original function has in its definition (`func.length`) , then just pass the call to it using `func.apply`.
168+
2. Otherwise, get a partial: we don't call `func` just yet. Instead, another wrapper is returned, that will re-apply `curried` providing previous arguments together with the new ones.
169169

170-
For instance, let's see what happens in the case of `sum(a, b, c)`. Three arguments, so `sum.length = 3`.
171-
172-
For the call `curried(1)(2)(3)`:
173-
174-
1. The first call `curried(1)` remembers `1` in its Lexical Environment, and returns a wrapper `pass`.
175-
2. The wrapper `pass` is called with `(2)`: it takes previous args (`1`), concatenates them with what it got `(2)` and calls `curried(1, 2)` with them together. As the argument count is still less than 3, `curry` returns `pass`.
176-
3. The wrapper `pass` is called again with `(3)`, for the next call `pass(3)` takes previous args (`1`, `2`) and adds `3` to them, making the call `curried(1, 2, 3)` -- there are `3` arguments at last, they are given to the original function.
177-
178-
If that's still not obvious, just trace the calls sequence in your mind or on paper.
170+
Then, if we call it, again, we'll get either a new partial (if not enough arguments) or, finally, the result.
179171

180172
```smart header="Fixed-length functions only"
181173
The currying requires the function to have a fixed number of arguments.

0 commit comments

Comments
 (0)