Skip to content

Commit a8a5ee2

Browse files
author
Marco Trulla
committed
Add IT translation
1 parent 51fa144 commit a8a5ee2

25 files changed

+2111
-1
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
/site/ja
1515
/site/es
1616
/site/zhtw
17+
/site/it
1718
*.md~
1819
*.src.md
1920
*.DS_store

doc/it/array/constructor.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
## Il costruttore `Array`
2+
3+
Dato che il costruttore `Array` è ambiguo riguardo a come esso gestisca i suoi
4+
parametri, si consiglia calorosamente di usare l'array letterale (notazione `[]`)
5+
quando si creano array.
6+
7+
[1, 2, 3]; // Risultato: [1, 2, 3]
8+
new Array(1, 2, 3); // Risultato: [1, 2, 3]
9+
10+
[3]; // Risultato: [3]
11+
new Array(3); // Risultato: []
12+
new Array('3') // Risultato: ['3']
13+
14+
Nei casi in cui c'è solo un argomento passato al costruttore `Array` e quando
15+
l'argomento è un `Number`, il costruttore ritornerà un nuovo array *frammentato*
16+
con la proprietà `length` impostata al valore dell'argomento. Si noti
17+
che in questo modo **solo** la proprietà `length` del nuovo array verrà impostata,
18+
mentre gli indici dell'array non verranno inizializzati.
19+
20+
var arr = new Array(3);
21+
arr[1]; // undefined
22+
1 in arr; // false, l'indice non è stato impostato
23+
24+
Essere in grado di impostare la lunghezza dell'array in anticipo è utile soltanto
25+
in poche situazioni, come ad esempio la ripetizione di una stringa, nel cui caso
26+
si eviterebbe l'uso di un ciclo.
27+
28+
new Array(count + 1).join(stringToRepeat);
29+
30+
### In conclusione
31+
32+
I letterali sono da preferirsi al costruttore Array. Sono più concisi, hanno una
33+
sintassi più chiara ed incrementano la leggibilità del codice.
34+

