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/02-first-steps/08-operators/article.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -223,7 +223,7 @@ alert( x ); // 5
223
223
224
224
Il fatto che il simbolo `=` sia un operatore e non un costrutto "magico" del linguaggio, ha delle interessanti implicazioni.
225
225
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 `=`.
227
227
228
228
La chiamata `x = value` scrive `value` in `x`*e quindi lo restituisce*.
229
229
@@ -480,4 +480,4 @@ for (*!*a = 1, b = 3, c = a * b*/!*; a < 10; a++) {
480
480
}
481
481
```
482
482
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.
Copy file name to clipboardExpand all lines: 1-js/02-first-steps/18-javascript-specials/article.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -275,9 +275,9 @@ Abbiamo studiato tre modi per creare funzioni in JavaScript:
275
275
```
276
276
277
277
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.
279
279
- 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`.
281
281
282
282
Per più informazioni: vedi <info:function-basics>, <info:arrow-functions-basics>.
Copy file name to clipboardExpand all lines: 1-js/03-code-quality/01-debugging-chrome/article.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -135,7 +135,7 @@ Ci sono dei bottoni appositi nella parte superiore del pannello di destra. Provi
135
135
Continuando a cliccare eseguiremo lo script un passo per volta.
136
136
137
137
<spanclass="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.
139
139
140
140
Il comando "Step" entra nella funzione e mette in pausa l'esecuzione, mentre "Step over" esegue la chiamata a funzione, saltandone il contenuto.
Copy file name to clipboardExpand all lines: 1-js/05-data-types/10-destructuring-assignment/article.md
+78-38Lines changed: 78 additions & 38 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,18 +2,22 @@
2
2
3
3
Le due strutture dati più utilizzate in JavaScritp sono `Object` e `Array`.
4
4
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.
6
7
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.
9
13
10
14
## Destrutturazione di un array
11
15
12
-
Un esempio di come un array viene destrutturato in variabili:
16
+
Ecco un esempio di come un array viene destrutturato in variabili:
13
17
14
18
```js
15
19
// abbiamo un array con nome e cognome
16
-
let arr = ["Ilya", "Kantor"]
20
+
let arr = ["John", "Smith"]
17
21
18
22
*!*
19
23
// assegnamento di destrutturazione
@@ -22,20 +26,25 @@ let arr = ["Ilya", "Kantor"]
22
26
let [firstName, surname] = arr;
23
27
*/!*
24
28
25
-
alert(firstName); //Ilya
26
-
alert(surname); //Kantor
29
+
alert(firstName); //John
30
+
alert(surname); //Smith
27
31
```
28
32
29
33
Ora possiamo lavorare con le variabili piuttosto che con i membri dell'array.
30
34
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:
32
36
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
35
41
```
36
42
43
+
Come puoi vedere, la sintassi è semplice. Ci sono però molti dettagli peculiari. Vediamo altri esempi, per capirlo meglio.
44
+
45
+
37
46
````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.
39
48
40
49
E' solo un modo breve per scrivere:
41
50
```js
@@ -45,8 +54,9 @@ let surname = arr[1];
45
54
```
46
55
````
47
56
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:
50
60
51
61
```js run
52
62
*!*
@@ -57,10 +67,10 @@ let [firstName, , title] = ["Julius", "Caesar", "Consul", "of the Roman Republic
57
67
alert( title ); // Consul
58
68
```
59
69
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).
61
71
````
62
72
63
-
````smart header="Funziona con qualsiasi itarabile"
73
+
````smart header="Funziona con qualsiasi itarabile sulla destra"
64
74
65
75
... In realtà, possiamo utilizzarlo con qualsiasi iterabile, non solamente con array:
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.
72
83
````
73
84
74
-
75
85
````smart header="Assegna a qualsiasi cosa ci sia dalla parte sinistra"
76
86
77
87
Possiamo inserire qualsiasi cosa sia "assegnabile" alla sinistra.
Nel capitolo precedente abbiamo visto il metodo [Object.entries(obj)](mdn:js/Object/entries).
92
103
@@ -98,70 +109,92 @@ let user = {
98
109
age: 30
99
110
};
100
111
101
-
// ciclo su chiavi e valori
112
+
// ciclo su chiavi/valori
102
113
*!*
103
114
for (let [key, value] of Object.entries(user)) {
104
115
*/!*
105
116
alert(`${key}:${value}`); // name:John, poi age:30
106
117
}
107
118
```
108
119
109
-
...Lo stesso vale per map:
120
+
Codice simile usando `Map` è più semplice, visto che è iterabile:
121
+
110
122
111
123
```js run
112
124
let user = new Map();
113
125
user.set("name", "John");
114
126
user.set("age", "30");
115
127
116
128
*!*
129
+
// Map itera le coppie [key, value], molto comodo per la destrutturazione
117
130
for (let [key, value] of user) {
118
131
*/!*
119
132
alert(`${key}:${value}`); // name:John, then age:30
120
133
}
121
134
```
122
135
````
123
136
137
+
124
138
```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
+
126
141
127
142
```js run
128
143
let guest = "Jane";
129
144
let admin = "Pete";
130
145
131
146
// Scambio dei valori: rende guest=Pete, admin=Jane
147
+
*!*
132
148
[guest, admin] = [admin, guest];
149
+
*/!*
133
150
134
151
alert(`${guest} ${admin}`); // Pete Jane (scambiati con successo!)
135
152
```
136
153
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.
138
156
139
-
In questo modo possiamo invertire l'ordine di più di due variabili.
140
157
158
+
### L'operatore rest '...'
141
159
142
-
### L'operatore resto '...'
160
+
Di solito, se l'array è più lungo della lista a sinistra, gli elementi in eccesso vengono ignorati.
143
161
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:
145
163
146
164
```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"];
148
166
149
167
alert(name1); // Julius
150
168
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"*/!*];
151
176
152
177
*!*
153
-
//Da notare che il tipo di `rest` è Array.
178
+
//rest è un array di elementi, che parte dal terzo
154
179
alert(rest[0]); // Consul
155
180
alert(rest[1]); // of the Roman Republic
156
181
alert(rest.length); // 2
157
182
*/!*
158
183
```
159
184
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
+
```
161
194
162
195
### Valori di default
163
196
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:
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 `=`:
176
209
177
210
```js run
178
211
*!*
@@ -184,9 +217,11 @@ alert(name); // Julius (dall'array)
184
217
alert(surname); // Anonymous (valore di default)
185
218
```
186
219
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:
188
224
189
-
Ad esempio, qui usiamo la funzione `prompt` come default. La chiamata avverrà solamente nel secondo caso:
190
225
191
226
```js run
192
227
// viene eseguito solo il prompt per il cognome
@@ -196,11 +231,11 @@ alert(name); // Julius (dall'array)
196
231
alert(surname); // qualsiasi cosa provenga dal prompt
197
232
```
198
233
199
-
234
+
Attenzione: la funzione `prompt` verrà eseguita solo per il valore vancante (`surname`).
200
235
201
236
## Destrutturazione di oggetti
202
237
203
-
L'assegnamento di destrutturazione funziona allo stesso modo con gli oggetti.
238
+
L'assegnamento di destrutturazione funziona anche con gli oggetti.
204
239
205
240
La sintassi è:
206
241
@@ -228,7 +263,10 @@ alert(width); // 100
228
263
alert(height); // 200
229
264
```
230
265
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:
Il pattern alla sinistra potrebbe essere anche più complesso e specificare una mappatura tra proprietà e variabili.
239
277
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
+
241
281
242
282
```js run
243
283
let options = {
@@ -326,7 +366,7 @@ let { title } = options;
326
366
alert(title); // Menu
327
367
```
328
368
329
-
### The rest pattern "..."
369
+
### Il modelo rest "..."
330
370
331
371
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?
Copy file name to clipboardExpand all lines: 1-js/06-advanced-functions/10-bind/article.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -247,7 +247,7 @@ The call to `mul.bind(null, 2)` creates a new function `double` that passes call
247
247
248
248
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.
249
249
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`.
251
251
252
252
The function `triple` in the code below triples the value:
Copy file name to clipboardExpand all lines: 1-js/99-js-misc/03-currying-partials/article.md
+4-12Lines changed: 4 additions & 12 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -155,7 +155,7 @@ function curried(...args) {
155
155
if (args.length>=func.length) { // (1)
156
156
returnfunc.apply(this, args);
157
157
} else {
158
-
returnfunctionpass(...args2) { // (2)
158
+
returnfunction(...args2) { // (2)
159
159
returncurried.apply(this, args.concat(args2));
160
160
}
161
161
}
@@ -164,18 +164,10 @@ function curried(...args) {
164
164
165
165
When we run it, there are two `if` execution branches:
166
166
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.
169
169
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.
179
171
180
172
```smart header="Fixed-length functions only"
181
173
The currying requires the function to have a fixed number of arguments.
0 commit comments