aboutsummaryrefslogtreecommitdiff
path: root/files/ca/web/javascript/data_structures/index.html
diff options
context:
space:
mode:
Diffstat (limited to 'files/ca/web/javascript/data_structures/index.html')
-rw-r--r--files/ca/web/javascript/data_structures/index.html258
1 files changed, 258 insertions, 0 deletions
diff --git a/files/ca/web/javascript/data_structures/index.html b/files/ca/web/javascript/data_structures/index.html
new file mode 100644
index 0000000000..5bb63891ed
--- /dev/null
+++ b/files/ca/web/javascript/data_structures/index.html
@@ -0,0 +1,258 @@
+---
+title: JavaScript data types and data structures
+slug: Web/JavaScript/Data_structures
+translation_of: Web/JavaScript/Data_structures
+---
+<div>{{jsSidebar("More")}}</div>
+
+<p>Tots els llenguatges de programació tenen estructures de dades definides com a part d'ells mateixos. Aquestes estrcutures, però, són sovint varien d'un llenguatge a un altre. Aquest article pretén llistar totes les estructures de dades que JavaScript té de forma interna, així com quines propietats tenen; aquestes estructures es poden utilitzar per a per a construir altres estrcutures. Es mostraran comparacionis amb altres llenguatges de programació quan sigui possible.</p>
+
+<h2 id="Tipatge_dinàmic">Tipatge dinàmic</h2>
+
+<p>JavaScript és un llenguatge <em>de tipatge flu</em><em>ix, </em><code>o </code><em>dinàmic</em>. Això vol dir que no cal declarar el tipus d'una variable abans d'utilitzar-la. El seu tipus es determinarà mentre el programa s'executi. Això també implica que la mateixa variable pot rebre valors que tinguin diferents tipus:</p>
+
+<pre class="brush: js notranslate">var foo = 42; // foo ara és un Number
+var foo = "bar"; // foo ara és un String
+var foo = true; // foo ara és un Boolean
+</pre>
+
+<h2 id="Tipus_de_dades">Tipus de dades</h2>
+
+<p>L'últim standard ECMAScript defineix set tipus de dades:</p>
+
+<ul>
+ <li>Sis tipus de dades que són {{Glossary("Primitive", "primitius")}}:
+ <ul>
+ <li>{{Glossary("Boolean")}}</li>
+ <li>{{Glossary("Null")}}</li>
+ <li>{{Glossary("Undefined")}}</li>
+ <li>{{Glossary("Number")}}</li>
+ <li>{{Glossary("String")}}</li>
+ <li>{{Glossary("Symbol")}} (nou, introduït a l'ECMAScript 6)</li>
+ </ul>
+ </li>
+ <li>i {{Glossary("Object")}}</li>
+</ul>
+
+<h2 id="Valors_primitius">Valors primitius</h2>
+
+<p>Tots els tipus, a excepció dels objectes, defineixen valors immutables (valors que no es poden canviar). Per exemple, al contrari que C, els Strings són immutables. Ens referim a valors d'aquests tipus com a "valors primitius".</p>
+
+<h3 id="Tipus_Booleà">Tipus Booleà</h3>
+
+<p>Els booleans representen una entitat lògica i poden tenir un dels dos valors següents: <code>true</code>, o bé <code>false</code>.</p>
+
+<h3 id="Tipus_Null">Tipus Null</h3>
+
+<p>El tipus Null té un únic valor: <code>null</code>. Vegeu {{jsxref("null")}} i {{Glossary("Null")}} per a més detalls.</p>
+
+<h3 id="Tipus_Undefined">Tipus Undefined</h3>
+
+<p>Una variable a la que no se l'ha assignat cap valor té el valor <code>undefined</code>. Vegeu {{jsxref("undefined")}} i {{Glossary("Undefined")}} per a més detalls.</p>
+
+<h3 id="Tipus_Number">Tipus Number</h3>
+
+<p>Segons el standard ECMAScript, només hi ha un tipus que representi nombres: el <a href="http://en.wikipedia.org/wiki/Double_precision_floating-point_format">valor de doble precisió de 64 bits en format binari IEEE 754</a> (capaç de representar nombres entre -(2<sup>53</sup> -1) i 2<sup>53</sup> -1). <strong>No hi ha un tipus específic per a representar nombres sencers</strong>. A més de ser capaç de representar nombres en coma flotant, el tipus Number disposa de tres valors adicionals simbòlics: <code>+Infinity</code>, <code>-Infinity</code>, i <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN"><code>NaN</code></a> (No un Nombre, de l'anglés Not-A-Number).</p>
+
+<p>Per a comprovar valors més grans o més petits que <code>+/-Infinity</code>, es poden emprar les constants {{jsxref("Number.MAX_VALUE")}} i {{jsxref("Number.MIN_VALUE")}} i, a partir de l'ECMAScript 6, també es pot comprovar si un nombre en coma flotant de doble precisió està dins el rang mitjançant {{jsxref("Number.isSafeInteger()")}}, així com {{jsxref("Number.MAX_SAFE_INTEGER")}} i {{jsxref("Number.MIN_SAFE_INTEGER")}}. Fora d'aquest rang no és segur utilitzar nombres a JavaScript.</p>
+
+<p>El tipus Number disposa únicament d'un nombre sencer que té dues representacions: 0 s'interpreta com a -0 i +0. ("0" és un alias per a +0). A la pràctica, això no te quasi cap impacte. Per exemple,  <code>+0 === -0</code> evalua a <code>true</code>. No obstant, aquesta diferència si existeix quan es divideix per zero:</p>
+
+<pre class="brush: js notranslate">&gt; 42 / +0
+Infinity
+&gt; 42 / -0
+-Infinity
+</pre>
+
+<p>Tot i que un nombre sovint només representa el seu valor, JavaScript disposa d'<a href="/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators" title="en/JavaScript/Reference/Operators/Bitwise_Operators">alguns operadors binaris</a>. Aquests operadors es poden emprar per a representar un conjunt de valors Booleans dins un sol nombre, utilitzen una <a class="external" href="http://en.wikipedia.org/wiki/Mask_%28computing%29">màscara de bits</a>. Això es considera una mala pràctica tot i que JavaScript no ofereix cap altra forma per a representar un conjunt de Booleans (com ara un array de Booleans o un objecte amb valors assignats a propietats amb nom). Utilitzar màscares de bits també tendeix a fer el codi més difícil de llegir, entendre i mantenir. Pot ser necessari l'ús d'aquestes tècniques en entorns força limitats, com ara quan es disposa de pocs recursos d'emmagatzematge local o en casos extrems quan cada bit enviat a la xarxa compta. Només hauria de considerar-se l'ús d'aquesta tècnica quan sigui l'últim recurs que es pot emprar per a optimitzar espai.</p>
+
+<h3 id="Tipus_String">Tipus String</h3>
+
+<p>El tipus {{jsxref("Global_Objects/String", "String")}} de JavaScript s'utilitza per a representar dades textuals. Es tracta d'un llistat d'"elements" el valor dels quals és un nombre sencer de 16 bits sense signe. Cada element dins el String ocupa una posició. El primer element té l'índex 0, el segon index 1, etcètera. La llargada d'un String és el nombre d'elements que conté.</p>
+
+<p>A diferència d'altres llenguatges, com ara C, Els strings a JavaScript són immutables. És a dir, quan un string s'ha creat, no és possible modificar-lo. En comptes d'això, si que és possible crear un nou string basat en un string ja existent mitjançant una operació sobre l'original. Per exemple:</p>
+
+<ul>
+ <li>Un substring de l'original via escollint lletres individuals o bé mitjançant {{jsxref("String.substr()")}}.</li>
+ <li>Una concatenació de dos strings mitjançant l'operador de concatenació (<code>+</code>) o bé {{jsxref("String.concat()")}}.</li>
+</ul>
+
+<h4 id="Alerta_amb_abusar_dels_strings!">Alerta amb abusar dels strings!</h4>
+
+<p>Pot ser temptador utilitzar strings per a representar dades complexes. Fer-ho comporta beneficis a curt termini:</p>
+
+<ul>
+ <li>Resulta senzill construir strings complexos mitjançant la concatenació.</li>
+ <li>Els strings són fàcils de depurar (el que es veu imprés sempre és el que el string conté).</li>
+ <li>Els strings són el denominador comú de moltes APIs (<a href="/en-US/docs/Web/API/HTMLInputElement" title="HTMLInputElement">camps d'entrada</a>, valors <a href="/en-US/docs/Storage" title="Storage">emmagatzemats de forma local</a>, respostes {{ domxref("XMLHttpRequest") }} a l'utilitzar <code>responseText</code>, etc.) i pot resultar temptador utilitzar només strings.</li>
+</ul>
+
+<p>Amb les convencions adequades, és possible representar estructures de dades dins un string. Això no vol dir que fer-ho sigui una bona idea. Per exemple, amb un separador, seria possible emular una llista (tot i que un array de JavaScript seria més adient). Malauradament, quan s'utilitzi el separador en un dels elements de la "llista", la llista esdevendrà errònia. Una solució seria escollir un caràcter d'escapament, etcètera. Tot això requereix de convencions i crea un problema de manteniment innecesari.</p>
+
+<p>Utilitzeu strings només per a dades textuals. Quan representin dades complexes, interpreteu els strings i utilitzeu l'abstracció adequada.</p>
+
+<h3 id="Tipus_Symbol">Tipus Symbol</h3>
+
+<p>El tipus Symbol és nou a JavaScript, introduït a l'ECMAScript Edició 6. Un Symbol és un valor primitiu <strong>únic</strong> i <strong>immutable</strong> i pot ser utilitzat com a clau d'una propietat d'un objecte (vegeu més abaix). En alguns llenguatges de programació, als símbols s'els anomena àtoms. També guarden similituts a les enumeracions (enum) de C. Per a més detalls vegeu {{Glossary("Symbol")}} i l'objecte embolcallador {{jsxref("Symbol")}} a JavaScript.</p>
+
+<h2 id="Objectes">Objectes</h2>
+
+<p>En l'àmbit de la informàtica, un objecte és un valor en memòria que possiblement és referenciat per un {{Glossary("Identifier", "identificador")}}.</p>
+
+<h3 id="Propietats">Propietats</h3>
+
+<p>A JavaScript es poden entendre els objectes com una col·lecció de propietats. Amb la <a href="/en-US/docs/Web/JavaScript/Guide/Values,_variables,_and_literals#Object_literals">sintaxi literal d'objectes</a>, es pot inicialitzar un conjunt de propietats limitat; més tard es poden afegir propietats o bé esborrar-ne. Els valors de les propietats poden ser de qualsevol tipus, incloent altres objectes, el que comporta poder construir estructures de dades complexes. Les propietats s'identifiquen mitjançant valors clau. Una clau és o bé un valor de tipus String o Symbol.</p>
+
+<p>Hi ha dos tipus de propietats d'objectes, les quals tenen diferents atributs: Les propietats de tipus dada i les propietats de tipus accés.</p>
+
+<h4 id="Propietats_de_tipus_dada">Propietats de tipus dada</h4>
+
+<p>Associa una clau a un valor i disposa dels següents atributs:</p>
+
+<table class="standard-table">
+ <caption>Atributs de les propietats de tipus dada</caption>
+ <tbody>
+ <tr>
+ <th>Atribut</th>
+ <th>Tipus</th>
+ <th>Descripció</th>
+ <th>Valor per defecte</th>
+ </tr>
+ <tr>
+ <td>[[Value]]</td>
+ <td>Qualsevol tipus</td>
+ <td>El valor obtingut mitjançant un accés de tipus get a la propietat.</td>
+ <td>undefined</td>
+ </tr>
+ <tr>
+ <td>[[Writable]]</td>
+ <td>Boolean</td>
+ <td>Si val <code>false</code>, el [[Value]] de la propietat no es pot canviar.</td>
+ <td>false</td>
+ </tr>
+ <tr>
+ <td>[[Enumerable]]</td>
+ <td>Boolean</td>
+ <td>Si val <code>true</code>, la propietat apareixerà al recòrrer l'objecte pare amb un bucle <a href="/en-US/docs/Web/JavaScript/Reference/Statements/for...in">for...in</a>.</td>
+ <td>false</td>
+ </tr>
+ <tr>
+ <td>[[Configurable]]</td>
+ <td>Boolean</td>
+ <td>Si val <code>false</code>, la propietat no pot ser esborrada i no es pot modificar cap atribut a excepció de [[Value]] i [[Writable]].</td>
+ <td>false</td>
+ </tr>
+ </tbody>
+</table>
+
+<h4 id="Propietats_de_tipus_accés">Propietats de tipus accés</h4>
+
+<p>Associen una clau amb una o dues funccións d'accés (get i set) per a obtindre o bé emmagatzemar un valor, i tenen els atributs següents:</p>
+
+<table class="standard-table">
+ <caption>Atributs de les propietats de tipus accés</caption>
+ <tbody>
+ <tr>
+ <th>Atribut</th>
+ <th>Tipus</th>
+ <th>Descripció</th>
+ <th>Valor per defecte</th>
+ </tr>
+ <tr>
+ <td>[[Get]]</td>
+ <td>Objecte de tipus Function o bé undefined</td>
+ <td>Es crida la funció amb un llistat d'arguments buit i retorna el valor de la propietat. S'executa quan s'accedeix al valor de la propietat. Vegeu també <a href="/en-US/docs/Web/JavaScript/Reference/Operators/get"><code>get</code></a>.</td>
+ <td>undefined</td>
+ </tr>
+ <tr>
+ <td>[[Set]]</td>
+ <td>Objecte de tipus Function o bé undefined</td>
+ <td>Es crida la funció amb un argument, que conté el valor a assignar a la propietat. S'executa quan es vol canviar el valor de la propietat. See also <a href="/en-US/docs/Web/JavaScript/Reference/Operators/set"><code>set</code></a>.</td>
+ <td>undefined</td>
+ </tr>
+ <tr>
+ <td>[[Enumerable]]</td>
+ <td>Boolean</td>
+ <td>Si val <code>true</code>, la propietat apareixerà al recòrrer l'objecte pare amb un bucle <a href="/en-US/docs/Web/JavaScript/Reference/Statements/for...in">for...in</a>.</td>
+ <td>false</td>
+ </tr>
+ <tr>
+ <td>[[Configurable]]</td>
+ <td>Boolean</td>
+ <td>Si val <code>false</code>, no es pot esborrar la propietat i no es pot convertir a una propietat de tipus dada.</td>
+ <td>false</td>
+ </tr>
+ </tbody>
+</table>
+
+<h3 id="Objectes_normals_i_functions">Objectes "normals" i functions</h3>
+
+<p>A JavaScript, un objecte és un mapa que associa claus amb valors. Les claus sempre són de tipus String mentre que els valors poden ser de qualsevol tipus. Això fa que els objectes es puguin utilitzar de forma intuitiva com a <a class="external" href="http://en.wikipedia.org/wiki/Hash_table">hashmaps</a>.</p>
+
+<p>Les funcions són objectes normals i correncts amb la característica adicional que poden ser cridats.</p>
+
+<h3 id="Dates">Dates</h3>
+
+<p>A l'hora de representar dates la millor opció és utilitzar l'objecte <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date"><code>Date</code></a> que JavaScript incorpora per defecte.</p>
+
+<h3 id="Col·leccions_indexades_Arrays_i_Arrays_amb_tipus">Col·leccions indexades: Arrays i Arrays amb tipus</h3>
+
+<p><a href="/en-US/docs/JavaScript/Reference/Global_Objects/Array" title="Array">Els Arrays</a> són objectes normals i corrents en els que hi ha una relació específica entre les propietats, que utilitzen nombres sencers com a claus,  i la propietat 'length'. A més, els array hereten de <code>Array.prototype</code>, el qual els proporciona un conjunt de mètodes molt útils per a manipular arrays. Per exemple, <code><a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf" title="en/JavaScript/Reference/Global_Objects/Array/indexOf">indexOf</a></code> (cerca un valor dins l'array) o bé <code><a href="/en-US/docs/JavaScript/Reference/Global_Objects/Array/push" title="en/JavaScript/Reference/Global_Objects/Array/push">push</a></code> (afegeix un element a l'array), etcètera. Això fa que els Arrays siguin el candidat ideal per a representar llistes i <em>sets</em>.</p>
+
+<p><a href="/en-US/docs/Web/JavaScript/Typed_arrays">Els Arrays amb tipus</a> s'han incorporat a JavaScript recentment amb el standard ECMAScript Edició 6 i ofereixen una forma de treballar sobre buffers de dades binàries com si es tractessin d'arrays. La taula següent mostra el tipus de dades equivalent a C:</p>
+
+<p>{{page("/ca/docs/Web/JavaScript/Reference/Global_Objects/TypedArray", "TypedArray_objects", "", 0, 3)}}</p>
+
+<h3 id="Col·leccions_amb_claus_Maps_Sets_WeakMaps_WeakSets">Col·leccions amb claus: Maps, Sets, WeakMaps, WeakSets</h3>
+
+<p>Aquestes estructures de dades utilitzen referències a objectes com a claus i estan disponibles a partir de l'ECMAScript Edició 6. {{jsxref("Set")}} i {{jsxref("WeakSet")}} representen un conjunt d'objectes, mentre que {{jsxref("Map")}} i {{jsxref("WeakMap")}} associen valors a objectes. La diferència entre Maps i WeakMaps és que als Maps els objectes utilitzats com a clau es poden enumerar mentre que als WeakMaps no. Això permet optimitzar l'alliberament de memòria si es fan anar WeakMaps.</p>
+
+<p>Els Maps i Sets es podrien implementar utilitzant solament ECMAScript 5 però, com que els objectes no es poden comparar (en el sentit de poder considerar un objecte menor que un altre, per exemple), el rendiment a l'hora de cercar seria linear per força. Les implementacions d'aquestes col·leccions (incloent WeakMaps) permeten un rendiment superior, sent aproximadament entre logarítmic i constant.</p>
+
+<p>Normalment, a l'hora de vincular dades a un node del DOM, s'assignen propietats directament a l'objecte o s'utilitzen atributs del tipus <code>data-*</code>. Aquesta aproximació té l'inconvenient d'exposar aquestes dades a tots els scripts pertanyents al mateix context. Els Maps i els WeakMaps són una solució que permet vincular dades a objectes de forma privada.</p>
+
+<h3 id="Dades_estructurades_JSON">Dades estructurades: JSON</h3>
+
+<p>JSON (JavaScript Object Notation) és un format lleuger per a l'intercanvi de dades, derivat de JavaScript però utilitzat per molts llenguatges de programació. JSON construeix estructures de dades universals. Vegeu {{Glossary("JSON")}} i {{jsxref("JSON")}} per a més detalls.</p>
+
+<h3 id="Altres_objectes_de_la_llibreria_standard">Altres objectes de la llibreria standard</h3>
+
+<p>JavaScript disposa d'una llibreria standard d'objectes. Feu un cop d'ull a la <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects">referència</a> per a descobrir més objectes.</p>
+
+<h2 id="Determinar_el_tipus_utilitzant_loperador_typeof">Determinar el tipus utilitzant l'operador <code>typeof</code></h2>
+
+<p>L'operador <code>typeof</code> pot ajudar-vos a esbrinar el tipus d'una variable. Llegiu la <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof">pàgina de referència</a> per a més detalls i casos especials.</p>
+
+<h2 id="Especificacions">Especificacions</h2>
+
+<table class="standard-table">
+ <tbody>
+ <tr>
+ <th scope="col">Especificació</th>
+ <th scope="col">Estat</th>
+ <th scope="col">Comentaris</th>
+ </tr>
+ <tr>
+ <td>{{SpecName('ES1')}}</td>
+ <td>{{Spec2('ES1')}}</td>
+ <td>Definició inicial.</td>
+ </tr>
+ <tr>
+ <td>{{SpecName('ES5.1', '#sec-8', 'Types')}}</td>
+ <td>{{Spec2('ES5.1')}}</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>{{SpecName('ES6', '#sec-ecmascript-data-types-and-values', 'ECMAScript Data Types and Values')}}</td>
+ <td>{{Spec2('ES6')}}</td>
+ <td></td>
+ </tr>
+ </tbody>
+</table>
+
+<h2 id="Vegeu_també">Vegeu també</h2>
+
+<ul>
+ <li><a class="link-https" href="https://github.com/nzakas/computer-science-in-javascript/">Col·lecció d'estructures de dades i algorismes comuns en JavaScript, de Nicholas Zakas.</a></li>
+ <li><a href="https://github.com/monmohan/DataStructures_In_Javascript" title="https://github.com/monmohan/DataStructures_In_Javascript">Search Tre(i)es implemented in JavaScript</a></li>
+</ul>