doc/it/array/general.md

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
## Iterazione e proprietà degli Array
2+
3+
Sebbene gli array in JavaScript siano oggetti, non ci sono valide ragioni
4+
per usare il ciclo [`for in`](#object.forinloop). Infatti, ci sono varie
5+
buone ragioni per **evitare** l'utilizzo di `for in` con gli array.
6+
7+
> **Nota:** gli array in JavaScript **non** sono *array associativi*. JavaScript
8+
> ha solo [oggetti](#object.general) per mappare chiavi con valori. E mentre
9+
> gli array **preservano** il loro ordine, gli oggetti **non lo fanno**.
10+
11+
Dato che il ciclo `for in` enumera tutte le proprietà che sono presenti nella
12+
catena di prototipi, e dal momento che il solo modo per escludere queste
13+
proprietà è quello di usare [`hasOwnProperty`](#object.hasownproperty),
14+
esso è già **venti volte** più lento di un normale ciclo `for`.
15+
16+
### Iterazione
17+
18+
Per poter ottenere la miglior performance durante l'iterazione degli array,
19+
è meglio usare il classico ciclo `for`.
20+
21+
var list = [1, 2, 3, 4, 5, ...... 100000000];
22+
for(var i = 0, l = list.length; i < l; i++) {
23+
console.log(list[i]);
24+
}
25+
26+
In questo esempio c'è un ulteriore particolare da notare, che è il caching
27+
della lunghezza dell'array tramite `l = list.length`.
28+
29+
Sebbene la proprietà `length` sia definita nell'array stesso, c'è ancora un
30+
sovraccarico di lavoro dato dal fatto che deve essere ricercata ad ogni
31+
iterazione del ciclo. E mentre i motori JavaScript recenti **potrebbero**
32+
applicare delle ottimizzazioni in questo caso, non c'è modo di dire se il
33+
codice verrà eseguito su uno di questi nuovi motori oppure no.
34+
35+
Infatti, l'omissione della parte di caching può risultare in un ciclo eseguito
36+
soltanto alla **metà della velocità** con cui potrebbe essere eseguito facendo
37+
il caching della lunghezza.
38+
39+
### La proprietà `length`
40+
41+
Mentre il *getter* della proprietà `length` ritorna semplicemente il numero di
42+
elementi che sono contenuti nell'array, il *setter* può essere usato per
43+
**troncare** l'array.
44+
45+
var foo = [1, 2, 3, 4, 5, 6];
46+
foo.length = 3;
47+
foo; // [1, 2, 3]
48+
49+
foo.length = 6;
50+
foo.push(4);
51+
foo; // [1, 2, 3, undefined, undefined, undefined, 4]
52+
53+
Assegnando una lunghezza più piccola si tronca l'array. Incrementandola si
54+
crea un array frammentato.
55+
56+
### In conclusione
57+
58+
Per la miglior performance, si raccomanda di usare sempre il ciclo `for`
59+
classico e fare il caching della proprietà `length`. L'uso di `for in` su di
60+
un array è segno di un codice scritto male che è suscettibile a bug e pessima
61+
performance.
62+

doc/it/core/delete.md

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
## L'operatore `delete`
2+
3+
In breve, è *impossibile* eliminare variabili globali, funzioni e qualche
4+
altra cosa in JavaScript che ha l'attributo `DontDelete` impostato.
5+
6+
### Codice globale e codice funzione
7+
8+
Quando una variabile o una funzione viene definita in un scope globale o
9+
[funzione](#function.scopes), essa è una proprietà dell'oggetto Activation
10+
o dell'oggetto Global. Queste proprietà hanno un set di attributi, tra i quali
11+
`DontDelete`. Dichiarazioni di variabile o funzione nel codice globale o
12+
funzione, creano sempre proprietà con `DontDelete`, e quindi non possono essere
13+
eliminate.
14+
15+
// variabile globale:
16+
var a = 1; // DontDelete è impostato
17+
delete a; // false
18+
a; // 1
19+
20+
// funzione normale:
21+
function f() {} // DontDelete è impostato
22+
delete f; // false
23+
typeof f; // "function"
24+
25+
// la riassegnazione non aiuta:
26+
f = 1;
27+
delete f; // false
28+
f; // 1
29+
30+
### Proprietà esplicite
31+
32+
Proprietà esplicitamente impostate possono essere eliminate normalmente.
33+
34+
// proprietà impostata esplicitamente:
35+
var obj = {x: 1};
36+
obj.y = 2;
37+
delete obj.x; // true
38+
delete obj.y; // true
39+
obj.x; // undefined
40+
obj.y; // undefined
41+
42+
Nel codice qui sopra, `obj.x` e `obj.y` possono essere eliminate perché
43+
non hanno l'attributo `DontDelete`. Ecco perché anche l'esempio seguente
44+
funziona.
45+
46+
// questo funziona, tranne che per IE:
47+
var GLOBAL_OBJECT = this;
48+
GLOBAL_OBJECT.a = 1;
49+
a === GLOBAL_OBJECT.a; // true - solo una variabile globale
50+
delete GLOBAL_OBJECT.a; // true
51+
GLOBAL_OBJECT.a; // undefined
52+
53+
Qui usiamo un trucco per eliminare `a`. [`this`](#function.this) qui fa
54+
riferimento all'oggetto Global e noi dichiariamo esplicitamente la
55+
variabile `a` come sua proprietà, il che ci permette di eliminarla.
56+
57+
IE (almeno 6-8) ha alcuni bug, quindi il codice precedente non funziona.
58+
59+
### Argomenti funzione e proprietà interne
60+
61+
Anche i normali argomenti delle funzioni, gli
62+
[oggetti `arguments`](#function.arguments) e le proprietà interne hanno
63+
`DontDelete` impostato.
64+
65+
// argomenti funzione e proprietà:
66+
(function (x) {
67+
68+
delete arguments; // false
69+
typeof arguments; // "object"
70+
71+
delete x; // false
72+
x; // 1
73+
74+
function f(){}
75+
delete f.length; // false
76+
typeof f.length; // "number"
77+
78+
})(1);
79+
80+
### Oggetti non nativi (host)
81+
82+
Il comportamento dell'operatore `delete` può essere inaspettato con gli oggetti
83+
non nativi. A causa delle specifiche, agli oggetti non nativi è permesso di
84+
implementare qualsiasi tipo di funzionalità.
85+
86+
### In conclusione
87+
88+
L'operatore `delete` spesso ha un comportamento inaspettato e può solo essere
89+
usato con sicurezza per eliminare proprietà esplicitamente impostate in oggetti
90+
normali.

doc/it/core/eval.md

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
## Perché non usare `eval`
2+
3+
La funzione `eval` eseguirà una stringa di codice JavaScript nello scope locale.
4+
5+
var foo = 1;
6+
function test() {
7+
var foo = 2;
8+
eval('foo = 3');
9+
return foo;
10+
}
11+
test(); // 3
12+
foo; // 1
13+
14+
Comunque, `eval` esegue solo nello scope locale quando viene chiamata
15+
direttamente *e* quando il nome della funzione chiamata è `eval`.
16+
17+
var foo = 1;
18+
function test() {
19+
var foo = 2;
20+
var bar = eval;
21+
bar('foo = 3');
22+
return foo;
23+
}
24+
test(); // 2
25+
foo; // 3
26+
27+
L'uso di `eval` dovrebbe essere evitato. Il 99.9% dei suoi "utilizzi" può
28+
essere ottenuto **senza** di essa.
29+
30+
### `eval` sotto mentite spoglie
31+
32+
Le [funzioni di timeout](#other.timeouts) `setTimeout` e `setInterval` possono
33+
entrambe accettare una stringa come loro primo argomento. Questa stringa verrà
34+
**sempre** eseguita nello scope globale dato che `eval` non viene chiamato
35+
direttamente in questo caso.
36+
37+
### Problemi di sicurezza
38+
39+
`eval` è anche un problema di sicurezza, perché essa esegue **qualsiasi**
40+
codice le viene passato. Non si dovrebbe **mai** usare con stringhe di origine
41+
sconosciuta o inaffidabile.
42+
43+
### In conclusione
44+
45+
`eval` non dovrebbe mai essere usata. Qualsiasi codice che ne faccia uso dovrebbe
46+
essere messo in discussione sotto l'aspetto della funzionalità, della performance
47+
e della sicurezza. Se qualcosa richiede `eval` per poter funzionare, allora **non**
48+
dovrebbe essere usato in primo luogo, ma si dovrebbe prevedere una
49+
*miglior progettazione* che non richieda l'uso di `eval`.
50+

doc/it/core/semicolon.md

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
## Inserimento automatico dei punti-e-virgola
2+
3+
Sebbene JavaScript utilizzi lo stile di sintassi del C, esso **non**
4+
obbliga l'uso dei punti-e-virgola nel codice sorgente, perciò è possibile
5+
ometterli.
6+
7+
Detto questo, JavaScript non è un linguaggio che fa a meno dei punti-e-virgola.
8+
Infatti, esso necessita di punti-e-virgola per poter comprendere il codice
9+
sorgente. Quindi, il parser del JavaScript li inserisce **automaticamente**
10+
ogni volta che incontra un errore di analisi dato dalla mancanza di un
11+
punto-e-virgola.
12+
13+
var foo = function() {
14+
} // errore di analisi, atteso punto-e-virgola
15+
test()
16+
17+
Quindi avviene l'inserimento, ed il parser prova nuovamente.
18+
19+
var foo = function() {
20+
}; // nessun errore, il parser continua
21+
test()
22+
23+
L'inserimento automatico dei punti-e-virgola è considerato essere uno dei
24+
**più grandi** errori di progettazione del linguaggio, perché *può*
25+
modificare il comportamento del codice.
26+
27+
### Come funziona
28+
29+
Il codice qui sotto non ha punti-e-virgola, quindi sta al parser decidere dove
30+
inserirli.
31+
32+
(function(window, undefined) {
33+
function test(options) {
34+
log('testing!')
35+
36+
(options.list || []).forEach(function(i) {
37+
38+
})
39+
40+
options.value.test(
41+
'long string to pass here',
42+
'and another long string to pass'
43+
)
44+
45+
return
46+
{
47+
foo: function() {}
48+
}
49+
}
50+
window.test = test
51+
52+
})(window)
53+
54+
(function(window) {
55+
window.someLibrary = {}
56+
57+
})(window)
58+
59+
Di seguito il risultato del gioco da "indovino" del parser.
60+
61+
(function(window, undefined) {
62+
function test(options) {
63+
64+
// Non inserito, linee unite
65+
log('testing!')(options.list || []).forEach(function(i) {
66+
67+
}); // <- inserito
68+
69+
options.value.test(
70+
'long string to pass here',
71+
'and another long string to pass'
72+
); // <- inserito
73+
74+
return; // <- inserito, invalida l'istruzione return
75+
{ // trattato come un blocco
76+
77+
// un'etichetta e una singola espressione
78+
foo: function() {}
79+
}; // <- inserito
80+
}
81+
window.test = test; // <- inserito
82+
83+
// Le linee vengono unite nuovamente
84+
})(window)(function(window) {
85+
window.someLibrary = {}; // <- inserito
86+
87+
})(window); //<- inserito
88+
89+
> **Nota:** il parser del JavaScript non gestisce "correttamente" le istruzioni
90+
> return che sono seguite da un ritorno a capo. Mentre questo non è necessariamente
91+
> da considerarsi un errore dell'inserimento automatico di punti-e-virgola, esso
92+
> può ancora essere considerato un effetto collaterale indesiderato.
93+
94+
Il parser ha drasticamente modificato il comportamento del codice. In alcuni casi,
95+
questo porta ad eseguire **cose sbagliate**.
96+
97+
### Parentesi ad inizio riga
98+
99+
Nel caso di parentesi ad inizio riga, il parser **non** inserirà un punto-e-virgola.
100+
101+
log('testing!')
102+
(options.list || []).forEach(function(i) {})
103+
104+
Questo codice viene trasformato in una sola linea.
105+
106+
log('testing!')(options.list || []).forEach(function(i) {})
107+
108+
Le possibilità che `log` **non** ritorni una funzione sono **veramente** alte,
109+
perciò il codice qui sopra porterà ad un `TypeError` dichiarando che
110+
`undefined is not a function` (undefined non è una funzione).
111+
112+
### In conclusione
113+
114+
&Egrave; fortemente raccomandato di non omettere **mai** i punti-e-virgola.
115+
Si raccomanda anche di mantenere le parentesi sulla stessa linea della
116+
corrispondente istruzione, e di non ometterle mai in istruzioni `if` / `else`
117+
a linea singola. Queste misure precauzionali non solo miglioreranno la
118+
consistenza del codice, ma preverranno anche che il parser JavaScript
119+
modifichi il comportamento del codice in modo inaspettato.
120+

0 commit comments

Comments
 (0)