diff options
author | Ryan Johnson <rjohnson@mozilla.com> | 2021-04-29 16:16:42 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-29 16:16:42 -0700 |
commit | 95aca4b4d8fa62815d4bd412fff1a364f842814a (patch) | |
tree | 5e57661720fe9058d5c7db637e764800b50f9060 /files/it/web/javascript/guide/iterators_and_generators | |
parent | ee3b1c87e3c8e72ca130943eed260ad642246581 (diff) | |
download | translated-content-95aca4b4d8fa62815d4bd412fff1a364f842814a.tar.gz translated-content-95aca4b4d8fa62815d4bd412fff1a364f842814a.tar.bz2 translated-content-95aca4b4d8fa62815d4bd412fff1a364f842814a.zip |
remove retired locales (#699)
Diffstat (limited to 'files/it/web/javascript/guide/iterators_and_generators')
-rw-r--r-- | files/it/web/javascript/guide/iterators_and_generators/index.html | 163 |
1 files changed, 0 insertions, 163 deletions
diff --git a/files/it/web/javascript/guide/iterators_and_generators/index.html b/files/it/web/javascript/guide/iterators_and_generators/index.html deleted file mode 100644 index dbfd114f2d..0000000000 --- a/files/it/web/javascript/guide/iterators_and_generators/index.html +++ /dev/null @@ -1,163 +0,0 @@ ---- -title: Iteratori e generatori -slug: Web/JavaScript/Guide/Iterators_and_Generators -translation_of: Web/JavaScript/Guide/Iterators_and_Generators -original_slug: Web/JavaScript/Guida/Iteratori_e_generatori ---- -<div>{{jsSidebar("JavaScript Guide")}} {{PreviousNext("Web/JavaScript/Guide/Details_of_the_Object_Model", "Web/JavaScript/Guide/Meta_programming")}}</div> - -<p class="summary">Processare ognuno degli elementi in una collezione è un'operazione molto comune. JavaScript fornisce tutta una serie di costrutti per iterare una collezione di elementi, dai semplici cicli {{jsxref("Statements/for","for")}} a {{jsxref("Global_Objects/Array/map","map()")}} e {{jsxref("Global_Objects/Array/filter","filter()")}}. Iterators e Generators portano il concetto di iterazione direttamente al cuore del linguaggio e forniscono un meccanismo per personalizzare i cicli {{jsxref("Statements/for...of","for...of")}}.</p> - -<p>Per maggiori dettagli, vedi anche:</p> - -<ul> - <li><a href="/en-US/docs/Web/JavaScript/Reference/Iteration_protocols">Iteration protocols</a></li> - <li>{{jsxref("Statements/for...of","for...of")}}</li> - <li>{{jsxref("Statements/function*","function*")}} e {{jsxref("Generator")}}</li> - <li>{{jsxref("Operators/yield","yield")}} e {{jsxref("Operators/yield*","yield*")}}</li> -</ul> - -<h2 id="Iterators">Iterators</h2> - -<p>Un oggetto è un <strong>iterator</strong> quando sa come accedere agli elementi di una collezione uno per volta, conservando l'informazione sulla sua posizione corrente nella sequenza. In Javascript un iterator è un oggetto che implementa il metodo <code>next()</code> , il quale ritorna l'elemento successivo della sequenza. Questo metodo ritorna un oggetto con due proprietà: <code>done</code> e<code>value</code>.</p> - -<p>Una volta che è stato creato, un iterator può essere utlizzato esplicitamente chiamando più volte il metodo <code>next()</code>.</p> - -<pre class="brush: js">function makeIterator(array) { - var nextIndex = 0; - - return { - next: function() { - return nextIndex < array.length ? - {value: array[nextIndex++], done: false} : - {done: true}; - } - }; -}</pre> - -<p>Una volta che un iterator è stato inizializzato, il metodo<code>next()</code> può essere chiamato per accedere a coppie chiave-valore dall'oggetto ritornato:</p> - -<pre class="brush: js">var it = makeIterator(['yo', 'ya']); -console.log(it.next().value); // 'yo' -console.log(it.next().value); // 'ya' -console.log(it.next().done); // true</pre> - -<h2 id="Generators">Generators</h2> - -<p>Nonostante implementare un iterator possa essere utile, richiede una considerevole attenzione nella programmazione a causa del bisogno esplicito di mantenere lo stato interno dell'iteratore. I <strong>{{jsxref("Global_Objects/Generator","Generators","","true")}}</strong> forniscono una potente alternativa: ti permettono di definire un algoritmo iterativo scrivendo una singola funzione in grado di mantenere il proprio stato.</p> - -<p>Una GeneratorFunction è uno speciale tipo di funzione che opera come una "fabbrica" di iterators. Quando viene eseguita ritorna un nuovo oggetto Generator. Una funzione diventa una GeneratorFunction se usa la sintassi {{jsxref("Statements/function*","function*")}}.</p> - -<pre class="brush: js">function* idMaker() { - var index = 0; - while(true) - yield index++; -} - -var gen = idMaker(); - -console.log(gen.next().value); // 0 -console.log(gen.next().value); // 1 -console.log(gen.next().value); // 2 -// ...</pre> - -<h2 id="Iterables">Iterables</h2> - -<p>Un oggetto è un <strong>iterable</strong> se definisce un comportamento di iterazione, come per esempio quali valori sono considerati in un costrutto {{jsxref("Statements/for...of", "for...of")}}. Alcuni tipi built-in di Javascript (come {{jsxref("Array")}} o {{jsxref("Map")}}) hanno un comportamento predefinito, mentre altri tipi (come {{jsxref("Object")}}) non ce l'hanno.</p> - -<p>Affinché un oggetto possa essere considerato un <strong>iterable</strong> deve implementare il metodo <strong>@@iterator</strong>, cioè l'oggetto (o uno degli oggetti che lo precedono nella <a href="/en-US/docs/Web/JavaScript/Guide/Inheritance_and_the_prototype_chain">catena dei prototipi</a>) deve avere una proprietà con una chiave {{jsxref("Symbol.iterator")}}.</p> - -<h3 id="Iterables_definiti_dall'utente">Iterables definiti dall'utente</h3> - -<p>Possiamo creare i nostri iterables in questo modo:</p> - -<pre class="brush: js">var myIterable = {}; -myIterable[Symbol.iterator] = function* () { - yield 1; - yield 2; - yield 3; -}; - -for (let value of myIterable) { - console.log(value); -} -// 1 -// 2 -// 3 - -or - -[...myIterable]; // [1, 2, 3] -</pre> - -<h3 id="Iterables_Built-in">Iterables Built-in</h3> - -<p>{{jsxref("String")}}, {{jsxref("Array")}}, {{jsxref("TypedArray")}}, {{jsxref("Map")}} e {{jsxref("Set")}} sono tutti iterables built-in nel linguaggio, perché i loro oggetti prototipi hanno tutti un metodo {{jsxref("Symbol.iterator")}}.</p> - -<h3 id="Sintassi_che_si_aspettano_degli_iterables">Sintassi che si aspettano degli iterables</h3> - -<p>Alcuni costrutti ed espressioni si aspettano degli iterables, per esempio il ciclo {{jsxref("Statements/for...of","for-of")}}, la {{jsxref("Operators/Spread_operator","sintassi spread","","true")}}, {{jsxref("Operators/yield*","yield*")}}, e l'{{jsxref("Operators/Destructuring_assignment","assegnamento di destrutturazione","","true")}}.</p> - -<pre class="brush: js">for (let value of ['a', 'b', 'c']) { - console.log(value); -} -// "a" -// "b" -// "c" - -[...'abc']; // ["a", "b", "c"] - -function* gen() { - yield* ['a', 'b', 'c']; -} - -gen().next(); // { value: "a", done: false } - -[a, b, c] = new Set(['a', 'b', 'c']); -a; // "a" - -</pre> - -<h2 id="Generators_avanzati">Generators avanzati</h2> - -<p>I generators calcolano i loro valori solo quando vengono effettivamente richiesti, il che gli permette di rappresentare sequenze che sono troppo onerose da calcolare, o perfino sequenze infinite, come nella funzione <code>idMaker()</code>.</p> - -<p>Il metodo {{jsxref("Global_Objects/Generator/next","next()")}} accetta anche un valore che può essere utilizzato per modificare lo stato interno di un generatore. Un valore passato a <code>next()</code> sarà trattato come il risultato dell'ultima espressione <code>yield</code> che ha messo in pausa il generator.</p> - -<p>Ecco un generator che produce una sequenza di numeri di Fibonacci. In questo generator il metodo<code>next(x)</code> può essere utilizzato per reinizializzare la sequenza:</p> - -<pre class="brush: js">function* fibonacci() { - var fn1 = 0; - var fn2 = 1; - while (true) { - var current = fn1; - fn1 = fn2; - fn2 = current + fn1; - var reset = yield current; - if (reset) { - fn1 = 0; - fn2 = 1; - } - } -} - -var sequence = fibonacci(); -console.log(sequence.next().value); // 0 -console.log(sequence.next().value); // 1 -console.log(sequence.next().value); // 1 -console.log(sequence.next().value); // 2 -console.log(sequence.next().value); // 3 -console.log(sequence.next().value); // 5 -console.log(sequence.next().value); // 8 -console.log(sequence.next(true).value); // 0 -console.log(sequence.next().value); // 1 -console.log(sequence.next().value); // 1 -console.log(sequence.next().value); // 2</pre> - -<p>Puoi forzare un generator a lanciare una eccezione chiamando il suo metodo {{jsxref("Global_Objects/Generator/throw","throw()")}} e passandogli il valore che dovrebbe lanciare. Questa eccezione sarà lanciata dal corrente context sospeso del generator, come se lo <code>yield</code> che è attualmente sospeso fosse invece una dichiarazione <code>throw <em>value</em></code>.</p> - -<p>Se non si incontra uno <code>yield</code> durante la risoluzione della eccezione lanciata, allora l'eccezione si propagherà fino alla chiamata a<code>throw()</code>, e in tutte le successive chiamate a <code>next()</code> la proprietà <code>done</code> sarà<code>true</code>.</p> - -<p>I generators hanno un metodo {{jsxref("Global_Objects/Generator/return","return(value)")}} che ritorna un valore e termina il generator stesso.</p> - -<p>{{PreviousNext("Web/JavaScript/Guide/Details_of_the_Object_Model", "Web/JavaScript/Guide/Meta_programming")}}</p> |