1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
|
---
title: Expressions i operadors
slug: Web/JavaScript/Guide/Expressions_i_Operadors
translation_of: Web/JavaScript/Guide/Expressions_and_Operators
---
<div>{{jsSidebar("JavaScript Guide")}} {{PreviousNext("Web/JavaScript/Guide/Functions", "Web/JavaScript/Guide/Numbers_and_dates")}}</div>
<p>Aquest capítol explica les expressions i els operadors de JavaScript, incloent l'assignació, comparació, airtmètic, operadors de bits, lògics, cadenes, i operadors especials.</p>
<h2 id="Expressions">Expressions</h2>
<p>Una <em>expressió</em> és qualsevol unitat de codi vàlida que esdevé un valor.</p>
<p>Conceptualment hi ha dos tipus d'expressions: les que assignen un valor a una variable i les que simplement tenen un valor.</p>
<p>L'expressió <code>x = 7</code> és un exemple del primer tipus. Aquesta expressió fa servir l'operador<em> </em> = per a assignar el valor set a la variable <code>x</code>. L'expressió per si mateixa s'avalua com a 7.</p>
<p>El codi 3 + 4 és un exemple d'expressió del segon tipus. Aquesta expressió utilitza l'operador + per a sumar tres i quatre sense assignar el resultat, set, a una variable.<br>
<br>
JavaScript té les següents categories d'expressions:</p>
<ul>
<li>Aritmètiques: s'avaluen a un nombre, per exemple 3.14159. (Generalment utilitzen {{ web.link("#Arithmetic_operators", "operadors aritmètics") }}.)</li>
<li>String: s'avaluen a una cadena de caràcters, per exemple, "Pau" o "234". (Generalment utilitzen {{ web.link("#String_operators", "operadors d'strings") }}.)</li>
<li>Lògiques: s'avaluen a cert o fals. (sovint inclouen {{ web.link("#Logical_operators", "operadors lògics") }}.)</li>
<li>Objecte: s'avaluen a un objecte. (Vegeu els {{ web.link("#Special_operators", "operadors especials") }} més informació.)</li>
</ul>
<h2 id="Operadors">Operadors</h2>
<p>JavaScript disposa dels següents tipus d'operadors. Aquesta secció descriu els operadors i conté informació sobre la seva precedència.</p>
<ul>
<li>{{ web.link("#Assignment_operators", "Operadors d'assignació") }}</li>
<li>{{ web.link("#Comparison_operators", "Operadors de comparació") }}</li>
<li>{{ web.link("#Arithmetic_operators", "Operadors aritmètics") }}</li>
<li>{{ web.link("#Bitwise_operators", "Operadors de bits") }}</li>
<li>{{ web.link("#Logical_operators", "Operadors lògics") }}</li>
<li>{{ web.link("#String_operators", "Operadors de strings") }}</li>
<li>{{ web.link("#Special_operators", "Operadors especials") }}</li>
</ul>
<p>JavaScript té operadors <em>binaris</em> i <em>unaris</em>, també disposa d'un operador especial ternari, l'operador condicional. Un operador binari requereix dos operands, un abans l'operador i l'altre després de l'operador:</p>
<pre><em>operand1</em> <em>operador</em> <em>operand2</em>
</pre>
<p>Per exemple, <code>3+4</code> o <code>x*y</code>.</p>
<p>Un operador unari A requereix d'un sol operand, ja sigui abans o després de l'operador:</p>
<pre><em>operador</em> <em>operand</em>
</pre>
<p>o be</p>
<pre><em>operand</em> <em>operador</em>
</pre>
<p>Per exemple, <code>x++</code> o <code>++x</code>.</p>
<h3 id="Operadors_d'assignació">Operadors d'assignació</h3>
<p>Un operador d'assignació assigna un valor a l'operand de la seva esquerra basat en l'operand de la seva dreta. L'operador d'assignació simple és l'igual (<code>=</code>), que assigna el valor de l'operand de la dreta a l'operand de l'esquerra. És a dir, <code>x = y</code> assigna el valor de <code>y</code> a <code>x</code>.</p>
<p>També hi ha operadors d'assignació compostos, que són abreviacions per als operadors llistats a la taula següent:</p>
<table class="standard-table">
<caption>Taula 3.1 Operadors d'assignació</caption>
<thead>
<tr>
<th scope="col">Operadors d'assignació compostos</th>
<th scope="col">Significat</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>x += y</code></td>
<td><code>x = x + y</code></td>
</tr>
<tr>
<td><code>x -= y</code></td>
<td><code>x = x - y</code></td>
</tr>
<tr>
<td><code>x *= y</code></td>
<td><code>x = x * y</code></td>
</tr>
<tr>
<td><code>x /= y</code></td>
<td><code>x = x / y</code></td>
</tr>
<tr>
<td><code>x %= y</code></td>
<td><code>x = x % y</code></td>
</tr>
<tr>
<td><code>x <<= y</code></td>
<td><code>x = x << y</code></td>
</tr>
<tr>
<td><code>x >>= y</code></td>
<td><code>x = x >> y</code></td>
</tr>
<tr>
<td><code>x >>>= y</code></td>
<td><code>x = x >>> y</code></td>
</tr>
<tr>
<td><code>x &= y</code></td>
<td><code>x = x & y</code></td>
</tr>
<tr>
<td><code>x ^= y</code></td>
<td><code>x = x ^ y</code></td>
</tr>
<tr>
<td><code>x |= y</code></td>
<td><code>x = x | y</code></td>
</tr>
</tbody>
</table>
<h3 id="Operadors_de_comparació">Operadors de comparació</h3>
<p><span class="comment">This seems to me kind of poorly explained, mostly the difference betwen "==" and "==="...</span>Els operadors de comparació comparen els operands i retornen un valor lògic basat en si la comparació és certa o no. Els operands poden ser numèrics, string, lògics, o bé valors d'objectes. Els Strings es comparen basant-se en l'ordre lexicogràfic standard, utilitzant valors Unicode. Quan els dos operands no són del mateix tipus, en la majoria dels casos JavaScript intenta convertir-los a un tipus apropiat per a realitzar la comparació.<br>
Aquest comportament generalment resulta en una comparació amb els operands transformats a nombres. La única excepció quant a la conversió de tipus és quan s'utilitzen els operands <code>===</code> i <code>!==</code>, els quals realitzen comparacións estrictes de igualtat i no-igualtat, respectivament. Aquests operadors no intenten convertir els operands a tipus compatibles abans de aplicar l'igualtat. La taula següent descriu els operadors de comparació en base a aquest exemple:</p>
<pre class="brush: js">var var1 = 3, var2 = 4;
</pre>
<table class="standard-table">
<caption>Taula 3.2 Operadors de comparació</caption>
<thead>
<tr>
<th scope="col">Operador</th>
<th scope="col">Descripció</th>
<th scope="col">Exemples que s'avaluen a cert</th>
</tr>
</thead>
<tbody>
<tr>
<td>Igualtat (<code>==</code>)</td>
<td>Retorna true si els operands són iguals.</td>
<td><code>3 == var1</code>
<p><code>"3" == var1</code></p>
<code>3 == '3'</code></td>
</tr>
<tr>
<td>No-igualtat (<code>!=</code>)</td>
<td>Retorna true si els operands són diferents.</td>
<td><code>var1 != 4<br>
var2 != "3"</code></td>
</tr>
<tr>
<td>Igualtat estricta (<code>===</code>)</td>
<td>Retorna true si els operands són iguals i del mateix tipus. Vegeu també <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is"><code>Object.is</code></a> i <a href="/en-US/docs/Web/JavaScript/Guide/Sameness" title="/en-US/docs/Web/JavaScript/Guide/Sameness">igualtat a JS</a>.</td>
<td><code>3 === var1</code></td>
</tr>
<tr>
<td>No-igualtat estricta (<code>!==</code>)</td>
<td>Retorna true si els operands no són iguals i/o del mateix tipus.</td>
<td><code>var1 !== "3"<br>
3 !== '3'</code></td>
</tr>
<tr>
<td>Major que (<code>></code>)</td>
<td>Retorna true si l'operand de l'esquerra és més gran que l'operand e la dreta.</td>
<td><code>var2 > var1<br>
"12" > 2</code></td>
</tr>
<tr>
<td>Major o igual que (<code>>=</code>)</td>
<td>Retorna true si l'operand de l'esquera és major o igual que l'operand de la dreta.</td>
<td><code>var2 >= var1<br>
var1 >= 3</code></td>
</tr>
<tr>
<td>Menor que (<code><</code>)</td>
<td>Retorna true si l'operand de l'esquerra és més petit que l'operand de la dreta.</td>
<td><code>var1 < var2<br>
"2" < "12"</code></td>
</tr>
<tr>
<td>Menor o igual que (<code><=</code>)</td>
<td>Retorna true si l'operand de l'esquerra és menor o igual que l'operand de la dreta.</td>
<td><code>var1 <= var2<br>
var2 <= 5</code></td>
</tr>
</tbody>
</table>
<h3 id="Operadors_aritmètics">Operadors aritmètics</h3>
<p>Els operadors aritmètics prenen valors numèrics (ja siguin literals o variables) com a operands i retornen un sol valors numèric. Els operadors aritmètics standard són la suma (+), la resta (-), la multiplicació (*) i la divisió (/). Aquests operadors funcionen de la mateixa manera que a la majoria d'altres llenguatges de programació quan s'utilitzen amb nombres de coma flotant (particularment, cal destacar que la divisió entre zero produeix <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Infinity"><code>Infinity</code></a>). Per exemple:</p>
<pre class="brush: js">console.log(1 / 2); /* imprimeix 0.5 */
console.log(1 / 2 == 1.0 / 2.0); /* això també és cert */
</pre>
<p>Adicionalment, JavaScript proporciona els operadors aritmètics llistats a la taula següent:</p>
<table class="fullwidth-table">
<caption>Taula 3.3 Operadors aritmètics</caption>
<thead>
<tr>
<th scope="col">Operador</th>
<th scope="col">Descripció</th>
<th scope="col">Exemple</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>%</code><br>
(Mòdul)</td>
<td>Operador binari. Retorna el residu de dividir els dos operands.</td>
<td>12 % 5 retorna 2.</td>
</tr>
<tr>
<td><code>++</code><br>
(Increment)</td>
<td>
<p>Operador unari. Afegeix un al seu operand. Si s'utilitza com a prefix (<code>++x</code>), retorna el valor del seu operand després d'afexir-li un; si s'utilitza com a sufix (<code>x++</code>), retorna el valor del seu operand abans d'afegir-li un.</p>
</td>
<td>Si <code>x</code> és 3, llavors <code>++x</code> assigna 4 a <code>x</code> i retorna 4, mentre que <code>x++</code> retorna 3 i, només llavors, assigna 4 a <code>x</code>.</td>
</tr>
<tr>
<td><code>--</code><br>
(Decrement)</td>
<td>Operador uniari. Resta un al seu operand. Retorna el valor anàleg a l'operador increment.</td>
<td>Si <code>x</code> és 3, llavors <code>--x</code> assigna 2 a <code>x</code> i retorna 2, mentre que <code>x--</code> retorna 3 i, només llavors, assigna 2 a<code> x</code>.</td>
</tr>
<tr>
<td><code>-</code><br>
(Negació unària)</td>
<td>Operador unari. Retorna el resultat de negar el seu operand.</td>
<td>Si <code>x</code> val 3, llavors <code>-x</code> retorna -3.</td>
</tr>
</tbody>
</table>
<h3 id="Operadors_de_bits">Operadors de bits</h3>
<p>Els operadors de bits tracten els seus operands com a conunts de 32 bits (zeros i uns), en comptes de com a nombres decimals, hexadecimals o octals. Per exemple, el nombre decimal 9 és representat de forma binària per 1001. Els operadors de bits realitzen operacions sobre aquestes representacions binàries, però sempre retornen valors numèrics de JavaScript.</p>
<p>La taula següent resumeix els operadors de bits disponibles a JavaScript.</p>
<table class="standard-table">
<caption>Taula 3.4 Operadors de bits</caption>
<thead>
<tr>
<th scope="col">Operador</th>
<th scope="col">Ús</th>
<th scope="col">Descripció</th>
</tr>
</thead>
<tbody>
<tr>
<td>AND binari</td>
<td><code>a & b</code></td>
<td>Retorna 1 a cada posició de bit on la posició corresponent a ambdós operadors conten uns.</td>
</tr>
<tr>
<td>OR binari</td>
<td><code>a | b</code></td>
<td>
<p>Retorna 1 a cada posició de bit on al menys un dels operands té un 1 a la posició corresponent.</p>
</td>
</tr>
<tr>
<td>XOR binari</td>
<td><code>a ^ b</code></td>
<td>
<p>Retorna un 1 a cada posició de bit on només un dels operands té un 1 a la posicio corresponent, però no ambdós.</p>
</td>
</tr>
<tr>
<td>NOT binari</td>
<td><code>~ a</code></td>
<td>Inverteix els bits del seu operand.</td>
</tr>
<tr>
<td>Desplaçament a l'esquerra</td>
<td><code>a << b</code></td>
<td>Desplaça la representació binària de <code>a</code> <code>b</code> bits a l'esquerra, afegint zeros a la dreta.</td>
</tr>
<tr>
<td>Desplaçament a la dreta amb propagació de signe</td>
<td><code>a >> b</code></td>
<td>Desplaça la representació binària de <code>a</code> <code>b</code> bits a la dreta, descartant els bits que no hi caben.</td>
</tr>
<tr>
<td>Desplaçament a la dreta amb inserció de zeros</td>
<td><code>a >>> b</code></td>
<td>Desplaça la representació binària de <code>a</code> <code>b</code> bits a la dreta, descartant els bits que no hi caben i inserint zeros a l'esquerra.</td>
</tr>
</tbody>
</table>
<h4 id="Bitwise_Logical_Operators" name="Bitwise_Logical_Operators">Operadors lògics de bits</h4>
<p>Conceptualment, els operadors lògics de bits funcionen de la següent manera:</p>
<ul>
<li>Es converteixen els operands a nombres sencers de 32 bits expressats per una sèrie de bits (zeros i uns).</li>
<li>S'emparella cada bit del primer operand amb el bit corresponent del segond operand: el primer bit amb el primer bit, el segon amb el segon, etcètera.</li>
<li>S'aplica l'operador per a cada parella de bits, i el resultat es construeix de forma binària.</li>
</ul>
<p>Per exemple, la representació binària de 9 és 1001, mentre que la representació binària de quinze és 1111. Així, quan els operadors de bits s'apliquen a aquests valors el resultat és el següent:</p>
<table class="standard-table">
<caption>Taula 3.5 Exemples d'operadors de bits</caption>
<thead>
<tr>
<th scope="col">Expressió</th>
<th scope="col">Resultat</th>
<th scope="col">Descripció binària</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>15 & 9</code></td>
<td><code>9</code></td>
<td><code>1111 & 1001 = 1001</code></td>
</tr>
<tr>
<td><code>15 | 9</code></td>
<td><code>15</code></td>
<td><code>1111 | 1001 = 1111</code></td>
</tr>
<tr>
<td><code>15 ^ 9</code></td>
<td><code>6</code></td>
<td><code>1111 ^ 1001 = 0110</code></td>
</tr>
<tr>
<td><code>~15</code></td>
<td><code>-16</code></td>
<td><code>~</code><code>00000000...</code><code>00001111 = </code><code>1111</code><code>1111</code><code>...</code><code>11110000</code></td>
</tr>
<tr>
<td><code>~9</code></td>
<td><code>-10</code></td>
<td><code>~</code><code>00000000</code><code>...</code><code>0000</code><code>1001 = </code><code>1111</code><code>1111</code><code>...</code><code>1111</code><code>0110</code></td>
</tr>
</tbody>
</table>
<p>Fixeu-vos que a l'utilitzar l'operador de bits <code>NOT</code> tots 32 bits són invertit, i que els valors amb el bit més significatiu (el de l'esquerra) amb valor 1 representen nombres negatius (representació en complement a dos).</p>
<h4 id="Bitwise_Shift_Operators" name="Bitwise_Shift_Operators">Operadors de desplaçament de bits</h4>
<p>Els operadors de desplaçament de bits requereixen de dos operands: el primer és un conjunt de bits a desplaçar. El segon operand és el nombre de posicions que es desplaçaran els bits del primer operand. La direcció des desplaçament és controlada per l'operador utilitzat.</p>
<p>Els operadors de desplaçament de bits converteixen els seus operands a nombres de 32 bits i el valor retornat és del mateix tipus que l'operand de l'esquerra. Trobareu un llistat amb els operadors de desplaçament de bits a la taula següent.</p>
<table class="fullwidth-table">
<caption>Taula 3.6 Operadors de desplaçament de bits</caption>
<thead>
<tr>
<th scope="col">Operador</th>
<th scope="col">Descripció</th>
<th scope="col">Exemple</th>
</tr>
</thead>
<tbody>
<tr>
<td><code><<</code><br>
(Desplaçament a l'esquerra)</td>
<td>
<p>Aquest operador desplaça a l'esquerra el primer operand el nombre de bits especificat. Els bits que no hi caben es descarten. Les noves posicions de la dreta s'omplen amb zeros.</p>
</td>
<td><code>9<<2</code> retorna 36, perquè 1001 desplaçat 2 bits a l'esquerra esdevé 100100, que és la representació binaria de 36.</td>
</tr>
<tr>
<td><code>>></code><br>
(Desplaçament a la dreta amb propagació de signe)</td>
<td>
<p>Aquest operador desplaça el primer operand el nombre de bits especificats cap a la dreta. Els nous bits de l'esquerra són copies del bit originalment més significatiu.</p>
</td>
<td><code>9>>2</code> retorna 2, perquè 1001 desplaçat 2 bits a la dreta esdevé 10, que és la representació binària de 2. De la mateixa manera, <code>-9>>2</code> retorna -3, perquè el signe l'operand preseva el signe.</td>
</tr>
<tr>
<td><code>>>></code><br>
(Desplaçament a la dreta omplint amb zeros)</td>
<td>
<p>Aquest operador desplaça l'operand el nombre de bits especificat a la dreta. Els bits sobrant són descartats. Els nous bits de l'esquerra s'omplen amb zeros.</p>
</td>
<td><code>19>>>2</code> retorna 4, perquè 10011 desplaçat 2 bits a la dreta esdevé 100, que és la representació binària de 4. Per a nombres no negatius aquest operador retorna el mateix resultat que l'operador de desplaçament a la dreta amb propagació de signe.</td>
</tr>
</tbody>
</table>
<h3 id="Operadors_lògics">Operadors lògics</h3>
<p>Els operadors lògics utilitzen típicament amb valors booleans (lògics); quan ho són, retornen un valor de tipus Boolean. Els operadors && i || , però, en realitat retornen el valor d'un dels operands, de tal manera que si aquests operadors s'utilitzen amb valors no booleans poden retornar un valor no booleà. A la següent taula es descriuen els operadors lògics.</p>
<table class="fullwidth-table">
<caption>Taula 3.6 Operadors lògics</caption>
<thead>
<tr>
<th scope="col">Operador</th>
<th scope="col">Ús</th>
<th scope="col">Descripció</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>&&</code></td>
<td><code>expr1 && expr2</code></td>
<td>(AND lògic) Retorna <code>expr1</code> si pot ser convertida a fals; en qualsevol altre cas retorna <code>expr2</code>. Així, quan es proporcionen operands booleans, <code>&&</code> retorna true si ambdós operands són true: en qualsevol altre cas retorna fals.</td>
</tr>
<tr>
<td><code>||</code></td>
<td><code>expr1 || expr2</code></td>
<td>(OR lògic) Retorna <code>expr1</code> si pot ser convertida a true; en qualsevol altre cas retorna <code>expr2</code>. És a dir, quan s'utilitza amb operands booleans, <code>||</code> retorna true si qualsevol dels dos operands és true; si ambdós operands són false, retorna false.</td>
</tr>
<tr>
<td><code>!</code></td>
<td><code>!expr</code></td>
<td>(NOT lògic) Retorna false si el seu únic operand es pot convertir a true; en qualsevol altre cas retorna true.</td>
</tr>
</tbody>
</table>
<p>Alguns exemples d'expressions que es poden convertir a false són aquelles que s'avaluen a <code>null</code>, <code>0</code>, <code>NaN</code>, l'string buit (<code>""</code>), o <code>undefined</code>.</p>
<p>El codi següent mostra exemples de l'operador && (AND lògic).</p>
<pre class="brush: js">var a1 = true && true; // t && t retorna true
var a2 = true && false; // t && f retorna false
var a3 = false && true; // f && t retorna false
var a4 = false && (3 == 4); // f && f retorna false
var a5 = "Cat" && "Dog"; // t && t retorna Dog
var a6 = false && "Cat"; // f && t retorna false
var a7 = "Cat" && false; // t && f retorna false
</pre>
<p>El codi següent mostra exemples de l'operador || (OR lògic).</p>
<pre class="brush: js">var o1 = true || true; // t || t retorna true
var o2 = false || true; // f || t retorna true
var o3 = true || false; // t || f retorna true
var o4 = false || (3 == 4); // f || f retorna false
var o5 = "Cat" || "Dog"; // t || t retorna Cat
var o6 = false || "Cat"; // f || t retorna Cat
var o7 = "Cat" || false; // t || f retorna Cat
</pre>
<p>El codi següent mostra exemples de l'operador ! (NOT lògic).</p>
<pre class="brush: js">var n1 = !true; // !t retorna false
var n2 = !false; // !f retorna true
var n3 = !"Cat"; // !t retorna false
</pre>
<h4 id="Short-Circuit_Evaluation" name="Short-Circuit_Evaluation">Avaluació en curtcircuit</h4>
<p>Mentre les expressions lògiques es van avaluant una a una d'esquerra a dreta, a l'avaluar cadascuna també s'avalua si curtcirquiatar l'expressió mitjançant les regles següents:</p>
<ul>
<li><code>false</code> && <em>quelcom</em> es curtcircuita avaluant-se a false.</li>
<li><code>true</code> || quelcom es curtcircuita avaluant-se a true.</li>
</ul>
<p>Les regles de la lògica garanteixen que aquestes avaluacions sempre són correctes. Cal remarca que la part <em>quelcom</em> no arriva a avaluar-se mai, així que cap efecte secundari provocat per la seva avaluació tindrà efecte.</p>
<h3 id="Operadors_de_Strings">Operadors de Strings</h3>
<p>A més dels operadors de comparació, que poden utilitzar-se amb valors de tipus string, l'operador de concatenació (+) concatena dos valors string, retornant un altre string format per la unió dels dos strings operands. Per exemple, <code>"la meva " + "string"</code> retorna la string <code>"la meva string"</code>.</p>
<p>L'abreviació de operador d'assignació += també pot ser emprat per a concatenar strings. Per exemple, si la variable <code>mystring</code> te el valor "alfa", llavors l'expressió <code>mystring += "bet"</code> s'avalua a "alfabet" i assigna aquest valor a <code>mystring</code>.</p>
<h3 id="Operadors_especial">Operadors especial</h3>
<p>JavaScript ofereix els següents operadors especials:</p>
<ul>
<li>{{ web.link("#Conditional_operator", "Operador condicional") }}</li>
<li>{{ web.link("#Comma_operator", "Operador coma") }}</li>
<li><code>{{ web.link("#delete", "delete") }}</code></li>
<li><code>{{ web.link("#in", "in") }}</code></li>
<li><code>{{ web.link("#instanceof", "instanceof") }}</code></li>
<li><code>{{ web.link("#new", "new") }}</code></li>
<li><code>{{ web.link("#this", "this") }}</code></li>
<li><code>{{ web.link("#typeof", "typeof") }}</code></li>
<li><code>{{ web.link("#void", "void") }}</code></li>
</ul>
<h4 id="conditional_operator" name="conditional_operator">Operador condicional</h4>
<p>L'operador condicional és l'únic operador de JavaScript que accepta tres operands. L'operador retorna un de dos valors basant-se en una condició. La sintaxi és la següent:</p>
<pre><em>condició</em> ? <em>val1</em> : <em>val2</em>
</pre>
<p>Si <code>condició</code> és certa, l'operador retorna el valor <code>val1</code>. En qualsevol altre cas retorna el valor <code>val2</code>. Es pot emprar l'operador condicional a qualsevol lloc on es pugui utilitzar un operador standard.</p>
<p>Per exemple,</p>
<pre class="brush: js">var estat = (edat >= 18) ? "adult" : "menor";
</pre>
<p>Aquesta sentència assigna el valor "adult" a la variable <code>estat</code> si edat és 18 o més. En qualsevol altre cas assigna el valor "menor" a <code>estat</code>.</p>
<h4 id="comma_operator" name="comma_operator">Operador coma</h4>
<p>L'operador coma (<code>,</code>) simplement avalua els seus dos operands i retorna el valor del segon operand. Aquest operdor s'utilitza principalment dins el bucle <code>for</code> per a permetre que múltiples variables s'actualitzin per a cada volta del bucle.</p>
<p>Per exemple, si <code>a</code> és un array de dues dimensions amb 10 elements per dimensió, el codi següent utilitza l'operador coma per a incrementar dues variables a l'hora. El codi mostra els valors dels elements de la diagonal de l'array:</p>
<pre class="brush: js">for (var i = 0, j = 9; i <= j; i++, j--)
document.writeln("a[" + i + "][" + j + "]= " + a[i][j]);
</pre>
<h4 id="delete" name="delete"><code>delete</code></h4>
<p>L'operador <code>delete</code> esborra un objecte, una propietat d'un objecte o l'element a la posició especificada d'un array. La sintaxi és:</p>
<pre class="brush: js">delete nomObjecte;
delete nomObjecte.property;
delete nomObjecte[index];
delete propietat; // Només és legal dins una sentència with
</pre>
<p>on <code>nomObjecte</code> és el nom d'un objecte, <code>propietat</code> és una propietat existent i <code>index</code> és un nombre sencer que representa la posició d'un element dins un array.</p>
<p>La quarta forma només és legal dins una sentència <code>with</code>, per a esborrar la propietat d'un objecte.</p>
<p>Es pot emprar l'operador <code>delete</code> per a esborrar variables declarades implícitament però no serveix per a variables declarades amb la sentència <code>var</code>.</p>
<p>Si l'operador delete aconsegueix el seu objectiu, assigna el valor <code>undefined</code> a la propietat o element esmentat. L'operador <code>delete</code> retorna true si l'operació és posible; retorna false si l'operació no és posible.</p>
<pre class="brush: js">x = 42;
var y = 43;
myobj = new Number();
myobj.h = 4; // crea la propietat h
delete x; // retorna true (pot esborrar si la variable ha estat declarada implicitament)
delete y; // retorna false (no pot esborrar si la variable ha estat declarada amb var)
delete Math.PI; // retorna false (no pot esborrar propietats predefinides)
delete myobj.h; // retorna true (pot esborrar propietats definides per l'usuari)
delete myobj; // retorna true (pot esborrar si l'objecte ha estat declarat implícitament)
</pre>
<h5 id="Esborrar_elements_d'un_array">Esborrar elements d'un array</h5>
<p>A l'esborrar l'element d'un array, la longitud de l'array no es veu afectada. Per exemple, si s'esborrar <code>a[3]</code>, <code>a[4]</code> roman a <code>a[4]</code> mentre que <code>a[3]</code> passa a valer <code>undefined</code>.</p>
<p>Quan l'operador delete esborra un element d'un array, aquest element ja no és a l'array. Al següent exemple, s'esborra <code>trees[3]</code> amb delete. Tot i així, <code>trees[3]</code> encara és accessible i retorna <code>undefined</code>.</p>
<pre class="brush: js">var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
delete trees[3];
if (3 in trees) {
// aquest codi no s'arriba a executar mai
}
</pre>
<p>Si es vol que un element d'un array existeixi però tingui un valor indefinit, es pot emprar la paraula clau undefined en comptes de l'operador <code>delete</code>. Al següent exemple, <code>trees[3]</code> rep el valor <code>undefined</code>, però l'elelement de l'array encara existeix:</p>
<pre class="brush: js">var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
trees[3] = undefined;
if (3 in trees) {
// aquest codi s'executa
}
</pre>
<h4 id="in" name="in"><code>in</code></h4>
<p>L'operador <code>in</code> retorna true si la propietat especificada existeix en l'objecte especificat. La sintaxi és:</p>
<pre class="brush: js">nomPropOnombre in nomObjecte
</pre>
<p>on <code>nomPropOnombre</code> és una string que representa el nom d'una propietat o bé una expressió numèrica que representa la posició d'un element dins un array, i <code>nomObjecte</code> és el nom d'un objecte.</p>
<p>Els següents exemples mostren alguns usos de l'operador <code>in</code>.</p>
<pre class="brush: js">// Arrays
var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
0 in trees; // retorna true
3 in trees; // retorna true
6 in trees; // retorna false
"bay" in trees; // retorna false (s'ha de proporcionar l'índex,
// no el valor a aquell índex)
"length" in trees; // retorna true (length és una propietat de Array)
// Objects predefinits
"PI" in Math; // retorna true
var myString = new String("coral");
"length" in myString; // retorna true
// Objectes creats per l'usuari
var mycar = {make: "Honda", model: "Accord", year: 1998};
"make" in mycar; // retorna true
"model" in mycar; // retorna true
</pre>
<h4 id="instanceof" name="instanceof"><code>instanceof</code></h4>
<p>L'operador <code>instanceof</code> retorna cert si l'objecte especificat és del tipus especificat. La sintaxi és:</p>
<pre class="brush: js">nomObjecte instanceof tipusObjecte
</pre>
<p>on <code>nomObjecte</code> és el nom de l'objecte a comprarar amb <code>tipusObjecte</code>, i tipusObjecte és un tipus d'objecte, com ara <code>Date</code> o <code>Array</code>.</p>
<p>Utilitzeu <code>instanceof</code> quan necessiteu confirmar el tipus d'un objecte en temps d'execució. Per exemple, a l'hora de capturar execepcions és posible executar diferent codi segons el tipus d'excepció llençada.</p>
<p>Per exemple, el següent codi utilitza instanceof per a determinar si <code>dia</code> és un objecte de tipus <code>Date</code>. Com que dia és un objecte de tipus <code>Date</code> les sentències dins la sentència <code>if</code> s'executaran.</p>
<pre class="brush: js">var dia = new Date(1995, 12, 17);
if (dia instanceof Date) {
// bloc de codi que s'executarà
}
</pre>
<h4 id="new" name="new"><code>new</code></h4>
<p>L'operador <code>new</code> s'utilitza per a crear una instància d'un tipus d'objete definit per l'usuari o bé un dels tipus d'objectes predefinits <code>Array</code>, <code>Boolean</code>, <code>Date</code>, <code>Function</code>, <code>Image</code>, <code>Number</code>, <code>Object</code>, <code>Option</code>, <code>RegExp</code>, o <code>String</code>. Al servidor també es pot emprar amb <code>DbPool</code>, <code>Lock</code>, <code>File</code>, i <code>SendMail</code>. La sintaxi de <code>new</code> és la següent:</p>
<pre class="brush: js">var nomObjecte = new tipusObjecte([param1, param2, ..., paramN]);
</pre>
<p>També és posible crear objectes mitjançant inicialitzadors d'objectes, tal i com s'explica a {{ web.link("Working_with_objects#Using_object_initializers", "utilitzar inicialitzadors d'objectes") }}.</p>
<p>Vegeu la pàgina de l'<a href="/en-US/docs/Web/JavaScript/Reference/Operators/new">operador <code>new</code></a> a la Referència del nucli de JavaScript per a més informació.</p>
<h4 id="this" name="this"><code>this</code></h4>
<p>La paraula clau <code>this</code> s'utilitza per a referir-se a l'objecte actual. En general this fa referència a l'objecte que ha realitzat la crida dins un mètode. La sintaxi de <code>this</code> és la següent:</p>
<pre class="brush: js">this["nomPropietat"]
</pre>
<pre class="brush: js">this.nomPropietat
</pre>
<p><strong>Exemple 1.</strong><br>
Suposem que una funció anomenada <code>validate</code> valida la propietat <code>value</code> d'un objecte, donat l'objecte i el rang de valors:</p>
<pre class="brush: js">function validate(obj, lowval, hival){
if ((obj.value < lowval) || (obj.value > hival))
alert("Valor no vàlid!");
}
</pre>
<p>Podríem cridar <code>validate</code> a cada manegador d'events <code>onChange</code> dels elements d'un formulari, utilitzant <code>this</code> per a passar l'element del formulari, tal i com es mostra al següent exemple:</p>
<pre class="brush: html"><B>Introduïu un nombre entre 18 i 99:</B>
<INPUT TYPE="text" NAME="edat" SIZE=3
onChange="validate(this, 18, 99);">
</pre>
<p><strong>Exemple 2.</strong><br>
Al combinar-lo amb la propietat del <code>form</code>, <code>this</code> fa referència al pare de l'objecte del formulari. Al següent exemple el form <code>myForm</code> conté un bojecte <code>Text</code> i un botó. Quan l'usuari fa clic al botó, el valor de l'objecte <code>Text</code> és assignat al nom del formulari. El manegador de l'event <code>onClick</code> del botó utilitza <code>this.form</code> per a fererir-se al fomulari pare, <code>myForm</code>.</p>
<pre class="brush: html"><FORM NAME="myForm">
Nom del formulari:<INPUT TYPE="text" NAME="text1" VALUE="Beluga"/>
<INPUT NAME="button1" TYPE="button" VALUE="Mostrar el nom del formulari"
onClick="this.form.text1.value = this.form.name;"/>
</FORM>
</pre>
<h4 id="typeof" name="typeof"><code>typeof</code></h4>
<p>L'operador <code>typeof</code> es pot utilitzar de qualsevol de les formes següents:</p>
<ol>
<li>
<pre class="brush: js">typeof operand
</pre>
</li>
<li>
<pre class="brush: js">typeof (operand)
</pre>
</li>
</ol>
<p>L'operador <code>typeof</code> retorna una string indicant el tipus de l'operand, que no és avaluat. operand és una string, variable, paraula clau u objecte del qual es retornarà el tipus. Els parèntesi són opcionals.</p>
<p>Suposem que es defineixen les següents variables:</p>
<pre class="brush: js">var myFun = new Function("5 + 2");
var forma = "rodona";
var tamany = 1;
var avui = new Date();
</pre>
<p>L'operador <code>typeof</code> retornarà els següents resultats per a aquestes variables:</p>
<pre class="brush: js">typeof myFun; // retorna "function"
typeof forma; // retorna "string"
typeof tamany; // retorna "number"
typeof avui; // retorna "object"
typeof noExisteix; // retorna "undefined"
</pre>
<p>Per a les paraules clau <code>true</code> i <code>null</code>, l'operador <code>typeof</code> retorna els següents resultats:</p>
<pre class="brush: js">typeof true; // retorna "boolean"
typeof null; // retorna "object"
</pre>
<p>Per a un nombre o string, l'operador <code>typeof</code> retorna els següents resultats:</p>
<pre class="brush: js">typeof 62; // retorna "number"
typeof 'Hola món'; // retorna "string"
</pre>
<p>Per a valors de propietats, l'operador <code>typeof</code> retorna el tipus del valor que conté la propietat:</p>
<pre class="brush: js">typeof document.lastModified; // retorna "string"
typeof window.length; // retorna "number"
typeof Math.LN2; // retorna "number"
</pre>
<p>Per a mètodes i funcions, l'operador <code>typeof</code> retorna els següents resultats:</p>
<pre class="brush: js">typeof blur; // retorna "function"
typeof eval; // retorna "function"
typeof parseInt; // retorna "function"
typeof shape.split; // retorna "function"
</pre>
<p>Per a objectes predefinits, l'operador <code>typeof</code> retorna els resultats següents:</p>
<pre class="brush: js">typeof Date; // retorna "function"
typeof Function; // retorna "function"
typeof Math; // retorna "object"
typeof Option; // retorna "function"
typeof String; // retorna "function"
</pre>
<h4 id="void" name="void"><code>void</code></h4>
<p>L'operador <code>void</code> es pot emprar de qualsevol de les maneres següents:</p>
<ol>
<li>
<pre class="brush: js">void (expression)
</pre>
</li>
<li>
<pre class="brush: js">void expression
</pre>
</li>
</ol>
<p>L'operador <code>void</code> avalua una expressió però no retorna cap valor. <code>expression</code> és l'expressió JavaScript a avaluar. Els parèntesi que embocallen l'expressió són opcionals, però es considera una bona pràctica utilitzar-los.</p>
<p>És possible utilitzar l'operador <code>void</code> per a especificar una expressió com a hipervincle. L'expressió serà avaluada però el seu contingut no reemplaçarà el contingut del document actual.</p>
<p>El codi següent crea un hipervincle que no fa res quan l'usuari faci clic a l'hipervincle. Quan l'usuari fa clic al l'hipervincle, <code>void(0)</code> serà avaluada com a <code>undefined</code>, la qual cosa no té cap efecte en JavaScript.</p>
<pre class="brush: html"><A HREF="javascript:void(0)">Cliqueu aquí per a no fer res</A>
</pre>
<p>El codi següent crea un hipervincle que envia un formulari quan l'usuari fa clic sobre ell.</p>
<pre class="brush: html"><A HREF="javascript:void(document.form.submit())">
Feu clic aquí per a enviar el formulari</A></pre>
<h3 id="Precedència_d'operadors">Precedència d'operadors</h3>
<p>La <em>precedència</em> d'operadors determina l'ordre en el qual aquests s'apliquen quan s'avalua una expressió. Es pot canviar aquest comportament mitjançant parèntesi.</p>
<p>La taula següent descriu la precedència dels operadors, del més prioritari al que ho és menys.</p>
<table class="standard-table">
<caption>Taula 3.7 Precedència d'operadors</caption>
<thead>
<tr>
<th scope="col">Tipus d'operador</th>
<th scope="col">Operadors individuals</th>
</tr>
</thead>
<tbody>
<tr>
<td>membre</td>
<td><code>. []</code></td>
</tr>
<tr>
<td>crida / creació d'una instància</td>
<td><code>() new</code></td>
</tr>
<tr>
<td>negació/increment</td>
<td><code>! ~ - + ++ -- typeof void delete</code></td>
</tr>
<tr>
<td>multiplicació/divisió</td>
<td><code>* / %</code></td>
</tr>
<tr>
<td>suma/resta</td>
<td><code>+ -</code></td>
</tr>
<tr>
<td>desplaçament de bits</td>
<td><code><< >> >>></code></td>
</tr>
<tr>
<td>relacionals</td>
<td><code>< <= > >= in instanceof</code></td>
</tr>
<tr>
<td>igualtat</td>
<td><code>== != === !==</code></td>
</tr>
<tr>
<td>AND binari</td>
<td><code>&</code></td>
</tr>
<tr>
<td>XOR binari</td>
<td><code>^</code></td>
</tr>
<tr>
<td>OR binari</td>
<td><code>|</code></td>
</tr>
<tr>
<td>AND lògic</td>
<td><code>&&</code></td>
</tr>
<tr>
<td>OR lògic</td>
<td><code>||</code></td>
</tr>
<tr>
<td>condicional</td>
<td><code>?:</code></td>
</tr>
<tr>
<td>assignació</td>
<td><code>= += -= *= /= %= <<= >>= >>>= &= ^= |=</code></td>
</tr>
<tr>
<td>coma</td>
<td><code>,</code></td>
</tr>
</tbody>
</table>
<p>Trobareu una versió més detallada d'aqueta taula, completa amb enllaços a a detalls adicionals per a cada operador a la <a href="/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#Table">Referència de JavaScript</a>.</p>
|