/
index.html
4185 lines (3846 loc) · 398 KB
/
index.html
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
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!doctype html>
<html itemscope itemtype="http://schema.org/Book" lang="es-es">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge;chrome=1">
<meta charset="utf-8">
<meta http-equiv="Content-language" content="es"/>
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1"/>
<meta name="description" content="El propósito de este libro es proveer un resumen de la biblioteca, de tal forma que para cuando lo haya terminado de leer, será capaz de realizar tareas básicas utilizando jQuery y tendrá una sólida base para continuar el aprendizaje."/>
<meta itemprop="name" content="Libro gratuito de jQuery en español - Fundamentos de jQuery">
<meta itemprop="description" content="El propósito de este libro es proveer un resumen de la biblioteca, de tal forma que para cuando lo haya terminado de leer, será capaz de realizar tareas básicas utilizando jQuery y tendrá una sólida base para continuar el aprendizaje.">
<meta itemprop="image" content="http://librojquery.com/img/jquery-logo.gif">
<meta property="og:url" content="http://librojquery.com/"/>
<meta property="og:title" content="Libro gratuito de jQuery en español - Fundamentos de jQuery"/>
<meta property="og:image" content="http://librojquery.com/img/jquery-logo.gif"/>
<meta property="og:description" content="El propósito de este libro es proveer un resumen de la biblioteca, de tal forma que para cuando lo haya terminado de leer, será capaz de realizar tareas básicas utilizando jQuery y tendrá una sólida base para continuar el aprendizaje."/>
<title>Libro gratuito de jQuery en español - Fundamentos de jQuery</title>
<link rel="stylesheet" type="text/css" href="css/markdown.css" media="screen, projection, print">
<link rel="stylesheet" type="text/css" href="css/style.css" media="screen, projection, print">
<link rel="stylesheet" type="text/css" href="css/stylePrint.css" media="print">
<link rel="canonical" href="http://librojquery.com/" />
</head>
<body>
<div id="titlepage">
<h1 class="title maintitle">
<a title="Fundamentos de jQuery" href="http://librojquery.com/">Fundamentos de jQuery</a>
</h1>
<div class="social">
<ul>
<li>
<div class="fb-like" data-href="http://librojquery.com/" data-send="false" data-layout="button_count" data-width="115" data-show-faces="false"></div>
<div id="fb-root"></div>
</li>
<li>
<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" data-via="dzignus" data-lang="es">Tweet</a>
</li>
<li>
<div class="g-plusone" data-size="medium" data-href="http://librojquery.com/"></div>
</li>
</ul>
</div>
<div class="clear"></div>
<h3>Textos originales por <a href="http://www.rebeccamurphey.com">Rebecca Murphey</a></h3>
<div class="translators">
<h3 class="translator">Traducción, adaptación y textos adicionales por <a href="http://dzign.us/">Leandro D'Onofrio</a>.</h3>
<h3 class="corrections">Correcciones por <a href="http://ar.linkedin.com/in/gustavoaragon/">Gustavo Raúl Aragón</a>, <a href="http://www.linkedin.com/pub/pablo-andr%C3%A9s-maronna/10/713/373">Pablo Maronna</a>, <a href="http://es.linkedin.com/in/denisciccale">Denis Ciccale</a> y <a href="https://github.com/dzignus/librojquery/wiki/Otras-personas-que-tambi%C3%A9n-ayudaron-con-el-material">otras personas</a>.</h3>
</div>
<h3>Con contribuciones de James Padolsey, Paul Irish y otros. Para un completo historial de contribuciones visite el repositorio en GitHub.</h3>
<h3><a href="https://github.com/dzignus/librojquery" rel="_blank">Repositorio en español</a> | <a href="http://github.com/rmurphey/jqfundamentals" rel="_blank">Repositorio original</a></h3>
<h4><a href="https://github.com/dzignus/librojquery/wiki/Mejoras-y-correcciones-en-el-material" rel="_blank">¿Tienes correcciones o mejoras del material?</a></h4>
<p title="Aviso Legal">
Bajo licencia <a href="http://creativecommons.org/licenses/by-sa/3.0/us/" rel="_blank">Creative Commons Attribution-Share Alike 3.0 United States</a>.
</p>
<p>
<strong>Última actualización del libro:</strong> Junio 2013 (<a href="https://github.com/dzignus/librojquery/commits/master" rel="_blank">ver cambios</a>).
</p>
</div>
<div id="TOC">
<h2>Contenidos</h2>
<ul>
<li><a href="#bienvenidoa"><span class="toc-section-number">1</span> Bienvenido/a</a><ul>
<li><a href="#obtener-el-material-de-aprendizaje"><span class="toc-section-number">1.1</span> Obtener el Material de Aprendizaje</a></li>
<li><a href="#software"><span class="toc-section-number">1.2</span> Software</a></li>
<li><a href="#añadir-javascript-a-una-página"><span class="toc-section-number">1.3</span> Añadir JavaScript a una Página</a></li>
<li><a href="#depuración-del-código-javascript"><span class="toc-section-number">1.4</span> Depuración del Código JavaScript</a></li>
<li><a href="#ejercicios"><span class="toc-section-number">1.5</span> Ejercicios</a></li>
<li><a href="#convenciones-utilizadas-en-el-libro"><span class="toc-section-number">1.6</span> Convenciones Utilizadas en el Libro</a></li>
<li><a href="#notas-de-la-traducción"><span class="toc-section-number">1.7</span> Notas de la Traducción</a></li>
<li><a href="#material-de-referencia"><span class="toc-section-number">1.8</span> Material de Referencia</a></li>
</ul></li>
<li><a href="#conceptos-básicos-de-javascript"><span class="toc-section-number">2</span> Conceptos Básicos de JavaScript</a><ul>
<li><a href="#introducción"><span class="toc-section-number">2.1</span> Introducción</a></li>
<li><a href="#sintaxis-básica"><span class="toc-section-number">2.2</span> Sintaxis Básica</a></li>
<li><a href="#operadores"><span class="toc-section-number">2.3</span> Operadores</a><ul>
<li><a href="#operadores-básicos"><span class="toc-section-number">2.3.1</span> Operadores Básicos</a></li>
<li><a href="#operaciones-con-números-y-cadenas-de-caracteres"><span class="toc-section-number">2.3.2</span> Operaciones con Números y Cadenas de Caracteres</a></li>
<li><a href="#operadores-lógicos"><span class="toc-section-number">2.3.3</span> Operadores Lógicos</a></li>
<li><a href="#operadores-de-comparación"><span class="toc-section-number">2.3.4</span> Operadores de Comparación</a></li>
</ul></li>
<li><a href="#código-condicional"><span class="toc-section-number">2.4</span> Código Condicional</a><ul>
<li><a href="#elementos-verdaderos-y-falsos"><span class="toc-section-number">2.4.1</span> Elementos Verdaderos y Falsos</a></li>
<li><a href="#variables-condicionales-utilizando-el-operador-ternario"><span class="toc-section-number">2.4.2</span> Variables Condicionales Utilizando el Operador Ternario</a></li>
<li><a href="#declaración-switch"><span class="toc-section-number">2.4.3</span> Declaración Switch</a></li>
</ul></li>
<li><a href="#bucles"><span class="toc-section-number">2.5</span> Bucles</a><ul>
<li><a href="#bucles-utilizando-for"><span class="toc-section-number">2.5.1</span> Bucles Utilizando For</a></li>
<li><a href="#bucles-utilizando-while"><span class="toc-section-number">2.5.2</span> Bucles Utilizando While</a></li>
<li><a href="#bucles-utilizando-do-while"><span class="toc-section-number">2.5.3</span> Bucles Utilizando Do-while</a></li>
<li><a href="#break-y-continue"><span class="toc-section-number">2.5.4</span> Break y Continue</a></li>
</ul></li>
<li><a href="#palabras-reservadas"><span class="toc-section-number">2.6</span> Palabras Reservadas</a></li>
<li><a href="#vectores"><span class="toc-section-number">2.7</span> Vectores</a></li>
<li><a href="#objetos"><span class="toc-section-number">2.8</span> Objetos</a></li>
<li><a href="#funciones"><span class="toc-section-number">2.9</span> Funciones</a><ul>
<li><a href="#utilización-de-funciones"><span class="toc-section-number">2.9.1</span> Utilización de Funciones</a></li>
<li><a href="#funciones-anónimas-autoejecutables"><span class="toc-section-number">2.9.2</span> Funciones Anónimas Autoejecutables</a></li>
<li><a href="#funciones-como-argumentos"><span class="toc-section-number">2.9.3</span> Funciones como Argumentos</a></li>
</ul></li>
<li><a href="#determinación-del-tipo-de-variable"><span class="toc-section-number">2.10</span> Determinación del Tipo de Variable</a></li>
<li><a href="#la-palabra-clave-this"><span class="toc-section-number">2.11</span> La palabra clave <code>this</code></a></li>
<li><a href="#alcance"><span class="toc-section-number">2.12</span> Alcance</a></li>
<li><a href="#clausuras"><span class="toc-section-number">2.13</span> Clausuras</a></li>
</ul></li>
<li><a href="#conceptos-básicos-de-jquery"><span class="toc-section-number">3</span> Conceptos Básicos de jQuery</a><ul>
<li><a href="#document.ready"><span class="toc-section-number">3.1</span> $(document).ready()</a></li>
<li><a href="#selección-de-elementos"><span class="toc-section-number">3.2</span> Selección de Elementos</a><ul>
<li><a href="#comprobar-selecciones"><span class="toc-section-number">3.2.1</span> Comprobar Selecciones</a></li>
<li><a href="#guardar-selecciones"><span class="toc-section-number">3.2.2</span> Guardar Selecciones</a></li>
<li><a href="#refinamiento-y-filtrado-de-selecciones"><span class="toc-section-number">3.2.3</span> Refinamiento y Filtrado de Selecciones</a></li>
<li><a href="#selección-de-elementos-de-un-formulario"><span class="toc-section-number">3.2.4</span> Selección de Elementos de un Formulario</a></li>
</ul></li>
<li><a href="#trabajar-con-selecciones"><span class="toc-section-number">3.3</span> Trabajar con Selecciones</a><ul>
<li><a href="#encadenamiento"><span class="toc-section-number">3.3.1</span> Encadenamiento</a></li>
<li><a href="#obtenedores-getters-establecedores-setters"><span class="toc-section-number">3.3.2</span> Obtenedores (Getters) & Establecedores (Setters)</a></li>
</ul></li>
<li><a href="#css-estilos-dimensiones"><span class="toc-section-number">3.4</span> CSS, Estilos, & Dimensiones</a><ul>
<li><a href="#utilizar-clases-para-aplicar-estilos-css"><span class="toc-section-number">3.4.1</span> Utilizar Clases para Aplicar Estilos CSS</a></li>
<li><a href="#dimensiones"><span class="toc-section-number">3.4.2</span> Dimensiones</a></li>
</ul></li>
<li><a href="#atributos"><span class="toc-section-number">3.5</span> Atributos</a></li>
<li><a href="#recorrer-el-dom"><span class="toc-section-number">3.6</span> Recorrer el DOM</a></li>
<li><a href="#manipulación-de-elementos"><span class="toc-section-number">3.7</span> Manipulación de Elementos</a><ul>
<li><a href="#obtener-y-establecer-información-en-elementos"><span class="toc-section-number">3.7.1</span> Obtener y Establecer Información en Elementos</a></li>
<li><a href="#mover-copiar-y-remover-elementos"><span class="toc-section-number">3.7.2</span> Mover, Copiar y Remover Elementos</a></li>
<li><a href="#crear-nuevos-elementos"><span class="toc-section-number">3.7.3</span> Crear Nuevos Elementos</a></li>
<li><a href="#manipulación-de-atributos"><span class="toc-section-number">3.7.4</span> Manipulación de Atributos</a></li>
</ul></li>
<li><a href="#ejercicios-1"><span class="toc-section-number">3.8</span> Ejercicios</a><ul>
<li><a href="#selecciones"><span class="toc-section-number">3.8.1</span> Selecciones</a></li>
<li><a href="#recorrer-el-dom-1"><span class="toc-section-number">3.8.2</span> Recorrer el DOM</a></li>
<li><a href="#manipulación"><span class="toc-section-number">3.8.3</span> Manipulación</a></li>
</ul></li>
</ul></li>
<li><a href="#el-núcleo-de-jquery"><span class="toc-section-number">4</span> El núcleo de jQuery</a><ul>
<li><a href="#vs"><span class="toc-section-number">4.1</span> <code>$</code> vs <code>$()</code></a></li>
<li><a href="#métodos-utilitarios"><span class="toc-section-number">4.2</span> Métodos Utilitarios</a></li>
<li><a href="#comprobación-de-tipos"><span class="toc-section-number">4.3</span> Comprobación de Tipos</a></li>
<li><a href="#el-método-data"><span class="toc-section-number">4.4</span> El Método Data</a></li>
<li><a href="#detección-de-navegadores-y-características"><span class="toc-section-number">4.5</span> Detección de Navegadores y Características</a></li>
<li><a href="#evitar-conflictos-con-otras-bibliotecas-javascript"><span class="toc-section-number">4.6</span> Evitar Conflictos con Otras Bibliotecas JavaScript</a></li>
</ul></li>
<li><a href="#eventos"><span class="toc-section-number">5</span> Eventos</a><ul>
<li><a href="#introducción-1"><span class="toc-section-number">5.1</span> Introducción</a></li>
<li><a href="#vincular-eventos-a-elementos"><span class="toc-section-number">5.2</span> Vincular Eventos a Elementos</a><ul>
<li><a href="#vincular-eventos-para-ejecutar-una-vez"><span class="toc-section-number">5.2.1</span> Vincular Eventos para Ejecutar una vez</a></li>
<li><a href="#desvincular-eventos"><span class="toc-section-number">5.2.2</span> Desvincular Eventos</a></li>
<li><a href="#espacios-de-nombres-para-eventos"><span class="toc-section-number">5.2.3</span> Espacios de Nombres para Eventos</a></li>
<li><a href="#vinculación-de-múltiples-eventos"><span class="toc-section-number">5.2.4</span> Vinculación de Múltiples Eventos</a></li>
</ul></li>
<li><a href="#el-objeto-del-evento"><span class="toc-section-number">5.3</span> El Objeto del Evento</a></li>
<li><a href="#ejecución-automática-de-controladores-de-eventos"><span class="toc-section-number">5.4</span> Ejecución automática de Controladores de Eventos</a></li>
<li><a href="#incrementar-el-rendimiento-con-la-delegación-de-eventos"><span class="toc-section-number">5.5</span> Incrementar el Rendimiento con la Delegación de Eventos</a><ul>
<li><a href="#desvincular-eventos-delegados"><span class="toc-section-number">5.5.1</span> Desvincular Eventos Delegados</a></li>
</ul></li>
<li><a href="#funciones-auxiliares-de-eventos"><span class="toc-section-number">5.6</span> Funciones Auxiliares de Eventos</a><ul>
<li><a href="#fn.hover"><span class="toc-section-number">5.6.1</span> <code>$.fn.hover</code></a></li>
<li><a href="#fn.toggle"><span class="toc-section-number">5.6.2</span> <code>$.fn.toggle</code></a></li>
</ul></li>
<li><a href="#ejercicios-2"><span class="toc-section-number">5.7</span> Ejercicios</a><ul>
<li><a href="#crear-una-sugerencia-para-una-caja-de-ingreso-de-texto"><span class="toc-section-number">5.7.1</span> Crear una “Sugerencia” para una Caja de Ingreso de Texto</a></li>
<li><a href="#añadir-una-navegación-por-pestañas"><span class="toc-section-number">5.7.2</span> Añadir una Navegación por Pestañas</a></li>
</ul></li>
</ul></li>
<li><a href="#efectos"><span class="toc-section-number">6</span> Efectos</a><ul>
<li><a href="#introducción-2"><span class="toc-section-number">6.1</span> Introducción</a></li>
<li><a href="#efectos-incorporados-en-la-biblioteca"><span class="toc-section-number">6.2</span> Efectos Incorporados en la Biblioteca</a><ul>
<li><a href="#cambiar-la-duración-de-los-efectos"><span class="toc-section-number">6.2.1</span> Cambiar la Duración de los Efectos</a></li>
<li><a href="#realizar-una-acción-cuando-un-efecto-fue-ejecutado"><span class="toc-section-number">6.2.2</span> Realizar una Acción Cuando un Efecto fue Ejecutado</a></li>
</ul></li>
<li><a href="#efectos-personalizados-con-.fn.animate"><span class="toc-section-number">6.3</span> Efectos Personalizados con <code>$.fn.animate</code></a><ul>
<li><a href="#easing"><span class="toc-section-number">6.3.1</span> Easing</a></li>
</ul></li>
<li><a href="#control-de-los-efectos"><span class="toc-section-number">6.4</span> Control de los Efectos</a></li>
<li><a href="#ejercicios-3"><span class="toc-section-number">6.5</span> Ejercicios</a><ul>
<li><a href="#mostrar-texto-oculto"><span class="toc-section-number">6.5.1</span> Mostrar Texto Oculto</a></li>
<li><a href="#crear-un-menú-desplegable"><span class="toc-section-number">6.5.2</span> Crear un Menú Desplegable</a></li>
<li><a href="#crear-un-slideshow"><span class="toc-section-number">6.5.3</span> Crear un Slideshow</a></li>
</ul></li>
</ul></li>
<li><a href="#ajax"><span class="toc-section-number">7</span> Ajax</a><ul>
<li><a href="#introducción-3"><span class="toc-section-number">7.1</span> Introducción</a></li>
<li><a href="#conceptos-clave"><span class="toc-section-number">7.2</span> Conceptos Clave</a><ul>
<li><a href="#get-vs.post"><span class="toc-section-number">7.2.1</span> GET vs. POST</a></li>
<li><a href="#tipos-de-datos"><span class="toc-section-number">7.2.2</span> Tipos de Datos</a></li>
<li><a href="#asincronismo"><span class="toc-section-number">7.2.3</span> Asincronismo</a></li>
<li><a href="#políticas-de-mismo-origen-y-jsonp"><span class="toc-section-number">7.2.4</span> Políticas de Mismo Origen y JSONP</a></li>
<li><a href="#ajax-y-firebug"><span class="toc-section-number">7.2.5</span> Ajax y Firebug</a></li>
</ul></li>
<li><a href="#métodos-ajax-de-jquery"><span class="toc-section-number">7.3</span> Métodos Ajax de jQuery</a><ul>
<li><a href="#ajax-1"><span class="toc-section-number">7.3.1</span> $.ajax</a></li>
<li><a href="#métodos-convenientes"><span class="toc-section-number">7.3.2</span> Métodos Convenientes</a></li>
<li><a href="#fn.load"><span class="toc-section-number">7.3.3</span> <code>$.fn.load</code></a></li>
</ul></li>
<li><a href="#ajax-y-formularios"><span class="toc-section-number">7.4</span> Ajax y Formularios</a></li>
<li><a href="#trabajar-con-jsonp"><span class="toc-section-number">7.5</span> Trabajar con JSONP</a></li>
<li><a href="#eventos-ajax"><span class="toc-section-number">7.6</span> Eventos Ajax</a></li>
<li><a href="#ejercicios-4"><span class="toc-section-number">7.7</span> Ejercicios</a><ul>
<li><a href="#cargar-contenido-externo"><span class="toc-section-number">7.7.1</span> Cargar Contenido Externo</a></li>
<li><a href="#cargar-contenido-utilizando-json"><span class="toc-section-number">7.7.2</span> Cargar Contenido Utilizando JSON</a></li>
</ul></li>
</ul></li>
<li><a href="#extensiones"><span class="toc-section-number">8</span> Extensiones</a><ul>
<li><a href="#qué-es-una-extensión"><span class="toc-section-number">8.1</span> ¿Qué es una Extensión?</a></li>
<li><a href="#crear-una-extensión-básica"><span class="toc-section-number">8.2</span> Crear una Extensión Básica</a></li>
<li><a href="#encontrar-y-evaluar-extensiones"><span class="toc-section-number">8.3</span> Encontrar y Evaluar Extensiones</a></li>
<li><a href="#escribir-extensiones"><span class="toc-section-number">8.4</span> Escribir Extensiones</a></li>
<li><a href="#escribir-extensiones-con-mantenimiento-de-estado-utilizando-widget-factory-de-jquery-ui"><span class="toc-section-number">8.5</span> Escribir Extensiones con Mantenimiento de Estado Utilizando Widget Factory de jQuery UI</a><ul>
<li><a href="#añadir-métodos-a-un-widget"><span class="toc-section-number">8.5.1</span> Añadir Métodos a un Widget</a></li>
<li><a href="#trabajar-con-las-opciones-del-widget"><span class="toc-section-number">8.5.2</span> Trabajar con las Opciones del Widget</a></li>
<li><a href="#añadir-funciones-de-devolución-de-llamada"><span class="toc-section-number">8.5.3</span> Añadir Funciones de Devolución de Llamada</a></li>
<li><a href="#limpieza"><span class="toc-section-number">8.5.4</span> Limpieza</a></li>
<li><a href="#conclusión"><span class="toc-section-number">8.5.5</span> Conclusión</a></li>
</ul></li>
<li><a href="#ejercicios-5"><span class="toc-section-number">8.6</span> Ejercicios</a><ul>
<li><a href="#realizar-una-tabla-ordenable"><span class="toc-section-number">8.6.1</span> Realizar una Tabla Ordenable</a></li>
<li><a href="#escribir-una-extensión-para-cambiar-el-color-de-fondo-en-tablas"><span class="toc-section-number">8.6.2</span> Escribir una Extensión Para Cambiar el Color de Fondo en Tablas</a></li>
</ul></li>
</ul></li>
<li><a href="#mejores-prácticas-para-aumentar-el-rendimiento"><span class="toc-section-number">9</span> Mejores Prácticas para Aumentar el Rendimiento</a><ul>
<li><a href="#guardar-la-longitud-en-bucles"><span class="toc-section-number">9.1</span> Guardar la Longitud en Bucles</a></li>
<li><a href="#añadir-nuevo-contenido-por-fuera-de-un-bucle"><span class="toc-section-number">9.2</span> Añadir Nuevo Contenido por Fuera de un Bucle</a></li>
<li><a href="#no-repetirse"><span class="toc-section-number">9.3</span> No Repetirse</a></li>
<li><a href="#cuidado-con-las-funciones-anónimas"><span class="toc-section-number">9.4</span> Cuidado con las Funciones Anónimas</a></li>
<li><a href="#optimización-de-selectores"><span class="toc-section-number">9.5</span> Optimización de Selectores</a><ul>
<li><a href="#selectores-basados-en-id"><span class="toc-section-number">9.5.1</span> Selectores basados en ID</a></li>
<li><a href="#especificidad"><span class="toc-section-number">9.5.2</span> Especificidad</a></li>
<li><a href="#evitar-el-selector-universal"><span class="toc-section-number">9.5.3</span> Evitar el Selector Universal</a></li>
</ul></li>
<li><a href="#utilizar-la-delegación-de-eventos"><span class="toc-section-number">9.6</span> Utilizar la Delegación de Eventos</a></li>
<li><a href="#separar-elementos-para-trabajar-con-ellos"><span class="toc-section-number">9.7</span> Separar Elementos para Trabajar con Ellos</a></li>
<li><a href="#utilizar-estilos-en-cascada-para-cambios-de-css-en-varios-elementos"><span class="toc-section-number">9.8</span> Utilizar Estilos en Cascada para Cambios de CSS en Varios Elementos</a></li>
<li><a href="#utilizar-.data-en-lugar-de-.fn.data"><span class="toc-section-number">9.9</span> Utilizar <code>$.data</code> en Lugar de <code>$.fn.data</code></a></li>
<li><a href="#no-actuar-en-elementos-no-existentes"><span class="toc-section-number">9.10</span> No Actuar en Elementos no Existentes</a></li>
<li><a href="#definición-de-variables"><span class="toc-section-number">9.11</span> Definición de Variables</a></li>
<li><a href="#condicionales"><span class="toc-section-number">9.12</span> Condicionales</a></li>
<li><a href="#no-tratar-a-jquery-como-si-fuera-una-caja-negra"><span class="toc-section-number">9.13</span> No Tratar a jQuery como si fuera una Caja Negra</a></li>
</ul></li>
<li><a href="#organización-del-código"><span class="toc-section-number">10</span> Organización del Código</a><ul>
<li><a href="#introducción-4"><span class="toc-section-number">10.1</span> Introducción</a><ul>
<li><a href="#conceptos-clave-1"><span class="toc-section-number">10.1.1</span> Conceptos Clave</a></li>
</ul></li>
<li><a href="#encapsulación"><span class="toc-section-number">10.2</span> Encapsulación</a><ul>
<li><a href="#el-objeto-literal"><span class="toc-section-number">10.2.1</span> El Objeto Literal</a></li>
<li><a href="#el-patrón-modular"><span class="toc-section-number">10.2.2</span> El Patrón Modular</a></li>
</ul></li>
<li><a href="#gestión-de-dependencias"><span class="toc-section-number">10.3</span> Gestión de Dependencias</a><ul>
<li><a href="#obtener-requirejs"><span class="toc-section-number">10.3.1</span> Obtener RequireJS</a></li>
<li><a href="#utilizar-requirejs-con-jquery"><span class="toc-section-number">10.3.2</span> Utilizar RequireJS con jQuery</a></li>
<li><a href="#crear-módulos-reusables-con-requirejs"><span class="toc-section-number">10.3.3</span> Crear Módulos Reusables con RequireJS</a></li>
<li><a href="#optimizar-el-código-con-las-herramientas-de-requirejs"><span class="toc-section-number">10.3.4</span> Optimizar el Código con las Herramientas de RequireJS</a></li>
</ul></li>
<li><a href="#ejercicios-6"><span class="toc-section-number">10.4</span> Ejercicios</a><ul>
<li><a href="#crear-un-módulo-portlet"><span class="toc-section-number">10.4.1</span> Crear un Módulo Portlet</a></li>
</ul></li>
</ul></li>
<li><a href="#eventos-personalizados"><span class="toc-section-number">11</span> Eventos Personalizados</a><ul>
<li><a href="#introducción-a-los-eventos-personalizados"><span class="toc-section-number">11.1</span> Introducción a los Eventos Personalizados</a><ul>
<li><a href="#un-ejemplo-de-aplicación"><span class="toc-section-number">11.1.1</span> Un Ejemplo de Aplicación</a></li>
</ul></li>
</ul></li>
<li><a href="#funciones-y-ejecuciones-diferidas-a-través-del-objeto-.deferred"><span class="toc-section-number">12</span> Funciones y ejecuciones diferidas a través del objeto <code>$.Deferred</code></a><ul>
<li><a href="#introducción-5"><span class="toc-section-number">12.1</span> Introducción</a></li>
<li><a href="#el-objeto-diferido-y-ajax"><span class="toc-section-number">12.2</span> El objeto diferido y Ajax</a><ul>
<li><a href="#deferred.then"><span class="toc-section-number">12.2.1</span> <code>deferred.then</code></a></li>
</ul></li>
<li><a href="#creación-de-objetos-diferidos-con-.deferred"><span class="toc-section-number">12.3</span> Creación de objetos diferidos con <code>$.Deferred</code></a><ul>
<li><a href="#deferred.pipe"><span class="toc-section-number">12.3.1</span> <code>deferred.pipe</code></a></li>
<li><a href="#when"><span class="toc-section-number">12.3.2</span> <code>$.when</code></a></li>
</ul></li>
</ul></li>
</ul>
</div>
<hr />
<div id="bienvenidoa" class="section level1">
<h1><a href="#bienvenidoa"><span class="header-section-number">1</span> Bienvenido/a</a></h1>
<p>jQuery se está convirtiendo rápidamente en una herramienta que todo desarrollador de interfaces web debería de conocer. El propósito de este libro es proveer un resumen de la biblioteca, de tal forma que para cuando lo haya terminado de leer, será capaz de realizar tareas básicas utilizando jQuery y tendrá una sólida base para continuar el aprendizaje. El libro fue diseñado para ser utilizado como material en un salón de clases, pero también puede ser útil para estudiarlo de forma individual.</p>
<p>La modalidad de trabajo es la siguiente: En primer lugar se dedicará tiempo a comprender un concepto para luego realizar un ejercicio relacionado. Algunos de los ejercicios pueden llegar a ser triviales, mientras que otros no tanto. El objetivo es aprender a resolver de manera fácil lo que normalmente se resolvería con jQuery. Las soluciones a todos los ejercicios están incluidas en el mismo material de aprendizaje.</p>
<div id="obtener-el-material-de-aprendizaje" class="section level2">
<h2><a href="#obtener-el-material-de-aprendizaje"><span class="header-section-number">1.1</span> Obtener el Material de Aprendizaje</a></h2>
<p>El material de aprendizaje y el código fuente de los ejemplos que se utilizan en el libro están hospedados en <a href="https://github.com/dzignus/librojquery">un repositorio de Github</a>. Desde allí es posible descargar un archivo .zip o .tar con el código para utilizar en un servidor web.</p>
<p>Si usted suele utilizar <a href="http://git-scm.com/">Git</a>, es bienvenido de clonar o modificar el repositorio.</p>
</div>
<div id="software" class="section level2">
<h2><a href="#software"><span class="header-section-number">1.2</span> Software</a></h2>
<p>Para trabajar con los contenidos del libro, necesitará las siguientes herramientas:</p>
<ul>
<li><p><a href="http://www.mozilla.com/firefox/">Navegador web Firefox</a></p></li>
<li><p>La <a href="https://addons.mozilla.org/es-ES/firefox/addon/firebug/">extensión Firebug</a>, para Firefox</p></li>
<li><p>Un editor de textos planos (como <a href="http://notepad-plus-plus.org/download/v5.9.8.html">Notepad++</a>/<a href="http://www.sublimetext.com/2">Sublime Text 2</a> para Windows, <a href="http://www.icewalkers.com/Linux/Software/56260/gEdit.html">gedit</a>/<a href="http://linux.softpedia.com/get/Text-Editing-Processing/Others/Kate-2317.shtml">Kate</a> para Linux o <a href="http://textmate.en.softonic.com/mac">TextMate</a> para Mac OS X)</p></li>
<li><p>Para las secciones dedicadas a Ajax: Un servidor local (como <a href="http://www.wampserver.com/en/download.php">WAMP</a> o <a href="http://www.mamp.info/en/index.html">MAMP</a>) o un cliente FTP/SSH (como <a href="http://filezilla-project.org/">FileZilla</a>) para acceder a un servidor remoto.</p></li>
</ul>
</div>
<div id="añadir-javascript-a-una-página" class="section level2">
<h2><a href="#añadir-javascript-a-una-página"><span class="header-section-number">1.3</span> Añadir JavaScript a una Página</a></h2>
<p>Existen dos formas de insertar código JavaScript dentro de una página: escribiendo código en la misma (en ingles inline) o a través de un archivo externo utilizando la etiqueta script. El orden en el cual se incluye el código es importante: un código que depende de otro debe ser incluido después del que referencia (Ejemplo: Si la función B depende de A, el orden debe ser A,B y no B,A).</p>
<p>Para mejorar el rendimiento de la página, el código JavaScript debe ser incluido al final del HTML. Además, cuando se trabaja en un ambiente de producción con múltiples archivos JavaScript, éstos deben ser combinados en un solo archivo.</p>
<p><strong>Ejemplo de código JavaScript en línea</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><script>
<span class="ot">console</span>.<span class="fu">log</span>(<span class="st">'hello'</span>);
<<span class="ot">/script></span></code></pre>
<p><strong>Ejemplo de inclusión de un archivo externo JavaScript</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><script src=<span class="st">'/js/jquery.js'</span>><<span class="ot">/script></span></code></pre>
</div>
<div id="depuración-del-código-javascript" class="section level2">
<h2><a href="#depuración-del-código-javascript"><span class="header-section-number">1.4</span> Depuración del Código JavaScript</a></h2>
<p>La utilización de una herramienta de depuración es esencial para trabajar con JavaScript. Firefox provee un depurador a través de la extensión Firebug; mientras que <a href="http://www.apple.com/es/safari/download/">Safari</a> y <a href="http://www.google.es/chrome/">Chrome</a> ya traen uno integrado.</p>
<p>Cada depurador ofrece:</p>
<ul>
<li><p>un editor multi-linea para experimentar con JavaScript;</p></li>
<li><p>un inspector para revisar el código generado en la página;</p></li>
<li><p>un visualizador de red o recursos, para examinar las peticiones que se realizan.</p></li>
</ul>
<p>Cuando usted este escribiendo código JavaScript, podrá utilizar alguno de los siguientes métodos para enviar mensajes a la consola del depurador:</p>
<ul>
<li><p><code>console.log()</code> para enviar y registrar mensajes generales;</p></li>
<li><p><code>console.dir()</code> para registrar un objeto y visualizar sus propiedades;</p></li>
<li><p><code>console.warn()</code> para registrar mensajes de alerta;</p></li>
<li><p><code>console.error()</code> para registrar mensajes de error.</p></li>
</ul>
<p>Existen otros métodos para utilizar desde la consola, pero estos pueden variar según el navegador. La consola además provee la posibilidad de establecer puntos de interrupción y observar expresiones en el código con el fin de facilitar su depuración.</p>
</div>
<div id="ejercicios" class="section level2">
<h2><a href="#ejercicios"><span class="header-section-number">1.5</span> Ejercicios</a></h2>
<p>La mayoría de los capítulos concluyen con uno o más ejercicios. En algunos, podrá trabajar directamente con Firebug; en otros deberá escribir código JavaScript luego de incluir la biblioteca jQuery en el documento.</p>
<p>Aún así, para completar ciertos ejercicios, necesitará consultar la documentación oficial de jQuery. Aprender a encontrar respuestas, es una parte importante del proceso de aprendizaje.</p>
<p>Estas son algunas sugerencias para hacer frente a los problemas:</p>
<ul>
<li><p>en primer lugar, asegúrese de entender bien el problema que está tratando de resolver;</p></li>
<li><p>luego, averigüe a qué elementos tendrá que acceder con el fin de resolver el problema, y determine cómo accederlos. Puede utilizar Firebug para verificar que esta obteniendo el resultado esperado;</p></li>
<li><p>finalmente, averigüe qué necesita hacer con esos elementos para resolver el problema. Puede ser útil, antes de comenzar, escribir comentarios explicando lo que va a realizar.</p></li>
</ul>
<p>No tenga miedo de cometer errores. Tampoco trate en el primer intento escribir de forma perfecta su código. Cometer errores y experimentar con soluciones es parte del proceso de aprendizaje y le ayudará a que sea un mejor desarrollador.</p>
<p>Podrá encontrar en la carpeta <code>/ejercicios/soluciones</code> ejemplos de soluciones a los ejercicios del libro.</p>
</div>
<div id="convenciones-utilizadas-en-el-libro" class="section level2">
<h2><a href="#convenciones-utilizadas-en-el-libro"><span class="header-section-number">1.6</span> Convenciones Utilizadas en el Libro</a></h2>
<p>Existen una serie de convenciones utilizadas en el libro:</p>
<p>Los métodos que pueden ser llamados desde el objeto jQuery, serán referenciados como <code>$.fn.nombreDelMetodo</code>. Los métodos que existen en el espacio de nombres (en inglés <em>namespace</em>) de jQuery pero que no pueden ser llamados desde el objeto jQuery serán referenciados como <code>$.nombreDelMetodo</code>. Si esto no significa mucho para usted, no se preocupe — será más claro a medida que vaya progresando en el libro.</p>
<p><strong>Ejemplo de un código</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="co">// el código de ejemplo aparecerá de esta forma</span></code></pre>
<p><em>Las remarcaciones aparecerán de esta forma.</em></p>
<blockquote>
<p><strong>Nota</strong></p>
<p>Las notas sobre algún tema aparecerán de esta forma.</p>
</blockquote>
</div>
<div id="notas-de-la-traducción" class="section level2">
<h2><a href="#notas-de-la-traducción"><span class="header-section-number">1.7</span> Notas de la Traducción</a></h2>
<ul>
<li><p>Debido a que el material tiene como fin el aprendizaje y la enseñanza, el mismo se encuentra traducido a español formal (usted).</p></li>
<li><p>Muchos conceptos técnicos son nombrados en su versión traducida a español. Sin embargo, para tener de referencia, también se explica como es llamado en inglés.</p></li>
<li><p>Los ejemplos y soluciones a ejercicios no están completamente traducidos. Esto es debido a que, cuando esté trabajando en un proyecto real, el código que encuentre en otros sitios probablemente esté en inglés. Aún así, se han traducido los comentarios incorporados en los códigos de ejemplos y algunos textos particulares para facilitar la comprensión.</p></li>
</ul>
</div>
<div id="material-de-referencia" class="section level2">
<h2><a href="#material-de-referencia"><span class="header-section-number">1.8</span> Material de Referencia</a></h2>
<p>Existe una gran cantidad de artículos que se ocupan de algún aspecto de jQuery. Algunos son excelentes pero otros, francamente, son erróneos. Cuando lea un artículo sobre jQuery, este seguro que se está abarcando la misma versión de la biblioteca que está utilizando, y resístase a la tentación de copiar y pegar el código — tómese un tiempo para poder entenderlo.</p>
<p>A continuación se listan una serie de excelentes recursos para utilizar durante el aprendizaje. El más importante de todos es el código fuente de jQuery, el cual contiene (en su formato sin comprimir) una completa documentación a través de comentarios. La biblioteca no es una caja negra — el entendimiento de ella irá incrementándose exponencialmente si la revisa de vez en cuando — y es muy recomendable que la guarde en los favoritos de su navegador para tenerla como guía de referencia.</p>
<ul>
<li><p><a href="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js">El código fuente de jQuery</a></p></li>
<li><p><a href="http://api.jquery.com">Documentación de jQuery</a></p></li>
<li><p><a href="http://forum.jquery.com/">Foro de jQuery</a></p></li>
<li><p><a href="http://delicious.com/rdmey/jquery-class">Favoritos en Delicious</a></p></li>
<li><p><a href="http://docs.jquery.com/Discussion#Chat_.2F_IRC_Channel">Canal IRC #jquery en Freenode</a></p></li>
</ul>
</div>
</div>
<div id="conceptos-básicos-de-javascript" class="section level1">
<h1><a href="#conceptos-básicos-de-javascript"><span class="header-section-number">2</span> Conceptos Básicos de JavaScript</a></h1>
<div id="introducción" class="section level2">
<h2><a href="#introducción"><span class="header-section-number">2.1</span> Introducción</a></h2>
<p>jQuery se encuentra escrito en JavaScript, un lenguaje de programación muy rico y expresivo.</p>
<p>El capítulo está orientado a personas sin experiencia en el lenguaje, abarcando conceptos básicos y problemas frecuentes que pueden presentarse al trabajar con el mismo. Por otro lado, la sección puede ser beneficiosa para quienes utilicen otros lenguajes de programación para entender las peculiaridades de JavaScript.</p>
<p>Si usted esta interesado en aprender el lenguaje más en profundidad, puede leer el libro <em>JavaScript: The Good Parts</em> escrito por Douglas Crockford.</p>
</div>
<div id="sintaxis-básica" class="section level2">
<h2><a href="#sintaxis-básica"><span class="header-section-number">2.2</span> Sintaxis Básica</a></h2>
<p>Comprensión de declaraciones, nombres de variables, espacios en blanco, y otras sintaxis básicas de JavaScript.</p>
<p><strong>Declaración simple de variable</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> foo = <span class="st">'hola mundo'</span>;</code></pre>
<p><strong>Los espacios en blanco no tienen valor fuera de las comillas</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> foo = <span class="st">'hola mundo'</span>;</code></pre>
<p><strong>Los paréntesis indican prioridad</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="dv">2</span> * <span class="dv">3</span> + <span class="dv">5</span>; <span class="co">// es igual a 11, la multiplicación ocurre primero</span>
<span class="dv">2</span> * (<span class="dv">3</span> + <span class="dv">5</span>); <span class="co">// es igual a 16, por los paréntesis, la suma ocurre primero</span></code></pre>
<p><strong>La tabulación mejora la lectura del código, pero no posee ningún significado especial</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> foo = <span class="kw">function</span>() {
<span class="ot">console</span>.<span class="fu">log</span>(<span class="st">'hola'</span>);
};</code></pre>
</div>
<div id="operadores" class="section level2">
<h2><a href="#operadores"><span class="header-section-number">2.3</span> Operadores</a></h2>
<div id="operadores-básicos" class="section level3">
<h3><a href="#operadores-básicos"><span class="header-section-number">2.3.1</span> Operadores Básicos</a></h3>
<p>Los operadores básicos permiten manipular valores.</p>
<p><strong>Concatenación</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> foo = <span class="st">'hola'</span>;
<span class="kw">var</span> bar = <span class="st">'mundo'</span>;
<span class="ot">console</span>.<span class="fu">log</span>(foo + <span class="st">' '</span> + bar); <span class="co">// la consola de depuración muestra 'hola mundo'</span></code></pre>
<p><strong>Multiplicación y división</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="dv">2</span> * <span class="dv">3</span>;
<span class="dv">2</span> / <span class="dv">3</span>;</code></pre>
<p><strong>Incrementación y decrementación</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> i = <span class="dv">1</span>;
<span class="kw">var</span> j = ++i; <span class="co">// incrementación previa: j es igual a 2; i es igual a 2</span>
<span class="kw">var</span> k = i++; <span class="co">// incrementación posterior: k es igual a 2; i es igual a 3</span></code></pre>
</div>
<div id="operaciones-con-números-y-cadenas-de-caracteres" class="section level3">
<h3><a href="#operaciones-con-números-y-cadenas-de-caracteres"><span class="header-section-number">2.3.2</span> Operaciones con Números y Cadenas de Caracteres</a></h3>
<p>En JavaScript, las operaciones con números y cadenas de caracteres (en inglés <em>strings</em>) pueden ocasionar resultados no esperados.</p>
<p><strong>Suma vs. concatenación</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> foo = <span class="dv">1</span>;
<span class="kw">var</span> bar = <span class="st">'2'</span>;
<span class="ot">console</span>.<span class="fu">log</span>(foo + bar); <span class="co">// error: La consola de depuración muestra 12</span></code></pre>
<p><strong>Forzar a una cadena de caracteres actuar como un número</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> foo = <span class="dv">1</span>;
<span class="kw">var</span> bar = <span class="st">'2'</span>;
<span class="co">// el constructor 'Number' obliga a la cadena comportarse como un número</span>
<span class="ot">console</span>.<span class="fu">log</span>(foo + <span class="fu">Number</span>(bar)); <span class="co">// la consola de depuración muestra 3</span></code></pre>
<p>El constructor <em>Number</em>, cuando es llamado como una función (como se muestra en el ejemplo) obliga a su argumento a comportarse como un número. También es posible utilizar el operador de <em>suma unaria</em>, entregando el mismo resultado:</p>
<p><strong>Forzar a una cadena de caracteres actuar como un número (utilizando el operador de suma unaria)</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="ot">console</span>.<span class="fu">log</span>(foo + +bar);</code></pre>
</div>
<div id="operadores-lógicos" class="section level3">
<h3><a href="#operadores-lógicos"><span class="header-section-number">2.3.3</span> Operadores Lógicos</a></h3>
<p>Los operadores lógicos permiten evaluar una serie de operandos utilizando operaciones AND y OR.</p>
<p><strong>Operadores lógicos AND y OR</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> foo = <span class="dv">1</span>;
<span class="kw">var</span> bar = <span class="dv">0</span>;
<span class="kw">var</span> baz = <span class="dv">2</span>;
foo || bar; <span class="co">// devuelve 1, el cual es verdadero (true)</span>
bar || foo; <span class="co">// devuelve 1, el cual es verdadero (true)</span>
foo && bar; <span class="co">// devuelve 0, el cual es falso (false)</span>
foo && baz; <span class="co">// devuelve 2, el cual es verdadero (true)</span>
baz && foo; <span class="co">// devuelve 1, el cual es verdadero (true)</span></code></pre>
<p>El operador <code>||</code> (OR lógico) devuelve el valor del primer operando, si éste es verdadero; caso contrario devuelve el segundo operando. Si ambos operandos son falsos devuelve falso (<em>false</em>). El operador <code>&&</code> (AND lógico) devuelve el valor del primer operando si éste es falso; caso contrario devuelve el segundo operando. Cuando ambos valores son verdaderos devuelve verdadero (<em>true</em>), sino devuelve falso.</p>
<p>Puede consultar la sección <code>Elementos Verdaderos y Falsos</code> para más detalles sobre que valores se evalúan como <code>true</code> y cuales se evalúan como <code>false</code>.</p>
<blockquote>
<p><strong>Nota</strong></p>
<p>Puede que a veces note que algunos desarrolladores utilizan esta lógica en flujos de control en lugar de utilizar la declaración <code>if</code>. Por ejemplo:</p>
</blockquote>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="co">// realizar algo con foo si foo es verdadero</span>
foo && <span class="fu">doSomething</span>(foo);
<span class="co">// establecer bar igual a baz si baz es verdadero;</span>
<span class="co">// caso contrario, establecer a bar igual al</span>
<span class="co">// valor de createBar()</span>
<span class="kw">var</span> bar = baz || <span class="fu">createBar</span>();</code></pre>
<p>Este estilo de declaración es muy elegante y conciso; pero puede ser difícil para leer (sobretodo para principiantes). Por eso se explícita, para reconocerlo cuando este leyendo código. Sin embargo su utilización no es recomendable a menos que esté cómodo con el concepto y su comportamiento.</p>
</div>
<div id="operadores-de-comparación" class="section level3">
<h3><a href="#operadores-de-comparación"><span class="header-section-number">2.3.4</span> Operadores de Comparación</a></h3>
<p>Los operadores de comparación permiten comprobar si determinados valores son equivalentes o idénticos.</p>
<p><strong>Operadores de Comparación</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> foo = <span class="dv">1</span>;
<span class="kw">var</span> bar = <span class="dv">0</span>;
<span class="kw">var</span> baz = <span class="st">'1'</span>;
<span class="kw">var</span> bim = <span class="dv">2</span>;
foo == bar; <span class="co">// devuelve falso (false)</span>
foo != bar; <span class="co">// devuelve verdadero (true)</span>
foo == baz; <span class="co">// devuelve verdadero (true); tenga cuidado</span>
foo === baz; <span class="co">// devuelve falso (false)</span>
foo !== baz; <span class="co">// devuelve verdadero (true)</span>
foo === <span class="fu">parseInt</span>(baz); <span class="co">// devuelve verdadero (true)</span>
foo > bim; <span class="co">// devuelve falso (false)</span>
bim > baz; <span class="co">// devuelve verdadero (true)</span>
foo <= baz; <span class="co">// devuelve verdadero (true)</span></code></pre>
</div>
</div>
<div id="código-condicional" class="section level2">
<h2><a href="#código-condicional"><span class="header-section-number">2.4</span> Código Condicional</a></h2>
<p>A veces se desea ejecutar un bloque de código bajo ciertas condiciones. Las estructuras de control de flujo — a través de la utilización de las declaraciones <code>if</code> y <code>else</code> permiten hacerlo.</p>
<p><strong>Control del flujo</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> foo = <span class="kw">true</span>;
<span class="kw">var</span> bar = <span class="kw">false</span>;
<span class="kw">if</span> (bar) {
<span class="co">// este código nunca se ejecutará</span>
<span class="ot">console</span>.<span class="fu">log</span>(<span class="st">'hola!'</span>);
}
<span class="kw">if</span> (bar) {
<span class="co">// este código no se ejecutará</span>
} <span class="kw">else</span> {
<span class="kw">if</span> (foo) {
<span class="co">// este código se ejecutará</span>
} <span class="kw">else</span> {
<span class="co">// este código se ejecutará si foo y bar son falsos (false)</span>
}
}</code></pre>
<blockquote>
<p><strong>Nota</strong></p>
<p>En una línea singular, cuando se escribe una declaración <code>if</code>, las llaves no son estrictamente necesarias; sin embargo es recomendable su utilización, ya que hace que el código sea mucho más legible.</p>
</blockquote>
<p>Debe tener en cuenta de no definir funciones con el mismo nombre múltiples veces dentro de declaraciones <code>if</code>/<code>else</code>, ya que puede obtener resultados no esperados.</p>
<div id="elementos-verdaderos-y-falsos" class="section level3">
<h3><a href="#elementos-verdaderos-y-falsos"><span class="header-section-number">2.4.1</span> Elementos Verdaderos y Falsos</a></h3>
<p>Para controlar el flujo adecuadamente, es importante entender qué tipos de valores son “verdaderos” y cuales “falsos”. A veces, algunos valores pueden parecer una cosa pero al final terminan siendo otra.</p>
<p><strong>Valores que devuelven <code>verdadero (true)</code></strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="st">'0'</span>;
<span class="st">'any string'</span>; <span class="co">// cualquier cadena</span>
[]; <span class="co">// un vector vacío</span>
{}; <span class="co">// un objeto vacío</span>
<span class="dv">1</span>; <span class="co">// cualquier número distinto a cero</span></code></pre>
<p><strong>Valores que devuelven <code>falso (false)</code></strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="dv">0</span>;
<span class="st">''</span>; <span class="co">// una cadena vacía</span>
<span class="kw">NaN</span>; <span class="co">// la variable JavaScript "not-a-number" (No es un número)</span>
<span class="kw">null</span>; <span class="co">// un valor nulo</span>
<span class="kw">undefined</span>; <span class="co">// tenga cuidado -- indefinido (undefined) puede ser redefinido</span></code></pre>
</div>
<div id="variables-condicionales-utilizando-el-operador-ternario" class="section level3">
<h3><a href="#variables-condicionales-utilizando-el-operador-ternario"><span class="header-section-number">2.4.2</span> Variables Condicionales Utilizando el Operador Ternario</a></h3>
<p>A veces se desea establecer el valor de una variable dependiendo de cierta condición. Para hacerlo se puede utilizar una declaración <code>if</code>/<code>else</code>, sin embargo en muchos casos es más conveniente utilizar el operador ternario. [Definición: El <em>operador ternario</em> evalúa una condición; si la condición es verdadera, devuelve cierto valor, caso contrario devuelve un valor diferente.]</p>
<p><strong>El operador ternario</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="co">// establecer a foo igual a 1 si bar es verdadero;</span>
<span class="co">// caso contrario, establecer a foo igual a 0</span>
<span class="kw">var</span> foo = bar ? <span class="dv">1</span> : <span class="dv">0</span>;</code></pre>
<p>El operador ternario puede ser utilizado sin devolver un valor a la variable, sin embargo este uso generalmente es desaprobado.</p>
</div>
<div id="declaración-switch" class="section level3">
<h3><a href="#declaración-switch"><span class="header-section-number">2.4.3</span> Declaración Switch</a></h3>
<p>En lugar de utilizar una serie de declaraciones if/else/else if/else, a veces puede ser útil la utilización de la declaración <code>switch</code>. [Definición: La declaración <code>Switch</code> evalúa el valor de una variable o expresión, y ejecuta diferentes bloques de código dependiendo de ese valor.]</p>
<p><strong>Una declaración Switch</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">switch</span> (foo) {
<span class="kw">case</span> <span class="st">'bar'</span>:
<span class="fu">alert</span>(<span class="st">'el valor es bar'</span>);
<span class="kw">break</span>;
<span class="kw">case</span> <span class="st">'baz'</span>:
<span class="fu">alert</span>(<span class="st">'el valor es baz'</span>);
<span class="kw">break</span>;
<span class="kw">default</span>:
<span class="fu">alert</span>(<span class="st">'de forma predeterminada se ejecutará este código'</span>);
<span class="kw">break</span>;
}</code></pre>
<p>Las declaraciones <code>switch</code> son poco utilizadas en JavaScript, debido a que el mismo comportamiento es posible obtenerlo creando un objeto, el cual posee más potencial ya que es posible reutilizarlo, usarlo para realizar pruebas, etc. Por ejemplo:</p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> stuffToDo = {
<span class="st">'bar'</span> : <span class="kw">function</span>() {
<span class="fu">alert</span>(<span class="st">'el valor es bar'</span>);
},
<span class="st">'baz'</span> : <span class="kw">function</span>() {
<span class="fu">alert</span>(<span class="st">'el valor es baz'</span>);
},
<span class="st">'default'</span> : <span class="kw">function</span>() {
<span class="fu">alert</span>(<span class="st">'de forma predeterminada se ejecutará este código'</span>);
}
};
<span class="kw">if</span> (stuffToDo[foo]) {
stuffToDo[foo]();
} <span class="kw">else</span> {
stuffToDo[<span class="st">'default'</span>]();
}</code></pre>
<p>Más adelante se abarcará el concepto de objetos.</p>
</div>
</div>
<div id="bucles" class="section level2">
<h2><a href="#bucles"><span class="header-section-number">2.5</span> Bucles</a></h2>
<p>Los bucles (en inglés <em>loops</em>) permiten ejecutar un bloque de código un determinado número de veces.</p>
<p><strong>Bucles</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="co">// muestra en la consola 'intento 0', 'intento 1', ..., 'intento 4'</span>
<span class="kw">for</span> (<span class="kw">var</span> i=<span class="dv">0</span>; i<<span class="dv">5</span>; i++) {
<span class="ot">console</span>.<span class="fu">log</span>(<span class="st">'intento '</span> + i);
}</code></pre>
<p>*Note que en el ejemplo se utiliza la palabra var antes de la variable <code class="varname">i</code>, esto hace que dicha variable quede dentro del “alcance” (en inglés <em>scope</em>) del bucle. Más adelante en este capítulo se examinará en profundidad el concepto de alcance.*</p>
<div id="bucles-utilizando-for" class="section level3">
<h3><a href="#bucles-utilizando-for"><span class="header-section-number">2.5.1</span> Bucles Utilizando For</a></h3>
<p>Un bucle utilizando <code>for</code> se compone de cuatro estados y posee la siguiente estructura:</p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">for</span> ([expresiónInicial]; [condición]; [incrementoDeLaExpresión])
[cuerpo]</code></pre>
<p>El estado <em>expresiónInicial</em> es ejecutado una sola vez, antes que el bucle comience. éste otorga la oportunidad de preparar o declarar variables.</p>
<p>El estado <em>condición</em> es ejecutado antes de cada repetición, y retorna un valor que decide si el bucle debe continuar ejecutándose o no. Si el estado condicional evalúa un valor falso el bucle se detiene.</p>
<p>El estado <em>incrementoDeLaExpresión</em> es ejecutado al final de cada repetición y otorga la oportunidad de cambiar el estado de importantes variables. Por lo general, este estado implica la incrementación o decrementación de un contador.</p>
<p>El <em>cuerpo</em> es el código a ejecutar en cada repetición del bucle.</p>
<p><strong>Un típico bucle utilizando <code>for</code></strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">for</span> (<span class="kw">var</span> i = <span class="dv">0</span>, limit = <span class="dv">100</span>; i < limit; i++) {
<span class="co">// Este bloque de código será ejecutado 100 veces</span>
<span class="ot">console</span>.<span class="fu">log</span>(<span class="st">'Actualmente en '</span> + i);
<span class="co">// Nota: el último registro que se mostrará</span>
<span class="co">// en la consola será "Actualmente en 99"</span>
}</code></pre>
</div>
<div id="bucles-utilizando-while" class="section level3">
<h3><a href="#bucles-utilizando-while"><span class="header-section-number">2.5.2</span> Bucles Utilizando While</a></h3>
<p>Un bucle utilizando <code>while</code> es similar a una declaración condicional <code>if</code>, excepto que el cuerpo va a continuar ejecutándose hasta que la condición a evaluar sea falsa.</p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">while</span> ([condición]) [cuerpo]</code></pre>
<p><strong>Un típico bucle utilizando <code>while</code></strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> i = <span class="dv">0</span>;
<span class="kw">while</span> (i < <span class="dv">100</span>) {
<span class="co">// Este bloque de código se ejecutará 100 veces</span>
<span class="ot">console</span>.<span class="fu">log</span>(<span class="st">'Actualmente en '</span> + i);
i++; <span class="co">// incrementa la variable i</span>
}</code></pre>
<p>Puede notar que en el ejemplo se incrementa el contador dentro del cuerpo del bucle, pero también es posible combinar la condición y la incrementación, como se muestra a continuación:</p>
<p><strong>Bucle utilizando <code>while</code> con la combinación de la condición y la incrementación</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> i = -<span class="dv">1</span>;
<span class="kw">while</span> (++i < <span class="dv">100</span>) {
<span class="co">// Este bloque de código se ejecutará 100 veces</span>
<span class="ot">console</span>.<span class="fu">log</span>(<span class="st">'Actualmente en '</span> + i);
}</code></pre>
<p>Se comienza en <code>-1</code> y luego se utiliza la incrementación previa (<code>++i</code>).</p>
</div>
<div id="bucles-utilizando-do-while" class="section level3">
<h3><a href="#bucles-utilizando-do-while"><span class="header-section-number">2.5.3</span> Bucles Utilizando Do-while</a></h3>
<p>Este bucle es exactamente igual que el bucle utilizando <code>while</code> excepto que el cuerpo es ejecutado al menos una vez antes que la condición sea evaluada.</p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">do</span> [cuerpo] <span class="kw">while</span> ([condición])</code></pre>
<p><strong>Un bucle utilizando <code>do-while</code></strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">do</span> {
<span class="co">// Incluso cuando la condición sea falsa</span>
<span class="co">// el cuerpo del bucle se ejecutará al menos una vez.</span>
<span class="fu">alert</span>(<span class="st">'Hola'</span>);
} <span class="kw">while</span> (<span class="kw">false</span>);</code></pre>
<p>Este tipo de bucles son bastantes atípicos ya que en pocas ocasiones se necesita un bucle que se ejecute al menos una vez. De cualquier forma debe estar al tanto de ellos.</p>
</div>
<div id="break-y-continue" class="section level3">
<h3><a href="#break-y-continue"><span class="header-section-number">2.5.4</span> Break y Continue</a></h3>
<p>Usualmente, el fin de la ejecución de un bucle resultará cuando la condición no siga evaluando un valor verdadero, sin embargo también es posible parar un bucle utilizando la declaración <code>break</code> dentro del cuerpo.</p>
<p><strong>Detener un bucle con break</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">for</span> (<span class="kw">var</span> i = <span class="dv">0</span>; i < <span class="dv">10</span>; i++) {
<span class="kw">if</span> (something) {
<span class="kw">break</span>;
}
}</code></pre>
<p>También puede suceder que quiera continuar con el bucle sin tener que ejecutar más sentencias del cuerpo del mismo bucle. Esto puede realizarse utilizando la declaración <code>continue</code>.</p>
<p><strong>Saltar a la siguiente iteración de un bucle</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">for</span> (<span class="kw">var</span> i = <span class="dv">0</span>; i < <span class="dv">10</span>; i++) {
<span class="kw">if</span> (something) {
<span class="kw">continue</span>;
}
<span class="co">// La siguiente declaración será ejecutada</span>
<span class="co">// si la condición 'something' no se cumple</span>
<span class="ot">console</span>.<span class="fu">log</span>(<span class="st">'Hola'</span>);
}</code></pre>
</div>
</div>
<div id="palabras-reservadas" class="section level2">
<h2><a href="#palabras-reservadas"><span class="header-section-number">2.6</span> Palabras Reservadas</a></h2>
<p>JavaScript posee un número de “palabras reservadas”, o palabras que son especiales dentro del mismo lenguaje. Debe utilizar estas palabras cuando las necesite para su uso específico.</p>
<ul>
<li><code>abstract</code></li>
<li><code>boolean</code></li>
<li><code>break</code></li>
<li><code>byte</code></li>
<li><code>case</code></li>
<li><code>catch</code></li>
<li><code>char</code></li>
<li><code>class</code></li>
<li><code>const</code></li>
<li><code>continue</code></li>
<li><code>debugger</code></li>
<li><code>default</code></li>
<li><code>delete</code></li>
<li><code>do</code></li>
<li><code>double</code></li>
<li><code>else</code></li>
<li><code>enum</code></li>
<li><code>export</code></li>
<li><code>extends</code></li>
<li><code>final</code></li>
<li><code>finally</code></li>
<li><code>float</code></li>
<li><code>for</code></li>
<li><code>function</code></li>
<li><code>goto</code></li>
<li><code>if</code></li>
<li><code>implements</code></li>
<li><code>import</code></li>
<li><code>in</code></li>
<li><code>instanceof</code></li>
<li><code>int</code></li>
<li><code>interface</code></li>
<li><code>long</code></li>
<li><code>native</code></li>
<li><code>new</code></li>
<li><code>package</code></li>
<li><code>private</code></li>
<li><code>protected</code></li>
<li><code>public</code></li>
<li><code>return</code></li>
<li><code>short</code></li>
<li><code>static</code></li>
<li><code>super</code></li>
<li><code>switch</code></li>
<li><code>synchronized</code></li>
<li><code>this</code></li>
<li><code>throw</code></li>
<li><code>throws</code></li>
<li><code>transient</code></li>
<li><code>try</code></li>
<li><code>typeof</code></li>
<li><code>var</code></li>
<li><code>void</code></li>
<li><code>volatile</code></li>
<li><code>while</code></li>
<li><code>with</code></li>
</ul>
</div>
<div id="vectores" class="section level2">
<h2><a href="#vectores"><span class="header-section-number">2.7</span> Vectores</a></h2>
<p>Los vectores (en español también llamados <em>matrices</em> o <em>arreglos</em> y en inglés <em>arrays</em>) son listas de valores con índice-cero (en inglés <em>zero-index</em>), es decir, que el primer elemento del vector está en el índice 0. Éstos son una forma práctica de almacenar un conjunto de datos relacionados (como cadenas de caracteres), aunque en realidad, un vector puede incluir múltiples tipos de datos, incluso otros vectores.</p>
<p><strong>Un vector simple</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> myArray = [ <span class="st">'hola'</span>, <span class="st">'mundo'</span> ];</code></pre>
<p><strong>Acceder a los ítems del vector a través de su índice</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> myArray = [ <span class="st">'hola'</span>, <span class="st">'mundo'</span>, <span class="st">'foo'</span>, <span class="st">'bar'</span> ];
<span class="ot">console</span>.<span class="fu">log</span>(myArray[<span class="dv">3</span>]); <span class="co">// muestra en la consola 'bar'</span></code></pre>
<p><strong>Obtener la cantidad de ítems del vector</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> myArray = [ <span class="st">'hola'</span>, <span class="st">'mundo'</span> ];
<span class="ot">console</span>.<span class="fu">log</span>(<span class="ot">myArray</span>.<span class="fu">length</span>); <span class="co">// muestra en la consola 2</span></code></pre>
<p><strong>Cambiar el valor de un ítem de un vector</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> myArray = [ <span class="st">'hola'</span>, <span class="st">'mundo'</span> ];
myArray[<span class="dv">1</span>] = <span class="st">'changed'</span>;</code></pre>
<p><em>Como se muestra en el ejemplo “Cambiar el valor de un ítem de un vector” es posible cambiar el valor de un ítem de un vector, sin embargo, por lo general, no es aconsejable.</em></p>
<p><strong>Añadir elementos a un vector</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> myArray = [ <span class="st">'hola'</span>, <span class="st">'mundo'</span> ];
<span class="ot">myArray</span>.<span class="fu">push</span>(<span class="st">'new'</span>);</code></pre>
<p><strong>Trabajar con vectores</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> myArray = [ <span class="st">'h'</span>, <span class="st">'o'</span>, <span class="st">'l'</span>, <span class="st">'a'</span> ];
<span class="kw">var</span> myString = <span class="ot">myArray</span>.<span class="fu">join</span>(<span class="st">''</span>); <span class="co">// 'hola'</span>
<span class="kw">var</span> mySplit = <span class="ot">myString</span>.<span class="fu">split</span>(<span class="st">''</span>); <span class="co">// [ 'h', 'o', 'l', 'a' ]</span></code></pre>
</div>
<div id="objetos" class="section level2">
<h2><a href="#objetos"><span class="header-section-number">2.8</span> Objetos</a></h2>
<p>Los objetos son elementos que pueden contener cero o más conjuntos de pares de nombres claves y valores asociados a dicho objeto. Los nombres claves pueden ser cualquier palabra o número válido. El valor puede ser cualquier tipo de valor: un número, una cadena, un vector, una función, incluso otro objeto.</p>
<p>[Definición: Cuando uno de los valores de un objeto es una función, ésta es nombrada como un <em>método</em> del objeto.] De lo contrario, se los llama <em>propiedades</em>.</p>
<p>Curiosamente, en JavaScript, casi todo es un objeto — vectores, funciones, números, incluso cadenas — y todos poseen propiedades y métodos.</p>
<p><strong>Creación de un “objeto literal”</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> myObject = {
<span class="dt">sayHello</span>: <span class="kw">function</span>() {
<span class="ot">console</span>.<span class="fu">log</span>(<span class="st">'hola'</span>);
},
<span class="dt">myName</span>: <span class="st">'Rebecca'</span>
};
<span class="ot">myObject</span>.<span class="fu">sayHello</span>(); <span class="co">// se llama al método sayHello,</span>
<span class="co">// el cual muestra en la consola 'hola'</span>
<span class="ot">console</span>.<span class="fu">log</span>(<span class="ot">myObject</span>.<span class="fu">myName</span>); <span class="co">// se llama a la propiedad myName,</span>
<span class="co">// la cual muestra en la consola 'Rebecca'</span></code></pre>
<blockquote>
<p><strong>Nota</strong></p>
<p>Notar que cuando se crean objetos literales, el nombre de la propiedad puede ser cualquier identificador JavaScript, una cadena de caracteres (encerrada entre comillas) o un número:</p>
</blockquote>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> myObject = {
<span class="dt">validIdentifier</span>: <span class="dv">123</span>,
<span class="st">'some string'</span>: <span class="dv">456</span>,
<span class="dv">99999</span>: <span class="dv">789</span>
};</code></pre>
<p>Los objetos literales pueden ser muy útiles para la organización del código, para más información puede leer el artículo (en inglés) <a href="http://blog.rebeccamurphey.com/2009/10/15/using-objects-to-organize-your-code/">Using Objects to Organize Your Code</a> por Rebecca Murphey.</p>
</div>
<div id="funciones" class="section level2">
<h2><a href="#funciones"><span class="header-section-number">2.9</span> Funciones</a></h2>
<p>Las funciones contienen bloques de código que se ejecutaran repetidamente. A las mismas se le pueden pasar argumentos, y opcionalmente la función puede devolver un valor.</p>
<p>Las funciones pueden ser creadas de varias formas:</p>
<p><strong>Declaración de una función</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">function</span> <span class="fu">foo</span>() { <span class="co">/* hacer algo */</span> }</code></pre>
<p><strong>Declaración de una función nombrada</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> foo = <span class="kw">function</span>() { <span class="co">/* hacer algo */</span> }</code></pre>
<p><em>Es preferible el método de función nombrada debido a algunas</em> <em><a href="http://yura.thinkweb2.com/named-function-expressions/">profundas razones técnicas</a>. Igualmente, es probable encontrar a los dos métodos cuando se revise código JavaScript.</em></p>
<div id="utilización-de-funciones" class="section level3">
<h3><a href="#utilización-de-funciones"><span class="header-section-number">2.9.1</span> Utilización de Funciones</a></h3>
<p><strong>Una función simple</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> greet = <span class="kw">function</span>(person, greeting) {
<span class="kw">var</span> text = greeting + <span class="st">', '</span> + person;
<span class="ot">console</span>.<span class="fu">log</span>(text);
};
<span class="fu">greet</span>(<span class="st">'Rebecca'</span>, <span class="st">'Hola'</span>); <span class="co">// muestra en la consola 'Hola, Rebecca'</span></code></pre>
<p><strong>Una función que devuelve un valor</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> greet = <span class="kw">function</span>(person, greeting) {
<span class="kw">var</span> text = greeting + <span class="st">', '</span> + person;
<span class="kw">return</span> text;
};
<span class="ot">console</span>.<span class="fu">log</span>(<span class="fu">greet</span>(<span class="st">'Rebecca'</span>,<span class="st">'Hola'</span>)); <span class="co">// la función devuelve 'Hola, Rebecca',</span>
<span class="co">// la cual se muestra en la consola</span></code></pre>
<p><strong>Una función que devuelve otra función</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> greet = <span class="kw">function</span>(person, greeting) {
<span class="kw">var</span> text = greeting + <span class="st">', '</span> + person;
<span class="kw">return</span> <span class="kw">function</span>() { <span class="ot">console</span>.<span class="fu">log</span>(text); };
};
<span class="kw">var</span> greeting = <span class="fu">greet</span>(<span class="st">'Rebecca'</span>, <span class="st">'Hola'</span>);
<span class="fu">greeting</span>(); <span class="co">// se muestra en la consola 'Hola, Rebecca'</span></code></pre>
</div>
<div id="funciones-anónimas-autoejecutables" class="section level3">
<h3><a href="#funciones-anónimas-autoejecutables"><span class="header-section-number">2.9.2</span> Funciones Anónimas Autoejecutables</a></h3>
<p>Un patrón común en JavaScript son las funciones anónimas autoejecutables. Este patrón consiste en crear una expresión de función e inmediatamente ejecutarla. El mismo es muy útil para casos en que no se desea intervenir espacios de nombres globales, debido a que ninguna variable declarada dentro de la función es visible desde afuera.</p>
<p><strong>Función anónima autoejecutable</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript">(<span class="kw">function</span>(){
<span class="kw">var</span> foo = <span class="st">'Hola mundo'</span>;
})();
<span class="ot">console</span>.<span class="fu">log</span>(foo); <span class="co">// indefinido (undefined)</span></code></pre>
</div>
<div id="funciones-como-argumentos" class="section level3">
<h3><a href="#funciones-como-argumentos"><span class="header-section-number">2.9.3</span> Funciones como Argumentos</a></h3>
<p>En JavaScript, las funciones son “ciudadanos de primera clase” — pueden ser asignadas a variables o pasadas a otras funciones como argumentos. En jQuery, pasar funciones como argumentos es una práctica muy común.</p>
<p><strong>Pasar una función anónima como un argumento</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> myFn = <span class="kw">function</span>(fn) {
<span class="kw">var</span> result = <span class="fu">fn</span>();
<span class="ot">console</span>.<span class="fu">log</span>(result);
};
<span class="fu">myFn</span>(<span class="kw">function</span>() { <span class="kw">return</span> <span class="st">'hola mundo'</span>; }); <span class="co">// muestra en la consola 'hola mundo'</span></code></pre>
<p><strong>Pasar una función nombrada como un argumento</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> myFn = <span class="kw">function</span>(fn) {
<span class="kw">var</span> result = <span class="fu">fn</span>();
<span class="ot">console</span>.<span class="fu">log</span>(result);
};
<span class="kw">var</span> myOtherFn = <span class="kw">function</span>() {
<span class="kw">return</span> <span class="st">'hola mundo'</span>;
};
<span class="fu">myFn</span>(myOtherFn); <span class="co">// muestra en la consola 'hola mundo'</span></code></pre>
</div>
</div>
<div id="determinación-del-tipo-de-variable" class="section level2">
<h2><a href="#determinación-del-tipo-de-variable"><span class="header-section-number">2.10</span> Determinación del Tipo de Variable</a></h2>
<p>JavaScript ofrece una manera de poder comprobar el “tipo” (en inglés <em>type</em>) de una variable. Sin embargo, el resultado puede ser confuso — por ejemplo, el tipo de un vector es “object”.</p>
<p>Por eso, es una práctica común utilizar el operador <code>typeof</code> cuando se trata de determinar el tipo de un valor específico.</p>
<p><strong>Determinar el tipo en diferentes variables</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> myFunction = <span class="kw">function</span>() {
<span class="ot">console</span>.<span class="fu">log</span>(<span class="st">'hola'</span>);
};
<span class="kw">var</span> myObject = {
<span class="dt">foo </span>: <span class="st">'bar'</span>
};
<span class="kw">var</span> myArray = [ <span class="st">'a'</span>, <span class="st">'b'</span>, <span class="st">'c'</span> ];
<span class="kw">var</span> myString = <span class="st">'hola'</span>;
<span class="kw">var</span> myNumber = <span class="dv">3</span>;
<span class="kw">typeof</span> myFunction; <span class="co">// devuelve 'function'</span>
<span class="kw">typeof</span> myObject; <span class="co">// devuelve 'object'</span>
<span class="kw">typeof</span> myArray; <span class="co">// devuelve 'object' -- tenga cuidado</span>
<span class="kw">typeof</span> myString; <span class="co">// devuelve 'string'</span>
<span class="kw">typeof</span> myNumber; <span class="co">// devuelve 'number'</span>
<span class="kw">typeof</span> <span class="kw">null</span>; <span class="co">// devuelve 'object' -- tenga cuidado</span>
<span class="kw">if</span> (<span class="ot">myArray</span>.<span class="fu">push</span> && <span class="ot">myArray</span>.<span class="fu">slice</span> && <span class="ot">myArray</span>.<span class="fu">join</span>) {
<span class="co">// probablemente sea un vector</span>
<span class="co">// (este estilo es llamado, en inglés, "duck typing")</span>
}
<span class="kw">if</span> (<span class="ot">Object</span>.<span class="ot">prototype</span>.<span class="ot">toString</span>.<span class="fu">call</span>(myArray) === <span class="st">'[object Array]'</span>) {
<span class="co">// definitivamente es un vector;</span>
<span class="co">// esta es considerada la forma más robusta</span>
<span class="co">// de determinar si un valor es un vector.</span>
}</code></pre>
<p>jQuery ofrece métodos para ayudar a determinar el tipo de un determinado valor. Estos métodos serán vistos más adelante.</p>
</div>
<div id="la-palabra-clave-this" class="section level2">
<h2><a href="#la-palabra-clave-this"><span class="header-section-number">2.11</span> La palabra clave <code>this</code></a></h2>
<p>En JavaScript, así como en la mayoría de los lenguajes de programación orientados a objetos, <code>this</code> es una palabra clave especial que hace referencia al objeto en donde el método está siendo invocado. El valor de <code>this</code> es determinado utilizando una serie de simples pasos:</p>
<ol style="list-style-type: decimal">
<li>Si la función es invocada utilizando <a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call">Function.call</a> o <a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply">Function.apply</a>, <code>this</code> tendrá el valor del primer argumento pasado al método. Si el argumento es nulo (<em>null</em>) o indefinido (<em>undefined</em>), <code>this</code> hará referencia el objeto global (el objeto <code>window</code>);</li>
<li>Si la función a invocar es creada utilizando <a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind">Function.bind</a>, <code>this</code> será el primer argumento que es pasado a la función en el momento en que se la crea;</li>
<li>Si la función es invocada como un método de un objeto, <code>this</code> referenciará a dicho objeto;</li>
<li>De lo contrario, si la función es invocada como una función independiente, no unida a algún objeto, <code>this</code> referenciará al objeto global.</li>
</ol>
<p><strong>Una función invocada utilizando Function.call</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> myObject = {
<span class="dt">sayHello </span>: <span class="kw">function</span>() {
<span class="ot">console</span>.<span class="fu">log</span>(<span class="st">'Hola, mi nombre es '</span> + <span class="kw">this</span>.<span class="fu">myName</span>);
},
<span class="dt">myName </span>: <span class="st">'Rebecca'</span>
};
<span class="kw">var</span> secondObject = {
<span class="dt">myName </span>: <span class="st">'Colin'</span>
};
<span class="ot">myObject</span>.<span class="fu">sayHello</span>(); <span class="co">// registra 'Hola, mi nombre es Rebecca'</span>
<span class="ot">myObject</span>.<span class="ot">sayHello</span>.<span class="fu">call</span>(secondObject); <span class="co">// registra 'Hola, mi nombre es Colin'</span></code></pre>
<p><strong>Una función creada utilizando Function.bind</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> myName = <span class="st">'el objeto global'</span>,
sayHello = <span class="kw">function</span> () {
<span class="ot">console</span>.<span class="fu">log</span>(<span class="st">'Hola, mi nombre es '</span> + <span class="kw">this</span>.<span class="fu">myName</span>);
},
myObject = {
<span class="dt">myName </span>: <span class="st">'Rebecca'</span>
};
<span class="kw">var</span> myObjectHello = <span class="ot">sayHello</span>.<span class="fu">bind</span>(myObject);
<span class="fu">sayHello</span>(); <span class="co">// registra 'Hola, mi nombre es el objeto global'</span>
<span class="fu">myObjectHello</span>(); <span class="co">// registra 'Hola, mi nombre es Rebecca'</span></code></pre>
<p><strong>Una función vinculada a un objeto</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> myName = <span class="st">'el objeto global'</span>,
sayHello = <span class="kw">function</span>() {
<span class="ot">console</span>.<span class="fu">log</span>(<span class="st">'Hola, mi nombre es '</span> + <span class="kw">this</span>.<span class="fu">myName</span>);
},
myObject = {
<span class="dt">myName </span>: <span class="st">'Rebecca'</span>
},
secondObject = {
<span class="dt">myName </span>: <span class="st">'Colin'</span>
};
<span class="ot">myObject</span>.<span class="fu">sayHello</span> = sayHello;
<span class="ot">secondObject</span>.<span class="fu">sayHello</span> = sayHello;
<span class="fu">sayHello</span>(); <span class="co">// registra 'Hola, mi nombre es el objeto global'</span>
<span class="ot">myObject</span>.<span class="fu">sayHello</span>(); <span class="co">// registra 'Hola, mi nombre es Rebecca'</span>
<span class="ot">secondObject</span>.<span class="fu">sayHello</span>(); <span class="co">// registra 'Hola, mi nombre es Colin'</span></code></pre>
<blockquote>
<p><strong>Nota</strong></p>
<p>En algunas oportunidades, cuando se invoca una función que se encuentra dentro de un espacio de nombres (en inglés <em>namespace</em>) amplio, puede ser una tentación guardar la referencia a la función actual en una variable más corta y accesible. Sin embargo, es importante no realizarlo en instancias de métodos, ya que puede llevar a la ejecución de código incorrecto. Por ejemplo:</p>
</blockquote>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> myNamespace = {
<span class="dt">myObject</span>: {
<span class="dt">sayHello</span>: <span class="kw">function</span>() {
<span class="ot">console</span>.<span class="fu">log</span>(<span class="st">'Hola, mi nombre es '</span> + <span class="kw">this</span>.<span class="fu">myName</span>);
},
<span class="dt">myName</span>: <span class="st">'Rebecca'</span>
}
};
<span class="kw">var</span> hello = <span class="ot">myNamespace</span>.<span class="ot">myObject</span>.<span class="fu">sayHello</span>;
<span class="fu">hello</span>(); <span class="co">// registra 'Hola, mi nombre es undefined'</span></code></pre>
<p>Para que no ocurran estos errores, es necesario hacer referencia al objeto en donde el método es invocado:</p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> myNamespace = {
<span class="dt">myObject </span>: {
<span class="dt">sayHello </span>: <span class="kw">function</span>() {
<span class="ot">console</span>.<span class="fu">log</span>(<span class="st">'Hola, mi nombre es '</span> + <span class="kw">this</span>.<span class="fu">myName</span>);
},
<span class="dt">myName </span>: <span class="st">'Rebecca'</span>
}
};
<span class="kw">var</span> obj = <span class="ot">myNamespace</span>.<span class="fu">myObject</span>;
<span class="ot">obj</span>.<span class="fu">sayHello</span>(); <span class="co">// registra 'Hola, mi nombre es Rebecca'</span></code></pre>
</div>
<div id="alcance" class="section level2">
<h2><a href="#alcance"><span class="header-section-number">2.12</span> Alcance</a></h2>
<p>El “alcance” (en inglés <em>scope</em>) se refiere a las variables que están disponibles en un bloque de código en un tiempo determinado. La falta de comprensión de este concepto puede llevar a una frustrante experiencia de depuración.</p>
<p>Cuando una variable es declarada dentro de una función utilizando la palabra clave <code>var</code>, ésta únicamente esta disponible para el código dentro de la función — todo el código fuera de dicha función no puede acceder a la variable. Por otro lado, las funciones definidas <em>dentro</em> de la función <em>podrán</em> acceder a la variable declarada.</p>
<p>Las variables que son declaradas dentro de la función sin la palabra clave <code>var</code> no quedan dentro del ámbito de la misma función — JavaScript buscará el lugar en donde la variable fue previamente declarada, y en caso de no haber sido declarada, es definida dentro del alcance global, lo cual puede ocasionar consecuencias inesperadas;</p>
<p><strong>Funciones tienen acceso a variables definidas dentro del mismo alcance</strong></p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> foo = <span class="st">'hola'</span>;
<span class="kw">var</span> sayHello = <span class="kw">function</span>() {
<span class="ot">console</span>.<span class="fu">log</span>(foo);
};