Escolar Documentos
Profissional Documentos
Cultura Documentos
Versin 0.47
Temario
1. Introduccin
1. Motivacin
2. Requerimientos bsicos
3. Breve historia de javascript
4. Cmo sacarle provecho al libro?
5. Lenguajes de programacin interpretados
2. Herramientas
1. El inspector de elementos
2. El editor de texto
3. Variables
1. Declaraciones y asignaciones
2. Memoria Dinmica
3. Comentarios
4. Tipos de datos
4. Operadores
1. Operadores aritmticos
2. Operadores de asignacin
3. Operadores lgicos
5. Condiciones
1. If, else if, else
2. Ifs anidados
3. Lgica booleana
4. Operador ternario
6. Ciclos
1. For
2. While
3. Do While
4. Validacin de entradas
5. Break, continue
7. Ciclos anidados
8. Funciones
1. Introduccin a funciones
2. Definicin
3. Nombres
4. Retorno
5. Parmetros
6. Ambito o Scope de las variables
7. Funciones de primera clase
8. Funciones annimas
9. Arrays
1. Mtodos comunes
2. Mutabilidad
3. Mtodos tiles pero no 100% soportados
4. Lowdash y underscore
5. Copia de arrays
10. Objetos
1. Objetos literales
2. Agregando propiedades a un objeto.
3. El operador this
4. El objeto Window
11. Funciones avanzada
1. Funciones autoejecutables
2. Funciones recursivas
3. Closures
4. Patrn Mdulo
12. Los prototipos
1. Funcin constructora
2. Prototupis
13. Javascript y HTML
1. Estructura de un proyecto web
2. El objeto document
Captulo 1
Introduccin.
Motivacin
Difcilmente existe un lenguaje ms importante para la programacin de sitios web que Javascript, segn w3techs
Javascript es utilizado en el 89.9% de los sitios web del mundo y no existe ningn indicio de que esta tendencia
vaya a disminuir en el mediano plazo.
Este libro busca entregar las bases para entender y poder utilizar javascript para la construccin de sitios web
interactivos.
Requerimientos bsicos
Para seguir este libro se necesitan conocimientos bsicos de HTML y CSS. Conocimientos previos de
programacin son deseables pero no estrictamente necesarios.
Programas compilados
Si alguna vez has visto un archivo de extensin .exe claramente has visto un programa compilado, ahora no slo
existen para Windows, existen para casi todas los sistemas operativos.
Compilar el programa previamente vs interpretarlo en tiempo real tiene mltiples ventajas, una de ellas es el la
velocidad de ejecucin, pero eso no quiere decir que siempre sea la mejor forma.
La desventaja de este proceso es que cada mquina es distinta y se requiere compilar un programa para cada
mquina distinta o con sistema operativo distinto.
Programas interpretados
Interpretar un programa requiere de un interprete que recibe el nombre de cliente y es capaz de traducir en
tiempo real el cdigo escrito por una persona a lenguaje mquina.
La ventaja de los programas interpretados es que si existe el interprete para la plataforma tu programa correr en
esa plataforma. La desventaja es que ser ms lento que un programa compilado.
Javascript
Javascript es uno de los lenguajes interpretados ms famosos del mundo y con una gran ventaja por sobre otros
lenguajes interpretados, el interpretador es el navegador y por lo tanto no requiere que el usuario instale ningn
programa especial para ejecutar los cdigos enviados, hacindolo un muy buen lenguaje de programacin
multiplataforma especialmente para la web.
Los programas escritos en javascript pueden ser ledos directamente en el navegador, cabe sealar que si se
pueden hacer programas en javascript para escritorio o para servidores, estos tema no lo discutiremos en este
libro pero puedes aprender ms sobre javascript para lado servidor o para programas de escritorio buscando
sobre node.js
Preguntas
Para qu sirve Javascript?
Cules son las diferencia entre un programa compilado y uno interpretado.
Javascript es interpretado o se compila?
Qu es el cdigo fuente?
Qu programa lee Javascript?
Captulo 2
Herramientas
El inspector de elementos
Para apoyar el desarrollo de proyectos en Javascript muchos navegadores como Chrome o Mozilla Firefox tienen
inspectores de elementos, este inspector permite revisar paso a paso las instrucciones que est corriendo
Javascript y poder investigar las causas de errores. Al proceso de investigar y eliminar errores se le denomina
debugging (de-bug),
En Chrome podemos abrir el inspector de elementos con un click derecho y seleccionando la opcin inspector de
elementos y luego seleccionando el tab console.
Otra opcin para abrir la consola de javascript es en la barra de tareas view >> developer >> javascript console
La consola de javascript permite ejecutar directamente cdigo javascript en el navegador, la primera seccin de
este libre puede ser probada directamente de esta forma sin necesidad de un editor de texto.
Modo network
Dentro del inspector de elementos trabajaremos principalmente con el tab Console pero el tab Network nos
servir tambin para aprender un poco ms sobre javascript en la web.
Si abrimos el tab network y luego entramos en una pgina (tiene que ser en ese orden, si lo abrimos despus no
funciona y hay que recargar la pgina) observaremos que todos los archivos que nos enva un servidor, esos
archivos sern el HTML, muchos archivos CSS y muchos archivos JS y adems imgenes.
El inspector de elementos ser uno de tus mejores amigos durante el desarrollo de un script, nos
permite hacer pruebas rpida y debugging del proceso.
Qu es el desarrollo de front-end?
El desarrollo web front-end tiene 3 capas que consisten en la construccin de HTML, CSS y JS, la imagen a
continuacin ilustra.
El editor de texto
A pesar de que a travs de la consola del navegador podemos ejecutar directamente cdigo javascript, esta forma
no nos permite poder guardar nuestros cdigos y ms adelante compartirlos o utilizarlos en nuestro proyecto.
Para escribir javascript podemos crear un archivo .js y poner todo el cdigo dentro del archivo, o podemos crear
un archivo html y dentro de la etiqueta <script> </script> escribir nuestros cdigos.
Para escribir los cdigos podemos ocupar un editor rstico como el famoso block de notas de windows, pero es
mejor ocupar un editor con resaltado de sintaxis y con autocompletado que nos ayude a trabajar mejor y ms
rpido.
Por lo mismo se recomienda utilizar los editor de sublime text 3 o Atom, ambos muy buenos y potentes.
Mi primer javascript
Podemos crear nuestro primer proyecto javascript dentro de un archivo HTML.
Para eso abriremos el editor de texto crearemos un archivo llamado miprimerjs.html y luego dentro
escribiremos:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title></title>
<link rel="stylesheet" href="">
</head>
<body>
<script>
alert("hola");
</script>
</body>
</html>
Alert es una funcin incorporada en javascript que permite levantar un popup bien molesto que interrumpe al
usuario dicindole "hola", no es bueno utilizarla para la construccin de un sitio web pero es la tcnica ms
rudimentaria para debugging.
Otra opcin en lugar de ocupar alert consiste en ocupar console.log, esta permite mostrar dentro del tab console
del inspector de elementos el output esperado.
O sea el cdigo:
1
2
3
<script>
console.log("hola mundo");
</script>
Preguntas
Cul es la diferencia entre un desarrollador back y uno front?
Para qu sirve el tab console del inspector de elementos?
Para qu sirve el modo network?
Desafo
Utiliza lo aprendido en este captulo para copiar una pgina web que te guste.
Captulo 3
Variables:
Las variables son contenedores para asignar o guardar datos, se les denomina variables puesto que estos
contenedores pueden cambiar de contenido. A los contenedores que no pueden cambiar el contenido se les
denomina constantes.
Una variable tiene se compone de:
Un identificador
Un valor.
var a = "Hola";
Una pregunta interesante sera, Por qu Hola est envuelto en comillas? Esto se debe a que es un string, o sea
una secuencia de caracteres que no es una variable y javascript lo necesita para poder diferenciarlo de un
identificador, para entender esto mejor veamos el siguiente ejemplo:
1
2
var a = "Hola";
var b = a;
Como el identificador a tiene el valor de "Hola" al asignar b al valor de a, lo que estamos haciendo es decir que
ahora b tendr el valor de hola. Lo puedes probar tu mismo escribiendo console.log(b)
Aqu descubrimos otra cosa, el cdigo se lee linealmente, o sea primero javascript procesa el valor de a y luego el
valor de b, de otra forma no sabra que b tiene el valor de "hola"
Adems es importante destacar que una variable puede ser declarada sin una asignacin, ejemplo de esto sera:
var sin_asignar;
Preguntas:
Antes de seguir avanzando en el libro deberas ser capaz de contestar las siguientes preguntas:
Cul es la diferencia entre asignacin y declaracin?
Se puede asignar una variable sin declararla?
Se puede declarar una variable sin asignarla?
Cul es la diferencia entre una variable y un string?
Que valor tiene una variable que no ha sido asignada?
Comentando el cdigo
Antes de seguir hablando de variables vamos a hacer una pausa para hablar de comentarios, Los comentarios son
lneas de cdigo que estn en el cdigo pero que no se ejecutan.
/*
Todo lo que se encuentre entre /* y */ no se ejecutar,
pero lo que se encuentre antes de /* y despus de */ si se ejecutar
ejemplo:
console.log("Esta lnea NO se ejecuta)"
*/
console.log("Esta lnea si se ejecuta")
Probando lo aprendido
1
2
3
4
5
var a = 2;
/*
a = 3
*/
console.log(a)
Tipos de datos
En el captulo anterior mencionamos que las variables eran contenedores de datos, estos contenedores no son
genricos, de hecho hay tipos de contenedores y dentro de estos se incluyen:
1. Number
2. String
3. Boolean
4. Array
5. Object
Numbers
Number hace referencia a un nmero. Para guardar un nmero en una variable escribimos la instruccin:
var num = 2;
Donde se asignar el nmero 2 a la variable num. Podemos probar que esto efectivamente es as escribiendo
console.log(typeof(num)); typeof(num) devuelve el tipo de dato del elemento pasado como
argumento, o sea lo que est entre los parntesis.
En el caso anterior la respuesta ser Number.
Los decimales como 3.8 y los nmeros negativos pertenecen tambin al tipo Number, es importante tener en
cuenta que los nmeros decimales ocupan el caracter punto como separador y no una coma.
String
El tipo de dato String hace referencia a una cadena de caracteres o palabras, si queremos almacenar un String en
una variable ejecutamos la instruccin:
Donde "Hola mundo" es el dato que se asigna a la variable "palabra". Notar que Hola mundo se encuentra
entre comillas, esto quiere decir que este tipo de dato es un String.
Tambin podemos poner dentro de un string nmeros, ejemplo var s = "Hola21" incluso podemos
tener un string que slo contenga un nmero, como por ejemplo var n = 20 . A simple vista no hay
mucha diferencia, pero al momento de comenzar con las operaciones numricas encontraremos
comportamientos extraos si asignamos a un nmero como un String. Por lo que los nmeros siempre los
asignaremos sin comillas.
Boolean
Este tipo de dato hace referencia a un valor que puede ser verdadero o falso, o bien tr ue o false. Estas variables
se utilizan por lo general como comparadores, o sea para verificar si se cumplen ciertas condiciones. Como por
ejemplo "El usuario es mayor de edad?".
Para asignar un tipo de dato Boolean a una variable basta con:
1
2
Hay que destacar que en este caso no se utiliza comillas para true o false y la razn es sencilla, es porque no son
Strings, son palabras reservadas de javascript para indicar los valores booleanos.
Array
Los Array son contenedores para mltiples datos, un array puede contener distintos tipos de datos, incluso
mezclados!, lo que puede eventualmente generar una confusin. Un arreglo puede contener Number, String,
Boolean, Object e incluso otros Array. Para definir un array:
El parntesis de corchete indica a javascript que cree un arreglo vaco. Tambin pueden asignarse las variables de
manera inmediata:
Es posible acceder a la informacin dentro de un arreglo ocupando su ndice, si utilizamos la definicin anterior
arreglo[0] tendr el valor 2.
Los ndices van desde cero y llegan a n - 1, donde n es la cantidad de elementos del arreglo
Veremos los arrays con ms detalle en un prximo captulo.
Objetos
Los objetos tienen propiedades y mtodos como en la vida real lo tendra un automvil, un automvil tiene
como propiedades color, marca, modelo entre otros. Mientras que tambin tiene los mtodos encender, apagar,
avanzar, retroceder, etc. Para definir un objeto escribimos:
Esto definir un objeto vaco. Los objetos al igual que los array tienen su propia seccin en esta gua por lo que
profundizaremos ms adelante.
Memoria dinmica
Javascript es un lenguaje de memoria dinmica. A diferencia de otros tipos de lenguaje las variables en javascript
pueden cambiar el tipo de dato que guardan, o sea el cdigo a continuacin es perfectamente vlido.
1
2
3
var a = "hola";
a = 21;
a = true;
Los pros y contras de esto son bastante discutidos, pero lo que si es cierto es que es una posible causal de errores
y por lo mismo cuando programemos en javascript tenemos que ser extra cuidadosos.
Para poder visualizar el tipo de dato asignados a una variable utilizaremos la instruccin:
console.log(typeof(x));
Donde x es la variable en cuestin.
Preguntas
Antes de seguir avanzando deberas poder contestar las siguientes preguntas.
Cmo podemos verificar que -3.9 sea del mismo tipo de dato que 3.9?
Cul es la diferencia entre true y "true"?
Qu pasa con typeof(x) si x cambia de 1.0 a "hola", mantiene el tipo o lo cambia?
Captulo 4
Operadores
Los operadores en javascript permiten como dice su nombre operar sobre los diversos tipos de datos ya sea
directamente o a travs de variables, los resultados de las operaciones los mostraremos en pantalla con
console.log() o con alert() o los asignaremos a otra variable para futuras operaciones.
Los operadores se dividen en:
1. Operadores aritmticos
2. Operadores de asignacin
3. Operadores lgicos
4. Otros operadores
Operadores aritmticos
Los operadores aritmticos en javascript sirven para poder realizar operaciones matemticas ya sea sobre
nmeros u otro tipo de dato.
Operador Suma
Para sumar datos ocuparemos el operador (+):
1
2
3
4
var
var
var
var
suma = 1 + 2;
a = 1;
b = 2;
c = a + b;
Una curiosidad del operador suma es que tambin sirve para strings, al sumar dos strings obtenemos un slo
string con el contenido de ambos.
ejemplo:
Operador resta
Para sumar datos ocuparemos el operador (-):
1
2
3
4
var
var
var
var
resta = 3;
a = 3;
b = 4;
c = a - b;
Operador multiplicacin
Para multiplicar datos ocuparemos el operador (*), este funciona similar a los otros operadores de suma y resta:
1
2
3
4
var
var
var
var
multiplica = 3 * 4;
a = 3;
b = 4;
c = a * b;
Detalle importante respecto al operador multiplicacin, al igual que en las matemticas tradicionales tiene
precedencia, eso quiere decir que ocurre primero que la suma.
Ejemplo:
console.log(3 + 4 * 2);
Si la suma ocurriese primero, el resultado sera 7 * 4, o sea 12, sin embargo al igual que en las matemticas de
colegio, en una expresin sin parntesis la multiplicacin ocurre primero.
Operador Divisin
Para dividir datos ocuparemos el operador (/) Se comporta muy similar al operador de multiplicacin, y tiene la
misma precedencia.
1
2
3
4
5
var divide = 10 / 2;
var a = 10;
var b = 2;
var c = a / b;
// c tendra el valor de 5
Un detalle importante del operador divisin es que a diferencia de otros lenguajes devuelve la divisin exacta, o
sea:
1
2
console.log (3 / 2);
// Mostrara 1.5
En muchos otros lenguajes la divisin entre dos nmeros enteros tiene como resultado un nmero entero, pero
en javascript no existe el tipo de dato entero, slo existe el tipo de dato number y este se puede dividir sin
problemas.
Siendo un poco ms tcnico los numbers son puntos flotantes de 64 bits.
Operador mdulo
El operador mdulo es muy til para obtener el resto de las divisiones.
Para obtener el mdulo (%): var modulo = 10 % 2;
Un ejemplo con variables:
1
2
3
var a = 10;
var b = 2;
var c = a % b;
Operador de asignacin
El ms bsico de todos los operadores de asignacin ya lo hemos ocupado, es el operador = y permite asignar
un valor a una variable.
Operador incremento
Para incrementar el valor de una variable en 1 (++), ejemplo:
1
2
var a = 3;
a++;
Operador decremento
Para disminuir en 1 el valor de una variable (): nombreVariable;
1
2
var a = 3;
a--;
Recordatorio
Si no estas seguro de que el resultado de una operacin sea el correcto puedes imprimir los tipos de
datos con console.log()
Preguntas
Antes de seguir debes ser capaz de contestar las siguientes preguntas.
1. Qu obtienes al sumar 1 + "1"?
2. Qu obtienes al sumar "1" + "1"?
3. Qu obtienes al dividr 1 por 2?
4. Cul es el resultado de 1+2*3?
5. Qu es la precedencia de operadores?
Operadores de Comparacin
Sirven para poder realizar comparaciones entre las variables que se estn comparando, como resultado
devuelven un booleano que puede ser true o false.
Comparacin de igualdad
Igual a, se hace con (==) Ejemplo:
1
2
3
4
5
6
3 == 4;
// devuelve false
3 == 3;
// devuelve true
3 == "3"
// devuelve true
Comparacin de tipo
Esto lo podemos lograr con ocupando typeof()
typeof(3) == typeof("3");
1
2
3
3 === "3";
// devuelve false
3 === 3; // devuelve true
Operador Distinto
Devuelve true cuando las expresiones a sus lados son diferentes. Ejemplo:
1
2
3
4
3 != 3;
// devuelve false
3 != 4;
// devuelve true
1
2
3
4
3 !== "3";
// devuelve true
3 !== 3;
// devuelve false
3 > 2;
// devuelve true
3 > 4;
// devuelve false
3 < 2;
// devuelve
false 3 < 4;
// devuelve true
3 >= 3;
// devuelve true
3 >= 4;
// devuelve false
3 <= 3;
// devuelve true
3 <= 2;
// devuelve false
Combinemos lo aprendido
Que pasara si escribimos en la consola?
var a = 3 > 5;
Operadores lgicos
La lgica booleana que utilizaremos en javascript es la misma de las tablas de verdad que se aprende en el colegio.
El operador and
Simbolizado por &&, permite obtener el resultado de una interseccin logca. Para refrescar la memoria los
resultados se ilustran en la siguiente tabla:
El operador or
Simbolizado && permite obtener el resultado de la operacin de la nion lgica.
Pregunta rpida
1
2
3
a = false;
console.log(!a)
// Cul es el valor mostrado en pantalla ?
Otros operadores
Concatenacin
La concatenacin permite unir 2 strings como si fuesen slo uno. esto ya lo vimos previamente pero es bueno
reforzarlo
1
2
3
La variable c del ejemplo anterior, si la imprimimos en la consola mostrar "Hola mundo", debido a que las
variables a y b fueron concatenadas.
Hay un detalle muy importante de la concatenacin que es la causa de muchos errores, la suma de un entero con
un string tiene como resultado un string, o sea.
1
2
console.log(1 + "1")
// mostrar 11
La forma de lidiar con esto se le llama parsing, que es convertir un dato de un tipo en otro tipo (no es cambiar el
valor, es cambiar el tipo). La funcin parseInt es capaz de convertir un string en un integer que represente el
mismo valor, ejemplo de uso:
1
2
3
4
var a = parseInt("1");
var b = 1;
console.log(a + b);
// mostrar 2
Fallando en el parsing
Cuidado
Debemos tener mucho cuidado al hacer parseo, por ejemplo al convertir a nmero algo que no sea
posible convertirse.
En el caso anterior se entiende fcilmente lo que est mal, pero en un programa grande puede llegar a ser difcil
encontrar estos problemas.
NaN
NaN es un valor que sirve para representar algo que no es un nmero, por si solo rara vez se usa, pero es posible
obtenerlo de una operacin, por ejemplo al hacer parseInt("hola")
Para trabajar con este valor existe la funcin isNaN que nos devuelve true o false dependiendo de si el
argumento es o no es un nmero
isNaN
resultado
isNaN(123)
false
isNaN(-1.05)
false
isNaN(5-2)
false
isNaN(0)
false
isNaN(123)
false
isNaN()
false
isNaN(true)
false
isNaN(2015/09/03)
true
isNaN(Hello)
true
isNaN(undefined)
true
isNaN(NaN)
true
isNaN(NaN)
true
isNaN(0 / 0)
true
Preguntas
Antes de seguir debes ser capaz de contestar las siguientes preguntas.
1. Qu obtienes al sumar 1 + parseInt("1")?
2. Qu obtienes al sumar 1 + parseInt("hola")?
3. Cul es el resultado al sumar 1 + parseInt("hola")?
Captulo 5
Condiciones
Las condiciones en javascript sirven para poder tomar decisiones en cuanto al cdigo que se escribe, lo que
hacen es ramificar el cdigo, y la secuencia deja de leerse linealmente, y pasa a leerse dependiendo de la rama
if
if es la condicin ms sencilla, veamos un ejemplo:
1
2
3
4
En ese caso todo lo que est dentro de las llaves {} slo se ejecuta si se cumple la condicin.
Lo que recibe la expresin if es un valor booleano, puede ser true o false, si es true se ejecuta, si es false no lo
hace.
else
En algunos casos necesitamos ejecutar un cdigo slo si la condicin no se cumple, para eso la instruccin else
viene al rescate.
1
2
3
4
5
6
7
8
9
else if vs doble if
Existe un punto medio entre el if y else, se llama else if, esta condicin se evala siempre y cuando el if anterior
o el else if anterior devuelvan false.
Para ilustrarlo esto veamos un ejemplo sencillo, queremos determinar si una persona es nio, adolescente, adulto.
1
2
3
4
5
6
7
8
9
10
11
12
var edad = 5;
if (edad < 13) {
console.log("es nio");
}
if (edad < 18 ){
console.log("Es adolescente");
}
else {
console.log("Es adolescente");
}
En el cdigo anterior si una persona tiene 12 aos, entonces se mostrar en pantalla que es nio, pero adems se
mostrar que es adolecente, puesto que ambos if se evaluan, para evitar este tipo de situaciones existe el else if
1
2
3
4
5
6
7
nio");
){
adolecente");
adolecente");
La instruccin else if slo se evala si la condicin anterior no se cumple, y el else slo se evala si ninguna de
las condiciones anteriores se cumple.
ifs anidados
Es perfectamente posible tener un if dentro de un if, supongamos que queremos revisar si una persona es mayor
de 18 y es zurdo eso lo podemos hacer de la siguiente forma:
1
2
3
4
5
6
7
El problema de utilizar ifs anidados es que aumentan muchos las posibles rutas de cdigo lo que hace el cdigo
difcil de revisar, este tipo de situaciones puede ser mejorado con un poco de lgica booleana.
1
2
3
En la lgica booleana debemos tener especial cuidado con el operador not, puesto que no (a y b) = no (a) o no
(b).
Ejercicios resueltos
1
2
3
4
5
6
7
8
9
else {
console.log("c es el mayor");
}
Se deja como tarea al lector resolver el mismo problema con ifs anidados, y un ejercicio no menos interesante es
hacerlo con cuatro nmeros.
Adems el cdigo anterior no determina correctamente el nmero mayor en caso que algunos sean iguales, ese es
otro ejercicio interesante que se deja de tarea.
Combinaciones posibles
Entonces, dada dos variables, a y b que pueden contener los strings "piedra", "papel" o "tijera" tenemos 9
combinaciones posibles.
1. piedra vs piedra
2. piedra vs papel
3. piedra vs tijera
4. papel vs piedra
5. papel vs papel
6. papel vs tijera
7. tijera vs piedra
8. tijera vs papel
9. tijera vs tijera
Solucin
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Se deja de tarea realizar el mismo problema con ifs anidados, en este caso la solucn es ms corta, pero requiere
de un poco ms de anlisis.
Operador ternario
El operador ternario es otra forma de escribir if pero con menos cdigo, la lgica es la siguiente:
expresin booleana ? expresion1 : expresion2
1
2
3
edad = 19;
resultado = edad > 18 ? "es mayor de edad" : "no lo es";
// resultado muestra si
Captulo 6
Ciclos
Los ciclos, tambin conocidos como loops en ingls permiten ejecutar un bloque de cdigo un determinado
nmero de veces.
Para realizar los loops podemos ocupar la instruccin for o la instruccin while.
For
La sintaxis para el loop for es la siguiente:
1
2
3
var suma = 0:
for(var i = 0; i < 100; i++) {
2
3
4
suma += i;
}
1
2
3
4
5
6
var suma = 0:
for(var i = 0; i < 100; i++) {
if (i % 2 == 0){
suma += i
;
}
}
Versin inteligente
En lugar de generar todos los nmeros si son pares o no, podramos generar exclusivamente nmeros pares,
cambiando la condicin de incremento.
1
2
3
4
5
var suma = 0;
for(var i = 0; i < 100; i = i + 2) {
console.log(i);
suma += i;
}
El secreto para ser un buen programador es hacer las cosas de la forma ms sencilla posible.
Ingresando elementos
For no solo sirve para sumar, es posible pedirle al usuario que ingrese n elementos para mostrarlos
1
2
3
4
5
var n = 5;
for(var i = 0; i < n; i++)
{
var ingreso = prompt("Ingrese un nmero");
}
Luego podemos utilizar la misma idea anterior para sumar los resultados (ya pronto podremos hacer cosas ms
interesantes que sumar)
1
2
3
4
5
6
7
var n = 5;
suma = 0;
for(var i = 0; i < n; i++)
{
var ingreso = prompt("Ingrese un nmero");
suma += ingreso;
}
Al correr el cdigo anterior si ingresamos los nmeros 1,2,3,4,5 obtendremos como resultado "012345"
Cmo podemos hacer para arreglarlo?
Cuando omitimos algunas de las condiciones, podemos dejar slo el ; en su lugar, pero debemos tener cuidado
de que el ciclo no sea infinito.
While
Otra forma similar para generar ciclos es con while, funciona de una forma muy similar y al igual que el for
tambin se ejecutar un nmero determinado de veces siempre y cuando se cumpla con una condicin. La
sintaxis para el ciclo while es la siguiente:
1
2
3
4
var i = 0;
while(i < 10) {
console.log("Esto se imprimir 10 veces.");
}
La principal diferencia con el ciclo for que vimos anteriormente es que debe indicarse cuanto vale i antes del
ciclo, adems debe manejarse que se realizar con i dentro del mismo ciclo.
La porcin de cdigo anterior se ejecutar 10 veces, ya que comenzar con i = 0 , y se aumentar su valor
en 1, finalmente, cuando i sea igual a 10, el loop terminar.
Do - while
Do while es similar a while, pero el ciclo siempre se realiza una vez antes de revisar la condicin, la sintaxis bsica
es:
1
2
do {
} while (condicin)
Esto es muy til para validar entradas, pro ejemplo supongamos que tenemos que hacer un programa donde el
usuario tiene que ingresar dos nmeros y luego debemos sumarlos:
1
2
3
4
5
6
7
8
9
10
11
12
var ingreso1;
var ingreso2;
do {
ingreso1 = prompt("Ingrese el primer nmero");
} while (isNaN(ingreso1));
do {
ingreso2 = prompt("Ingrese el segundo nmero");
} while (isNaN(ingreso1));
alert(parseInt(ingreso1) + parseInt(ingreso2));
Regla de transformacin:
Todo ciclo while puede ser transformado en un for y todo for en uno while, as como los ciclos do-while se
pueden transformar a while y for y viceversa.
Se deja como ejercicio al lector crear una versin del cdigo de las sumatoria y de la revisin de nmeros primos
utilizando while en lugar de for.
1
2
3
4
5
6
7
var i = 0;
while (i < 10){
if (i === 5){
break;
}
console.log(La variable i vale: + i); i++;
}
En el ejemplo anterior, el loop while terminar cuando i sea igual a 5, ya que se ejecutar la lnea donde se
encuentra break.
1
2
3
4
5
6
7
8
var j = 0;
for (var i = 0; i < 100; i ++){
if (i === 5){
continue;
}
j++;
console.log(i + "," + j)
}
Cuando i toma el valor de 5 las instrucciones de j++ y console.log no sern ejecutadas, a partir de la siguiente
vuelta j ya no estar en sincrona con i.
Veamos un ejercicio un poco ms complejo.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Ciclos anidados
As como los ifs se pueden anidar, los ciclos tambin se pueden anidar, esto tiene bastante utilidades, la principal
de ellas es manejos de matrices.
Es muy cierto que hasta este momento el principal uso que le hemos dado a los ciclos es para clculos
matemticos, pero no es el nico. Eventualmente tendremos arrays con informacin que sacaremos de bases de
datos y en ese caso tendremos que iterar con for o while para mostrar todos sus valores, hasta entonces los casos
prcticos que hagamos sern con nmeros y dibujos.
y hablando de dibujos vamos por nuestro primero dibujo.
Dibujando un bloque de *
En este ejercicio dibujaremos un cuadrado de tamao 5 con *, o sea sern 5 * de lado y 5 de alto.
La solucin ms evidente es:
1
2
3
4
5
console.log("******");
console.log("******");
console.log("******");
console.log("******");
console.log("******");
Pero Cmo podemos hacerlo para dejarlo parametrizado?, o sea que el resultado dependa del input del usuario
el tamao de nuestro cuadrado.
Solucin paramtrica
Supongamos que no nos interesa el tamao del lado, vamos por un momento a preocuparnos nicamente de la
altura.
Entonces podramos parametrizas la solucin de la siguiente forma:
1
2
3
4
var size = 5;
for (i = 0; i < size; i ++){
console.log("******");
}
Ahora lo que tenemos que resolver sabemos que est dentro del for, para eso vamos a imprimir los * de dentro
del for de a uno.
1
2
3
4
5
6
var size = 5;
for (i = 0; i < size; i ++){
for (j = 0; j < size; j++){
console.log("*");
}
}
El problema de la solucin anterior es que nos arroja una sola lnea de *, 25 veces debido a que console.log
tambin imprime el salto de lnea, pero eso lo podemos solucionar concatenando los strings e imprimindolos
una sola vez.
1
2
3
4
5
6
7
8
var size = 5;
for (i = 0; i < size; i ++){
asteriscos = "";
for (j = 0; j < size; j++){
asteriscos += "*";
}
console.log(asteriscos);
}
En chrome la solucin no se ve muy elegante porque la agrupa, pero si indicamos el piso de la torre se ver
mejor.
1
2
3
4
5
6
7
8
9
10
11
12
13
var size = 5;
for (i = 0; i < size; i ++){
asteriscos = "";
for (j = 0; j < size; j++){
asteriscos += "*";
}
console.log(i + " - " + asteriscos);
}
/*
0 - *****
1 - *****
2 - *****
14
15
16
3 - *****
4 - *****
*/
Ups, ahora nuestra torre est invertida, el piso 0 est arriba, podemos invertir el indice restndoselo al tamao.
Este tipo de soluciones cuesta verlos al principio pero despus de mucha prctica ocurren de forma instantnea.
1
2
3
4
5
6
7
8
var size = 5;
for (i = 0; i < size; i ++){
asteriscos = "";
for (j = 0; j < size; j++){
asteriscos += "*";
}
console.log(size - i + " - " + asteriscos);
}
1
2
3
4
5
*
**
***
****
*****
Antes de ponernos a escribir cdigo tenemos que pensar que caracteriza a una pirmide, y es que la base se va
achicando a medida de que crece y se achica en la misma proporcin de lo que crece.
Resolver problemas tiene mucho que ver con encontrar patrones, en este caso el patrn es que la cantidad de
pisos determina la cantidad de asteriscos
1
2
3
* 1
** 2
*** 3
***** 4
pero que pasa si representamos la pirmide de otra forma, piso, cantidad de *, tendramos:
1
2
3
4
* 1,1
** 2,2
*** 3,3
***** 4,4
O sea dentro de los for un nmero est creciendo siempre de uno en uno (el del piso) y el de los lados llega hasta
el piso respectivo, en lugar del tamao del cuadrado.
Para implementar ese cdigo lo nico que tenemos que hacer es limitar el j para que en lugar de llegar hasta size,
llegue hasta i.
1
2
3
4
5
6
7
8
var size = 5;
for (i = 0; i < size; i ++){
asteriscos = "";
for (j = 0; j < i; j++){
asteriscos += "*";
}
console.log(size - i + " - " + asteriscos);
}
1
2
3
***
*
***
si la letra de es de tamao 2
1
2
3
4
*****
*
*
*****
Y si es de tamao 3
1
2
3
4
5
*******
*
*
*
*******
Captulo 7
Funciones
Introduccin a funciones
En el captulo anterior aprendimos a crear un cuadrado de tamao x, o una pirmide de tamaos x, imaginemos
ahora que este proceso lo tuvisemos que hacer muchas veces en nuestro sitio, tendra poco sentido tener que
escribir el cdigo cada vez, ahora imaginemos que descubrimos un error o nos piden cambiar todos los
cuadrados por pirmides en nuestra tendramos que cambiar nuestro cdigo en muchas partes distintas.
En javascript al igual que en muchos otros lenguajes existen las funciones, estas nos permiten nombrar una serie
de pasos y ejecutarlos con un simple llamado, de esta forma evitamos repetir toda ls serie de pasos cada vez que
se quiera ejecutar y nos permite actualizar y/o reparar la funcin en un solo punto.
Las funciones son la herramienta ms bsica para estructurar programas largos, reducir la repeticin, asociar
nombres con subprogramas y poder aislar estos subprogramas unos de otros.
1
2
3
4
5
Luego podemos escribir mostrarCodigos y ver en la consola todos los cdigos cada vez que queramos.
Una funcin tiene un nombre y es creada por una expresin que empieza con la palabra reservada function.
Las funciones reciben una lista de parmetros entre medio de los (), en nuestro caso no recibimos ninguna
funcin pero hablaremos de eso un poco ms adelante.
En javascript el cuerpo de las funciones siempre deben ser envueltos en llaves {} , como en el ejemplo de los
cdigos secretos.
Finalmente las funciones pueden tener un retorno de algn valor particular, pero no es obligatorio.
Nombrando funciones
El nombre de una funcin debe ser compuesto de una sla palabra, como por ejemplo alCuadrado, en lo posible
se debe ocupar el nombre menos errtico y misterioso, el nombre de la funcin puede contener nmeros pero
no puede empezar con uno.
A esta nomenclatura de juntar palabras y la primer letra de cada palabra (despus de la primera) empieza con
maysculas se le denomina lower camel case.
Esto es slo una convencin y puede ser violada, pero como prctica no se recomienda.
Ejemplos de nombres:
1
2
3
4
5
6
7
8
incrementar(); // Correcto
emparejar(); // Correcto
suavizar(); // Correcto
x2(); // Correcto pero no se nos ocurre para que sirve
2x(); // Incorrecto no puede empezar con un nmero
X2(); // est permitido, pero no debera empezar con maysculas
calcularAo(); // Es vlido, los nombres pueden contener tildes y la letra .
Pasando parmetros
Las funciones pueden recibir parmetros, por ejemplo imaginemos que queremos ocupar la misma funcin para
construir una pirmide de tamao 5, o una de tamao 10, no tendra sentido escribir el cdigo para cada tamao,
lo que se hace es parametrizar la funcin.
2
3
4
5
6
7
8
9
10
{
for (i = 0; i < size; i ++){
asteriscos = "";
for (j = 0; j < i; j++){
asteriscos += "*";
}
console.log(size - i + " - " + asteriscos);
}
}
De esta forma cuando llamemos a dibujar pirmide lo podemos hacer del tamao que queramos.
ejemplo:
1
2
drawPiramid(10);
drawPiramid(20);
Una funcin no est limitada a recibir un nico parmetro, perfectamente podra recibir dos o tres, incluso es
posible que sea un nmero indefinido, aunque este nmero nunca puede ser infinito, eso lo veremos ms
adelante.
Cuando se pasa ms de un parmetro el orden de estos determina cual es cual.
Ejemplo:
1
2
Si se llama a la funcin como calcularIMC(1.80, 80) el sistema confundir peso con estatura y los
resultados arrojados probablemente estarn malos.
Por lo mismo debemos ser cuidadosos de no confundir el orden de los parmetros.
Moraleja: El orden de los parmetros importa.
Tarea: Se deja como tarea crear una funcin que dibuje un rectngulo de lados x, e y.
Retorno de funciones
Es importante entender que las funciones pueden devolver valores o simplemente no devolver nada, cuando una
funcin no devuelve nada javascript lo interpreta como undefined.
Por ejemplo nuestra funcin drawPiramid() no devolva valores y por lo mismo cuando uno la llama aparece un
texto en la consola despus del dibujo que dice undefined.
Para devolver un valor se utiliza la instruccin return, cuando se llama la funcin el valor es devuelto y es nuestro
deber capturarlo o si no se pierde.
Ejemplo:
1
2
3
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
interpretarIMC(80, 1.79);
// "sobrepeso"
interpretarIMC(60, 1.79);
// "bajo peso"
interpretarIMC(70, 1.79);
// "ok"
En la definicin de la funcin tambin pudimos observar que estamos llamando a otra funcin, eso es
perfectamente posible, tambin habra sido posible crear dos funciones distintas, de la siguiente forma:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Pero en este caso para interpretar el IMC tendramos que ocupar ambas funciones por separado, de esta forma:
1
2
Cual de las dos formas a utilizar se deja a criterio del lector pero que existe una rama de la informtica
especializada en estudiar como acoplar y desacoplar cdigos y se llama diseo de patrones, el cul es un tema que
abordaremos ms adelante en este libro.
1
2
3
function formaNueva(){
return 'otra forma de declarar funciones';
}
La diferencia entra ambas es sutil y muy tcnica, pero ambas sirven para lo mismo, en ambos casos se crea una
variable en que en el segundo caso es implcito.
1
2
3
4
5
En el ejemplo anterior obtendremos un error ya que la variable y no existe fuera de la funcin llamada
miFuncion()
incluso aunque llamemos a la funcin veremos que todava no existe y
1
2
miFuncion()
console.log(y)
Este comportamiento es el esperado y es bueno porque evita que rompamos una funcin sin querer.
Variables globales
Las variables definidas afuera de una funcin son llamadas globales, pueden ser accedidas y ser modificadas
dentro de una funcin. En el siguiente cdigo de puede ver el ejemplo de ambos conceptos.
1
2
3
4
5
6
7
var x = 1;
var otraFuncion = function(){
x = x + 1;
console.log(x)
}
console.log(x)
En este ejemplo podemos ver que x tiene el valor de 1, y claro no se ha incrementado porque todava no
llamamos a la funcin, pero ese no es el nico detalle, a diferencia del caso anterior ahora vemos que x si existe.
Ahora llamemos a la funcin para ver que pasa:
1
2
3
otraFuncion()
otraFuncion()
console.log(x)
Cada vez que llamamos a otra funcin estamos incrementando el valor de x para todas partes, este es un
comportamiento peligroso, porque en un cdigo grande no sabremos muy bien que cosa est modificando a que
otra.
Es un error de diseo que debemos evitar.
Muy importante
Nunca utilizar variables globales, tarde o temprano se levantarn de sus tumbas y vendrn a
penarnos.
1
2
3
4
5
6
7
8
9
10
11
Funciones annimas
Lleg el momento de confesar una verdad, hasta el momento todas las funciones que hemos estado ocupando
son annimas, lo que sucede es que se las asignamos a una variables, pero no siempre tiene que ser as.
Para entender bien esta situacin ilustremos dos casos, en el primero vamos a crear una funcin annima y
asignarla una variable y luego utilizarla dentro de una funcin, y, en un segundo caso, vamos a pasar directamente
la funcin.
1
2
3
4
5
Un lector bien atento notar que la funcin mostrarAlerta es pasada sin utilizar los parntesis como usualmente
se usa.
La razn se debe a que si los utilizramos as setInterval(mostrarAlerta(), 3000);
estaramos ejecutando la funcin y pasando el resultado (undefined) en lugar de pasarla como una variable.
1
2
3
setInterval(function(){
alert("hola")
}, 3000);
Este tipo de sintaxis es muy utilizada en javascript y la ocuparemos mucho especialmente cuando trabajemos con
arreglos u otras libreras como underscore, lowdash o jQuery, as que volveremos a hablar de este tema pronto
en el libro.
Captulo 8
Arrays
Los arreglos son un tipo de dato que permite contener mltiples datos agrupados en una sola variable, podemos
acceder a estos datos de dos formas:
1. Directamente a travs del ndice.
2. Secuencialmente a travs de un for o while.
1
2
El ndice
En javascript el ndice de un array empieza desde 0, y termina en n - 1, o sea si hay 5 elementos, para acceder al
primero sera arreglo[0] y para acceder al ltimo sera arreglo[4]
1
2
3
4
5
6
7
8
9
10
11
Contenido dinmico
Los arreglos en javascript pueden tener cualquier tipo de objetos, por ejemplo puedo tener en el mismo arreglo
una variable string, un nmero y una funcin.
1
2
3
4
5
6
7
1
2
3
Iteracin
1
2
3
4
5
6
7
Como queremos que nuestros cdigos funciones para cualquier arreglo no debemos fijar arbitrariamente los
lmites del arreglo dentro del for y debemos ocupar la propiedad length.
A el proceso de fijar lmites y valores arbitrariamente dentro de los array se le conoce en la industria como
hardcoding y es una prctica muy mal vista.
1. Push
2. Pop
3. Shift
4. Unshift
5. Concat
6. Slice
Nota al margen: los mtodos son muy similares a las funciones pero le pertenecen a un objeto, por ahora la
principal diferencia que cabe mencionar es que para utilizar el mtodo mencionaremos a la
variable.funcion() en lugar de funcin()
Veremos ms de esto en el captulo de objetos.
1
2
3
4
No existe ningn problema en que un array tenga elementos repetidos, por, sera perfectamente valido agregar
un elemento que ya est en la lista:
1
2
colores.push('rojo')
console.log("colores")
2
3
4
5
6
No es necesario capturar el valor con lo variable ltimo, si slo queremos eliminar el valor del arreglo basta con
colores.pop()
1
2
3
4
5
6
1
2
3
4
1
2
3
4
5
6
7
8
9
10
11
12
13
Slice
Slice permite seleccionar algunos elementos de un arreglo.
array.slice(start,end)
donde start y end son ndices, si no se especfica el final entonces se copiar del principio sealado hasta el final,
ejemplo.
1
2
Splice
Splice permite aadir y remover elementos a un array, el mtodo devuelve los items removidos.
A pesar de ser un mtodo que permite hacer mltiples cosas su principal uso es para remover elementos de un
array.
1
2
3
4
5
6
// Egipto
console.log(paises)
// ["Ghana", "Kenia", "Liberia", "Mal"]
1
2
3
4
1
2
3
4
5
6
7
1
2
3
4
var a = [1,2,3,4];
var b = a;
b[0] = 5;
console.log(a[0]);
Qu crees?, la respuesta es 1 o 5?
La respuesta es 5
Una forma til de imaginarlo es pensar que los arreglos estn en otro lado, y cuando uno los crea lo que est
haciendo es guardar la posicin de donde est, a esta posicin se le llama referencia.
Copiando correctamente
Si queremos copiar los elementos en lugar de simplemente copiar la referencia podemos hacerlo con el mtodo
slice que vimos anteriormente.
1
2
3
4
var a = [1,2,3,4];
var b = a.slice(0);
b[0] = 5;
console.log(a[0]);
Qu crees?, la respuesta es 1 o 5?
La respuesta es 1
Mutablidad
Se dice que un mtodo es mutable si modifica al elemento original, por regla general de diseo es bueno que los
objetos sean inmutables para evitar cambiarlos por error, pero a veces eso puede afectar fuertemente la velocidad
de ejecucin de un programa o a veces simplemente no tiene sentido que sea inmutable.
revisemos
1. push: mutable
2. pop: mutable
3. shift: mutable
4. unshift: mutable
5. concat: mutable
6. slice: inmutable
slice no modifica el arreglo original, devuelve un arreglo nuevo con la seleccin, por lo mismo es inmutable.
Se dice que una estructura de datos es inmutable cuando ninguno de los mtodos que tiene la modifica
directamente, en javascript los array son mutables.
forEach(mtodo)
Esta mtodo es muy til cuando tenemos un arreglo y necesitamos hacer algo con cada elemento de este
arreglo. Por ejemplo, si tenemos un arreglo con el nombre de nuestros amigos y queremos saludar a cada uno de
ellos con for se vera de la siguiente manera:
1
2
3
4
5
6
7
8
El ejemplo anterior hace la funcionalidad esperada, sin embargo, tiene algunos problemas. Veremos cuales son
estos con un ejemplo, ahora necesito saludar a primos y a mascotas.
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
Empec a copiar y pegar cdigo, pero no fui lo suficientemente cuidadoso! En el ltimo for quera saludar a
las mascotas pero se me olvid reemplazar primos por mascotas, y adems como mascotas tiene ms elementos
que primos apareci un error en la consola. Veamos cmo queda esto implementado con forEach.
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Como pueden ver, al repetir el cdigo ya no se necesito preocupase por estar recorriendo el array correcto,
forEach se encarga de hacer ese trabajo por nosotros.
Son menos variables y por lo tanto menos preocupaciones para el desarrollador. Pero a ningn desarrollador le
gusta repetir cdigo y si quiero cambiar la forma de saludar, necesito cambiar el cdigo en varios lugares. Eso
significa tener ms preocupaciones y mayores probabilidades de equivocarse. Esto lo puedo solucionar de la
siguiente manera, creando el mtodo saludar.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
El cdigo amigos.forEach(saludar), se puede leer de la siguiente manera: para cada elemento del arreglo amigos
aplicar el mtodo saludar. Muchos desarrolladores prefieren esta manera en vez de for ya que, entre otras
razones, es mucho ms explcito a lo que se quiere llegar a realizar.
Por ltimo, como se dijo anteriormente, el mtodo forEach no est en todos los navegadores, y la
implementacin con Underscore quedara de la siguiente manera:
1
2
3
4
5
6
7
8
9
10
11
// Original
amigos.forEach(saludar);
// -> 'Hola Pedro'
// -> 'Hola Juan'
// -> 'Hola Diego'
// Underscore o Lodash
_.forEach(amigos,saludar);
// -> 'Hola Pedro'
// -> 'Hola Juan'
// -> 'Hola Diego'
map(funcin)
Imaginemos que ahora en vez de saludar en consola a cada elemento del arreglo amigos, queremos guardar el
saludo para cada uno de los elementos en un arreglo nuevo. Con los mtodos forEach y push quedara
implementado de la siguiente manera:
2
3
4
5
6
Esto funciona correctamente, pero si quiero replicar la funcionalidad con mascotas o primos, necesito replicar
todo el cdigo como se ve en el siguiente ejemplo.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Para estos casos, cuando necesito crear un nuevo arreglo en base a uno existente, existe un mtodo creado
especialmente para ello. Se llama map y est implementado en la mayora de los lenguajes modernos. Este
mtodo toma como base un array inicial, a cada uno de los elementos le aplica una funcin y guarda el resultado
en un arreglo nuevo. Es importante entender que map no modifica el array inicial, lo que hace es crear uno
nuevo. Veamos un ejemplo:
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
11
De esta manera queda implementada la funcionalidad esperada de una forma muy concisa, que fue crear un
nuevo array a partir de otro modificando cada elemento de este. Para finalizar mostraremos cmo se implementa
map con Underscore.
1
2
3
4
5
// Original
var saludosAmigos = amigos.map(crearSaludo);
// Underscore o Lodash
var saludosAmigos = _.map(amigos,crearSaludo);
filter(funcin)
Cuando se trabaja con arrays, muchas veces es necesario filtrar los valores, para eso existe el mtodo filter. Filter
devuelve un nuevo arreglo con los elementos filtrados, y para saber que filtrar necesita una funcin que retorna
true si queremos mantener ese elemento en particular. Esto se puede saber en el siguiente ejemplo en vamos a
filtrar los nmeros menores a 10.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Los mtodos map y filter devuelven arrays, sin embargo, a veces es necesario convertir un array en un solo
valor, por ejemplo sumar todos los elementos de un array. Para eso existe el mtodo reduce.
La funcin en este caso tiene dos parmetros, valorAnterior y valorActual. Se puede pensar que el valorAnterior
es el valor acumulado y valorActual es el valor actual del elemento. Veremos un ejemplo sumando todos los
elementos de un array.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Este tiene de manera opcional el valor inicial, en este caso Javascript asumi que el valor inicial de la suma es 0 y
el valor inicial de la multiplicacin es 1. Para evitar errores es aconsejable definir de manera implcita el valor
inicial, como lo veremos a continuacin.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
};
var resultado = numeros
.filter(menor10)
.map(mult2)
.reduce(sumar,0);
console.log(resultado);
// -> 30
//Con Underscore o Lodash
var resultado = _.filter(numeros,menor10)
.map(mult2)
.reduce(sumar,0);
Estos mtodos tiene mayor relevancia al tener arrays de objetos, que sern visto ms adelante.
Por ltimo, es altamente recomendable utilizar las libreras Underscore o Lodash para evitar problemas de
compatibilidad. Ambas libreras adems tienen ms mtodos disponibles en su documentacin.
http://underscorejs.org/ https://lodash.com/
Funciones Avanzadas
Funciones autoejecutables
El trmino en ingls es self invoked function, la traduccin al espaol podra ser funciones auto llamadas o
autoejecutables y son funciones que se ejecutan inmediatamente en el momento en que se definen.
1
2
3
(function () {
alert("hola, soy una funcin que no necesita ser llamada");
})();
La diferencia en la sintaxis es el doble conjunto de parntesis, como nemotecnia para recordarlas este es un buen
truco:
(funcion (){})(autollamado)
Las funciones autoejecutables son muy tiles para crear closures y definir objetos bajo el patrn mdulo, ambas
tcnicas las estudiaremos a continuacin.
Closures
Las variables globales son un peligro, por lo mismo uno busca encapsular las variables peligrosas, en javascript
eso se puede hacer a travs de un closure.
Vamos a ver un ejemplo prctico de esto.
Digamos que queremos generar un clicker virtual, estos son unos dispositivos fsicos que cada vez que uno les
presiona un botn aumentan en uno.
Eso lo podramos resolver con este simple cdigo.
1
2
3
4
var i = 0;
var click = function(){
i = i + 1
}
El problema de hacerlo de esta forma es que en otra parte del cdigo yo podra reescribir la variable i por error,
por ejemplo dentro de un for, una solucin sera ocupar un nombre ms complejo, pero un proyecto grande
podra tener miles de lneas de cdigo y no queremos dejar las cosas a la suerte.
Para ilustrarlo mejor veamos un ejemplo de este problema con cdigo.
1
2
3
4
5
6
7
8
9
10
11
12
console.log(i)
click();
console.log(i)
click();
console.log(i)
// i = 0
// i = 1
// i = 2
Para evitar este tipo de error se encapsulan las variables peligrosas en un closure que devuelve una nueva
funcin.
1
2
3
4
5
6
7
8
9
10
11
12
13
En el ejemplo anterior la variable contador qued encapsulada dentro de la funcin click. Esta variable no puede
ser accedida desde fuera, solo desde dentro o de una funcin definida dentro, entonces lo que hacemos es
aprovechar nuestra funcin para que devuelva una nueva funcin que modifique el valor.
Dejando de lado las definiciones formales, se puede decir que closure es la capacidad de poder guardar datos
dentro de una funcin para que estos puedan ser utilizados en el futuro.
1
2
3
4
5
6
7
8
9
10
11
De esta forma click se ejecuta automticamente, parte en cero y cada vez que es llamado aumenta el contador en
uno.
Captulo 9
Objetos
En javascript existe un super tipo de variable llamado objeto, estos nos ayudarn a crear todos los tipos de datos
que necesitemos.
Los objetos se parecen mucho a los arrays, pero se definen con llaves.
objeto = {}
A diferencia de los arrays los objetos no tienen un ndice numrico, tienen uno con nombre, pero ese nombre no
es automtico, hay que agregarlo de la siguiente forma:
Creando objetos
Hay dos formas de crear objetos, la primera es a travs de los {} como vimos previamente, la segunda es
utilizando el operador new.
1
2
mueble['altura'] = "2";
1
2
3
4
5
6
7
8
9
10
11
12
13
// Objeto 1
var motor700 = {cilindrada: 700, tiempos: 4};
// Objeto 2 que contiene al objeto 1
var motocicleta = {
marca:'Ducati',
motor:motor700,
acelerar: function(){
console.log('Acelerar a fondo');
}};
motocicleta.acelerar();
// -> 'Acelerar a fondo'
Cuando un objeto tiene una funcin a esta funcin se le denomina mtodo, cuando tiene una variable se le
denomina propiedad
delete motocicleta.marca;
1
2
3
4
5
El operador this
Es posible dentro de un objeto obtener el valor de una de sus propiedades utilizando el operador this, por
ejemplo en el caso de la motocicleta, el mtodo acelerar podra mostrar su marca gracias al operador como se
muestra en el siguiente ejemplo.
1
2
3
4
5
var motocicleta = {
marca:'Ducati',
acelerar: function(){
console.log( this.marca + ' Acelerando a fondo');
}};
probemos que esta afirmacin es cierta. creemos dos variables y luego busqumoslas dentro del objeto window.
1
2
3
4
var a = 6
var ab = 5
var ab = 6
console.log(this)
Como podemos en la imagen las variables son todas propiedades del objeto window.
1
2
vaca = {moo:'moo'}
console.log(this)
En este caso veremos que la propiedad de vaca moo no est registrada dentro de window si no que est
registrada dentro de la vaca misma. Como regla de buena costumbre debemos evitar sobrecargar el objeto
window de propiedades, en lo posible solo deberamos agregar un par de objetos bsicos necesarios.
1
2
3
4
Ahora que ya sabemos que son los objetos podemos definir mejor que es la mutabilidad, y es que las propiedades
puedan ser cambiadas por el resultado de una operacin o del llamado de un mtodo.
Copiando un objeto
Javascript no soporta copia de objetos directamente, al asignar un objeto a otro estamos copiando la referencia y
no el objeto.
Utilizando el siguiente truco podemos copiarlo:
1
2
3
4
5
6
7
8
9
10
var bob = {
name: "Bob",
age: 32
};
var bill = (JSON.parse(JSON.stringify(bob)));
bill.name = "Bill";
console.log(bob);
console.log(bill);
1
2
3
var mascotas = [
{ nombre: 'Bobby', tipo: 'perro', edad: 12 },
{ nombre: 'Pinky', tipo: 'gato', edad: 14 },
4
5
6
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
11
12
13
Preguntas
1. Qu significa que un objeto sea mutable?
2. Cul es la diferencia entre map, reduce y filter?
3. Dentro de un objeto a que hace referencia this?
1
2
3
4
5
6
7
function generarIndice(){
var contador = 0;
return function(){
contador = contador + 1;
return contador;
};
};
Un gran problema de este ndice es que no puedo saber cual es el ltimo valor generado, si llamo a esta funcin
voy a aumentar este contador. Sin embargo, puedo modificar esta funcin para que retorne un objeto en vez de
una funcin.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function generarIndice(){
var contador = 0;
var obtIndice = function(){
contador = contador + 1;
return contador;
};
var ultIndice = function(){
return contador;
};
return {obtenerIndice: obtIndice, ultimoIndice:ultIndice};
}
16
17
18
19
20
21
22
23
24
De esta manera puedo obtener el ltimo valor sin tener que modificar el contador y este queda totalmente
protegido.
Por ltimo, en javascript al existir variables globales es preferible nombrar variables lo mnimo posible, de manera
de no entrar en conflicto con otros cdigos. Es por esto que se sugiere en este caso crearlo con funcin
annima, con lo anterior nuestro cdigo quedara de la siguiente manera:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Captulo 10
Prototipos
Todos los objetos en javascript descienden del objeto Object, por lo tanto todos los objetos heredan las
propiedades de Object.prototype. Esto quiere decir que cada vez que se crea un objeto, estos tendrn
automticamente todas las funcionalidades del prototipo de Object.
Con la propiedad prototype se pueden crear o sobreescribir sus propiedades en cualquier momento. El mtodo
toString() pertenece al prototipo Object y permite convertir cualquier objeto en un string, como se puede inferir
de su nombre.
Vamos a ver cmo se pueden sobrescribir los mtodos de un prototipo en javascript, incluso del objeto base
Object.
1
2
3
4
5
6
7
8
9
10
11
Ahora revisemos ejemplos ms seguros, voy a crear el objeto Persona y le voy a agregar mtodos a su
propiedad prototype. Como revisamos antes para acceder propiedades de un mismo objeto hay que ocupar this.
Para crear este objeto lo voy a construir con una funcin.
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
// funcin constructora
function Persona(nombre){
this.nombre = nombre;
}
//Voy a agregar un mtodo al prototipo Persona
Persona.prototype.saludar = function(){
return 'Hola, mi nombre es ' + this.nombre;
};
//Creo una nueva instancia de Persona con new
var pancho = new Persona('Pancho');
console.log(pancho.saludar());
// -> 'Hola, mi nombre es Pancho'
Ahora voy a crear al objeto Hombre que llama al constructor de Persona
//Creo un nuevo objeto Hombre que llama
// al constructor de Persona
function Hombre(nombre){
Persona.call(this,nombre);
this.sexo = "Hombre";
}
var juan = new Hombre('Juan');
console.log(juan.nombre);
// -> 'Juan'
console.log(juan.sexo);
// -> 'Hombre'
console.log(juan.saludar());
// -> undefined is not a function
Recibimos este error porque el objeto Hombre slo llam al constructor Persona, para que herede los mtodos
se su prototipo es necesario hacerlo explcitamente.
Captulo 11
Javascript y HTML
Para esta seccin del curso ser empezar a trabajar con el editor de texto puesto que no solo tendremos que
escribir cdigo javascript, adems tendremos que escribir cdigo HTML.
Nuestro index.html
1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title></title>
<link rel="stylesheet" href="">
</head>
<body>
<script src="js/main.js"></script>
</body>
</html>
1
2
GET file:///Users/gonzalosanchez/proyectos/librojs/
js/main.js net::ERR_FILE_NOT_FOUND
entonces significa que no hemos creado el archivo main.js o que no lo pusimos dentro de la carpeta js.
Manipulando el DOM
Cmo se llamaba el objeto maestro de una pgina web?, si contestaste Window ests en lo correcto. Este objeto
tiene una interesante propiedad dentro llamada document, este contiene el documento completo de la pgina
web y claro si es parte de las propiedades de un objeto de javascript lo podemos modificar.
document
Vamos a agregar un div vaco a nuestra pgina web
1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title></title>
<link rel="stylesheet" href="">
</head>
<body>
<div id="modificable"> Contenido ... </div>
<script src="js/main.js"></script>
</body>
</html>
document.getElementById("modificable")
console.log(document.getElementById("modificable"))
Si el elemento existe obtendremos el tag si no obtendremos null, si tienes el elemento dentro del html pero an
as obtienes null hay un par de posibles causa, la primera es que no hayas guardado el cdigo y luego que no
hayas recargado la pgina pero la tercera es la ms interesante, que hayas cargado el script despus de la etiqueta.
Que es el DOM?
DOM es el acrnimo de Document Object Model, no es une el HTML pero tiene mucho que ver con el. El
DOM es la interfaz de acceso para crear HTML vlido, permite agregar, modificar y borrar contenido.
En DOM todo es un nodo, el documento, todos los atributos html, todos los elementos de html, etc, El objeto
documento que vimos previamente es el nodo raz, pero slo se convierte en el nodo raz una vez que el
documento est cargado.
El orden importa
Es por eso que los scripts que modifican el DOM deben ser cargado al final, porque los nodos para poder
referenciarlos, aadirle atributos, modificarlos, o borrarlos primero necesitan estar cargados.
Lo anterior implica que si la instruccin document.getElementById("modificable") se alcanza antes de que se
defina
entonces obtendremos null, la solucin para evitar este tipo de errores es ser consciente de en que momentos
estamos buscadondo y modificando el DOM y que definitivamente no podemos hacerlo antes de definirlo.
Modificando el DOM
Ya sabemos como recuperar etiquetas del DOM ocupando javascript, ahora aprenderemos como modificar estos
elementos y eso lo podemos utilizar cambiando la propiedad innerHTML
1
2
div_modificable = document.getElementById("modificable");
div_modificable.innerHTML = "nuevo contenido";
1
2
div_modificable.style.color = "red";
div_modificable.style.fontSize = "40px";
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title></title>
<link rel="stylesheet" href="">
</head>
<body>
<p class="parrafo parrfo1"> Contenido1 </p>
<p class="parrafo parrfo1"> Contenido2 </p>
<p class="parrafo parrfo1"> Contenido3 </p>
<p class="parrafo parrfo1"> Contenido4 </p>
<script src="js/main.js"></script>
</body>
</html>
1
2
3
4
o podemos hacerlo con forEach, (recordar que no funciona en todos los navegadores)
1
2
3
parrafos.forEach(function(parrafo){
parrafo.innerHTML = "Super Contenido " + i;
})
Eventos en Javascript
En javascript es posible registrar eventos, cuando la condicin del evento se cumple el cdigo javascript es
ejecutado, por ejemplo podemos hacer que un div que dispare una alerta al ser clickeado.
Click
Para eso utilizaremos un estilo para darle ancho y alto a los divs
1
2
3
4
5
6
7
8
.caja
{
width:50px;
height:50px;
margin:5px;
background-color: blue;
float:left;
}
1
2
3
4
5
<div
<div
<div
<div
<div
class="caja"
class="caja"
class="caja"
class="caja"
class="caja"
onclick="alert('caja
onclick="alert('caja
onclick="alert('caja
onclick="alert('caja
onclick="alert('caja
1')"></div>
2')"></div>
3')"></div>
4')"></div>
5')"></div>
De esta forma al recargar el sitio y al hacerle click a la primera caja veremos algo como:
Desafo
Ahora intenta cambiar el color de una caja al hacerle click.
1
2
3
4
5
Sin embargo a pesar de que funciona, requiere copiar y pegar mucho cdigo, y la repeticin junto con el copiado
y pegado son los padres de los errores en la construccin de software.
Qu pasara si ahora queremos que el color de las cajas se cambie a amarillo, o a un rojo menos rojo?
(comentario dicho por un cliente en una ocasin)
Versin 2.0
Para evitar caer en este tipo de situaciones podemos crear una funcin, y que esta transforme a la caja respectiva
1
2
3
4
5
<div
<div
<div
<div
<div
class="caja"
class="caja"
class="caja"
class="caja"
class="caja"
id="caja-1"
id="caja-2"
id="caja-3"
id="caja-4"
id="caja-5"
onclick="pintarRojo(1)"></div>
onclick="pintarRojo(2)"></div>
onclick="pintarRojo(3)"></div>
onclick="pintarRojo(4)"></div>
onclick="pintarRojo(5)"></div>
1
2
3
Esta solucin es bastante mejor si queremos luego cambiar el color o el comportamiento despus de un click
pero todava es innecesariamente complicada, requiere del id de la caja y concatenar el parmetro pasado dentro
de la funcin.
Existe una mejor forma de pasar el contenido a la funcin y es con el operador this.
Versin 3.0
Dentro del onclick el operador this es el mismo div, (ya no es window, hay un contexto y ese contexto es la
respectiva marca), y podemos ocupar este operador para pasarle el div a la funcin en lugar de tener que buscarlo
de nuevo con getElementById.
La solucin en el index sera la siguiente:
1
2
3
<div
<div
<div
<div
class="caja"
class="caja"
class="caja"
class="caja"
onclick="pintarRojo(this)"></div>
onclick="pintarRojo(this)"></div>
onclick="pintarRojo(this)"></div>
onclick="pintarRojo(this)"></div>
4
5
y en el archivo main.js
1
2
3
versin 4.0
Todava podemos mejorar la solucin aprendiendo un truco nuevo, el mtodo onclick tambin lo podemos
modificar y/o crear desde javascript manipulando directamente el DOM.
De la misma forma que anteriormente obtuvimos todos los prrafos de clase prrafo, este vez obtendremos
todas la cajas de clase caja y sobre cada una de ellas agregaremos el mtodo onclick.
1
2
3
4
5
6
1
2
3
4
5
<div
<div
<div
<div
<div
class="caja"></div>
class="caja"></div>
class="caja"></div>
class="caja"></div>
class="caja"></div>
A este buena prctica se le llama programar de forma no obstrusiva, o sea no combinar javascript con el HTML
y ayuda a limpiar.
Un dato interesante, podemos revisar los eventos que un elemento tiene registrado haciendo con el inspector de
elementos en el tab de elements y a la derecha en Event Listeners
new Date();
adems el constructor puede ser llamado con otros parmetros obteniendo distintos resultados.
Fecha actual ms la cantidad de milisegundo especificada en number.
new Date(number);
O con un string.
y con un objeto del tipo date tambin podemos mostrar la hora, minutos y segundos.
1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title></title>
<link rel="stylesheet" href="">
</head>
<body>
<div id="time"> </div>
<script src="main.js"></script>
</body>
</html>
Y luego escribimos el javascript, lo primero que necesitamos es obtener y guardar la fecha, luego cada segundo
obtenemos el tiempo nuevamente y cambiamos el HTML.
1
2
3
4
5
6
7
8
Esto nos mostrar los resultados en milisegundos, pero podemos mostrarla en segundos diviendo por mil y
1
2
3
4
5
6
7
8
Para construir la cuenta regresiva vamos a ocupar parse que devuelve la cantidad de milisegundos que han
pasado desde el primero de enero de 1970, (fecha conocida como Unix Time)
Si queremos un contador de 5 minutos, lo que haremos ser obtener la fecha de ese momento y luego restaremos
de 1 segundo en un segundo. Si un minuto tiene 60 segundos, 5 minutos tienes 3000 segundos y como el
parmetro es en milisegundos, tendremos que agregar 000 ms.
1
2
3
time_left = 3000000
d = new Date(3000000);
time_left = getTime()
1
2
3
4
5
6
7
8
9
10
Nos quedan algunas mejoras aplicables, la primera es evitar que el tiempo sea negativo para eso basta con un if
mayor que cero, pero la segunda es ms interesante, vamos a hacer que en lugar de mostrarnos los segundos
restantes nos muestre los minutos y segundos restantes.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
La funcin setIntreval ahora empieza calculando el tiempo restante, si ese tiempo es mayor que cero, entonces se
calculan los minutos restantes, como un minuto tiene 60 segundos entonces simplemente dividimos por 60, los
segundos son lo que resta de la divisin, para eso existe el mdulo. y finalmente unimos todo en un string para
mostrarlo en pantalla. I Se deja de tarea hacer un cuenta hacia atrs en das, horas minutos y segundos.
Ventanas modales
En esta seccin vamos a construir una ventana modal bsica, a pesar de que es muy sencillo implementarlas con
Bootstrap u otros frameworks de diseo, la idea es aprender a crearlas ocupando nicamente javascript.
Sin diseo una ventana modal se ve as, la caja (modal) abierto est por sobre el texto.
Para hacer una ventana modal necesitamos un HTML con el div modal y un link para abrirlo.
El HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title></title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<a href="#" id="modal-trigger"> Abrir modal </a>
<div id="modal-lorem" class="modal">
<a href="#" id="modal-close-trigger">X</a>
Aprendiendo a hacer ventanas modales con
javascript.
</div>
<script src="js/main.js"></script>
18
19
20
</body>
</html>
Desde el CSS lo importante es tener dos clases, una para esconder la ventana modal y otra para mostrarla.
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
.modal{
width:400px;
height:300px;
margin:auto;
top:50px;
left: auto;
position: fixed;
background-color: white;
border:solid 1px black;
display:none;
padding:20px;
}
.modal-show{
transition-timing-function: linear;
transition-delay: 1s;
display: inline;
}
.modal a{
border:solid 1px;
padding:5px;
float:right;
}
y del javascript necesitamos generar dos eventos onclick uno para abrir la ventana modal y otra para cerrarla.
1
2
3
4
5
6
7
8
9
10
11
}
closeTrigger.onclick = function(){
modal.classList.remove("modal-show");
}
Onchange
Es posible adems utilizar el evento onchange, este se gatilla cuando se genera un cambio sobre un elemento de
HTML, por ejemplo si alguien escribe en un input, o selecciona un opcin en un combo box.
Para ser exactos el evento onchange no se realiza tras cada cambio si no cuando el elemento pierde el foco.
Vamos a empezar con un ejemplo sencillo, un input con un valor por defecto que al cargar la pgina muestre el
mismo valor en la consola.
HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title></title>
<link rel="stylesheet" href="">
</head>
<body>
<input id="prueba" value="hola">
<script src="main.js"></script>
</body>
</html>
Javascript (main.js)
1
2
Ahora es donde vamos a registrar el evento, vamos a generar una funcin que permita que cada vez que se
cambie el input muestre en la consola el nuevo valor.
Gracias a onchange podemos agregar una escucha en el input.
1
2
Ahora cada vez que escribamos algo y le quitemos el foco al input, (por ejemplo haciendo click en el resto de la
ventana) veremos un mensaje que diga hey.
Podemos mostrar el valor del input ocupando this.value (donde this) es el input y value lo que se ha escrito.
oninput
Pero como podemos hacer para que nos avise cada cambio?
No podemos con onchange, pero existe otro evento que nos puede ayudar. oninput.
Probemos el mismo ejemplo anterior pero cambiando el evento.
1
2
De esta forma podremos ver en el navegador que cada vez que ingresamos un caracter se ejecuta el evento.
1
2
3
4
<select id="select1">
<option value="1"> Opcin 1 </option>
<option value="2"> Opcin 2 </option>
</select>
Cuando se escoge una de las opciones y se enva el formulario lo que se enva no es el texto que dice opcin, se
enva el value.
Para capturar el valor del select cuando este cambie debemos obtener el input de la etiqueta select
1
2
3
4
5
input = document.getElementById("select1")
input.onchange = function(){
var options = this.options
console.log(options[this.selectedIndex])
}
y listo, este script nos permitir mostrar los resultados cada vez que el usuario selecciona una opcin.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title></title>
<link rel="stylesheet" href="">
</head>
<body>
<input id="new_option" value="" placeholder="Escribe una opcin"
<select id="options">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
<script src="main.js"></script>
</body>
</html>
y crearemos un script que permita agregar una opcin en el momento de que se termine de escribir.
1
2
3
4
5
6
7
8
En este caso onchange crea un etiqueta html option nueva, agrega el texto basado en el input y luego agrega la
opcin dentro del select.
Para qu nos podra servir esto?, un ejemplo comn el de dos select donde las opciones uno dependen de la
seleccin del primero.
Doble select
Este caso es ligeramente ms complejo que los anteriores, primero desde el html necesitamos dos select y
dependiendo del input del primero tendremos los resultados del segundo, esa parte requiere javascript.
El HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title></title>
<link rel="stylesheet" href="">
</head>
<body>
<select id="select1">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
16
17
18
19
20
21
<select id="select2">
</select>
<script src="main.js"></script>
</body>
</html>
El javascript
En este caso ordenaremos el cdigo en tres funciones principales, la primera ser para borrar las opciones de un
select, podramos hacerlo especfico para el segundo select, pero es mejor programar las cosas bien una vez y
despus poder reutilizarlas.
1
2
3
4
5
6
El segundo mtodo que necesitamos es uno para aadirle opciones a un select, este recibir dos parmetros, el
select al cual le agregaremos las opciones y un array con opciones que sern las agregadas.
1
2
3
4
5
6
7
La tercera parte es la que ya es especfica a nuestro problema, primero crearemos un objeto con todas las
dependencias, de esa forma si el usuario escoge uno, le preguntamos al objeto por 1 y nos devuelve un array con
los valores que hay que ingresar en el segundo select.
1
2
3
4
5
6
7
8
9
10
11
12
finalmente utilizando onchange detectaremos un cambio en el primer select, con eso tomaremos el valor
escogido, lo buscaremos en el array, borraremos las opciones del segundo select y agregaremos las nuevas.
El evento load
Load es un evento que se gatilla cuando el HTML est listo para ser presentado.
Para probarlo cargaremos una imagen pesada de internet.
1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link rel="stylesheet" href="">
<img id="imagen1" src="http://www.keenthemes.com/preview/metronic/theme/asse
</head>
<body>
<script src="js/main.js"> </script>
</body>
</html>
y crearemos un javascript que nos muestre una alerta cuando la imagen se termine de cargar.
1
2
3
4
load tambin se puede usar directamente sobre el objeto window, en ese caso se gatillara cuando todo el HTML
est completamente cargado dentro del sitio.
window.onload = function(){
console.log("Todo el sitio cargado");
}
1
2
3
Este tipo de eventos son particularmente tiles a la hora de rediagramar contenido de la pgina, por ejemplo
queremos hacer una galera de fotos y la posicin de algunas fotos depende de otras, en ese caso necesitaramos
que todo el contenido est cargado.
Bubbling
Es el efecto de que los eventos flotan como burbujas hacia la etiqueta superior dentro de las etiquetas anidadas.
Miremos un ejemplo para entender porque debemos manejarlo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title></title>
<link rel="stylesheet" href="">
</head>
<body>
<div onclick="alert('soy un div')" style="border:solid 1px black
<p onclick="alert('soy un prrafo')" style="border:solid 1px orange
</div>
</body>
</html>
Si hacemos click dentro del prrafo no activaremos un evento, en su lugar activaremos dos.
Entonces si necesitamos activar algo especfico para uno de los elementos, cmo podemos hacerlo?
Target
Target al rescate, target es una propiedad del evento que identifica quien fue el gatillador, pero para eso primero
necesitamos capturar el evento.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title></title>
<link rel="stylesheet" href="">
</head>
<body>
<div style="border:solid 1px black"> soy el div
<p style="border:solid 1px orange"> soy el parrafo </p>
</div>
</body>
</html>
Captulo 14
Ajax
Ajax permite comunicarse asncronamente con servidores, eso tiene la ventaja que podemos cargar datos nuevos
sin tener que recargar la pgina, ademas nos permite capturar datos de otros sitios.
Ajax es una acrnimo que significa Asynchronous JavaScript and XML.
Para nuestro primer ejemplo vamos a consultar la API de wheather.
Recomiendo visitar el sitio http://openweathermap.org/current para tener una buena idea de lo que vamos a
hacer.
API es un acrnimo de Access Protocol Interface, en trminos prcticos una pgina web para programas en
lugar de para seres humanos. Existen muchas APIs online, la mayora de los servicios grandes tienen sus APIs
como son los casos de Youtube, Facebook y Twitter.
En esta ocasin vamos a ocupar la api de openweahtermap para probar nuestro primer llamado ajax. para
lograrlo llamaremos a api.openweathermap.org/data/2.5/weather?q={city name}
Un script que se conecte con la pgina y muestre los resultados sera de la siguiente forma:
1
2
3
4
5
6
7
8
9
10
11
1. Instanciamos un objeto del tipo XMLHttpRequest para poder realizar una conexi
2
3
4
5
2.
3.
4.
5.
Como se ve en el inspector bajo el tab network vemos que la pgina que el mtodo dice GET.
Pero no es el nico mtodo, tambin existen otros, el segundo ms famoso es POST, este se ocupa cuando
queremos enviar formularios y que no se vea los parmetros enviados en la URL.
Otros conocidos son PUT, PATCH y DELETE.
Javascript asncrono.
En el mismo punto anterior especificamos que abrimos la pgina por GET, le pasamos la direccin y el tercer
parmetros es para que la conexin sea asncrona.
Qu significa que sea asncrona? Significa que no se espera la respuesta, el llamado no bloquea las siguientes
lneas de cdigo y cuando se obtiene una respuesta, que puede ser en 1 segundo o 1 minuto entonces se procesa
la siguiente seccin, pero el cdigo no queda bloqueado esperando una respuesta.
1
2
3
4
5
6
7
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
console.log(xmlhttp.responseText);
}
}
Las lneas anteriores son el cdigo que se ejecuta cuando se devuelve el resultado, readyState == 4 significa que
ha sido completamente cargado, y status == 200 implica que el servidor al que llamamos envi correctamente
los resultados.
STATUS
El servidor siempre contesta con un status, son mltiples los status posible, los ms comunes son 200, 404 y 500
200: significa que la operacin trmino correctamente, algunas variantes como el 201, 202 implican que algo fue
creado o aceptado, pero todos los del rango 2xx implican xito en la operacin.
3xx: implica redireccin.
4xx: implica error de parte del cliente, en este caso el cliente es nuestro programa en javascript y significara que
el error lo estamos cometiendo nosotros. Algunas variates son 400 que el request est mal hecho, 401 que
necesitamos autenticarnos primero, 403 que el recurso est prohibido, 404 que el recurso no existe.
5xx: En el rango de los 500 significa que el servidor fall en algn punto de la operacin y por eso mismo no
est devolviendo resultados. No es mucho lo que podamos hacer cuando nos enfrentemos a un 500 ms que
mandar un email reportando el error.
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
{
"coord": {
"lon": -70.65,
"lat": -33.46
},
"weather": [
{
"id": 501,
"main": "Rain",
"description": "moderate rain",
"icon": "10n"
}
],
"base": "cmc stations",
"main": {
"temp": 284.15,
"pressure": 1011,
"humidity": 81,
"temp_min": 284.15,
"temp_max": 284.15
},
"wind": {
"speed": 7.2,
"deg": 350
},
"clouds": {
"all": 90
},
"dt": 1438819200,
"sys": {
"type": 1,
"id": 4645,
"message": 0.011,
"country": "CL",
"sunrise": 1438860601,
"sunset": 1438898840
},
"id": 3871336,
"name": "Santiago",
"cod": 200
}
El objeto devuelto es un String, lo que nos hara difcil rescatar algn campo especfico, pero podemos
convertirlo en un objeto utilizando JSON.parse(), el siguiente ejemplo muestra como realizar el parseo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Qu es JSON?
JSON es acrnimo de Javascript Object Notation, y consiste en un formato para intercambio de datos entre
distintas plataformas, en cierto sentido es similar a XML pero mucho ms simple.
No hay que dejarse engaar por el nombre, JSON permite intercambiar objetos como si fueran string entre
distintas plataformas que ocupan distintos lenguajes de programacin, en este caso nuestro cdigo est en
javascript y no necesitamos saber en que lenguaje est hecho el proyecto en la plataforma, slo tenemos que
saber la URL, el mtodo (GET/POST/) y si tenemos que enviar un objeto cul es el formato, (en nuestro
caso solo recibimos).
Se deja como tarea para el lector obtener del mismo JSON la temperatura actual, mnima y mxima adems del
clima de su ciudad.
HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
</head>
<body>
<div id="weather"> </div>
<select type="select" id="city">
<option selected value="Santiago">Santiago</option>
<option value="New York">New York</option>
<option value="Londres">Londres</option>
</select>
<script src="js/main.js"></script>
</body>
</html>
Javascript
En esta ocasin el cdigo se vuelve ligeramente ms complejo porque tenemos que hacer llamados AJAX en
base a la seleccin de una opcin del select, y adems hacer el llamado ajax cuando se carga la pgina, la mejor
forma de ordenar esto es con dos funciones en lugar de una.
La primera funcin se encargar de observar los cambios del select y cuando vea que hay uno llamar a la
segunda funcin, que su nico propsito es llamar a la api de OpenWeather y mostrar los resultados.
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
xmlhttp.send();
xmlhttp.onreadystatechange = function()
{
if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
{
string_results = xmlhttp.responseText;
json = JSON.parse(string_results)
console.log(json)
document.getElementById("weather").innerHTML=json.weather
}
}
}
var city_select = document.getElementById("city")
city_select.onchange = optionWatcher
getWeather("Santiago")
En la ltima seccin del cdigo agregamos el observador de cambios y llamamos a getWeather en la ciudad por
defecto.
Captulo 15
Jquery
Jquery es una biblioteca (tambin conocidas como libreras) con la filosofa de escribir menos, hacer ms. Esta
biblioteca permite manejar de forma sencilla la captura de elementos del DOM, la manipulacin de estos y los
llamados AJAX.
Existen dos versiones de Jquery, las 1.x, y las 2.x son compatibles entre ellas, la principal diferencia es que las 2.x
no son compatibles con versiones de Internet Explorer menores a la versin 9, pero la versin 2 tiene la ventaja
de pesar un 12% menos que la 1.x
Para empezar a trabajar con Jquery podemos descargar la biblioteca de la http://jquery.com/download/ o
podemos utilizar uno de los CDN existentes de la siguiente forma:
<script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
Nuestro nuevo HTML.
1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link rel="stylesheet" href="">
</head>
<body>
<div id="main"> </div>
<script src="https://code.jquery.com/jquery-2.2.4.min.js"> </
</body>
</html>
1
2
3
if ( !noGlobal ) {
window.jQuery = window.$ = jQuery;
}
Lo que significa que para utilizar Jquery lo podemos hacer como JQuery como window.jQuery o como la
favorita de todos, simplemente $
Existen otras bibliotecas que tambin les gusta ocupar el espacio de nombre de $ en ese caso si ocupamos
alguna de esas en conjunto con JQuery tendremos que ocupar la primera o la segunda forma.
Introduccin a selectores
Con Jquery podemos obtener cualquier elemento del DOM utilizando seletores, por ejemplo podemos obtener
el tag body con jQuery("body") o con $("body")
La lista de selectores posibles es gigante pero en esa seccin revisaremos las ms importantes.
Selector
window
document
*
#id
.class
.class,.class
element
Example
Selects
$(window)
$(document)
$("*")
$("#identificador")
$(".intro")
$(".bonus,.demo")
$("p")
Al obtener el elemento podemos manipularlo o movernos a travs de el para llegar a otro elemento.
Manipuladores
Ahora que podemos obtener elementos del DOM podemos modificarlo con el mtodo text, como por ejemplo:
1
2
Adems del mtodo text existe otro bastante similar llamado .html , la ventaja de este mtodo es que nos
permite agregar html dentro de nuestro sitio.
Si en lugar de modificarlo queremos agregar un contenido lo podemos hacer con el mtodo append.
$("body").append("Hola, estamos modificando el DOM con Jquery")
Claramente podramos lograr lo mismo sin utilizar jQuery pero requerira de ms lneas de cdigo y el criterio de
Jquery es Do More, Write Less, o sea hacer ms con menos lneas de cdigo.
document.body.innerHTML = "Hola estamos modificando el DOM"
Todo lo que se puede hacer con jQuery se puede hacer en Javascript, el problema es que en ciertas ocasiones
puede requerir mucho trabajo, jQuery no es una biblioteca para programar menos, pero no para pensar menos y
es por eso que debemos dominar bien Javascript.
$(".parrafo").addClass("super")
Lo anterior es muy poderoso puesto que se va a agregar la clase a super a todos los prrafos seleccionados.
Adems tambin podemos manipular el CSS Dinmicamente, con el mtodo .css, este mtodo recibe dos
parmetros, el primero es el atributo a modificar y el segundo es el valor.
$(".parrafo").css("color", "red")
$(".parrafo").css("color")
En este caso obtendramos el mismo, aunque en el caso de Chrome dira "rgb(255, 0, 0)"
Traversing
Traversing consiste en desplazarse a travs de los nodos del DOM, visitando a los nodos hijos, padres, o
hermanos, por ejemplo si tenemos una lista <ul> utilizando los mtodos de traversing podramos modificar
a los hijos li con: $("ul").children().css("color", "blue")
Veamos un ejemplo completo para hacer ms experimentos y ver otros mtodos de Traversing:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title></title>
<link rel="stylesheet" href="">
<script src="jquery.js"></script>
</head>
<body>
<ul>
<li> primero </li>
<li> segundo </li>
<li> tercero </li>
</ul>
</body>
</html>
1
2
3
$("ul").children().each(function(){
console.log(this)
})
1
2
3
4
Lo primeros tres
corresponden a el output del console.log El array mostrado corresponde al $("ul").children() que
muestra los resultados
En algunos casos encontraremos en ejemplos en internet lo siguiente:
1
2
3
$("ul").children().each(function(){
console.log($(this))
})
1
2
3
4
[li, context:
[li, context:
[li, context:
[<li> primero
li]
li]
li]
</li>, <li> segundo </li>, <li> tercero </li>]
En el primer de los casos obtenemos un string, en el segundo obtenemos un Array que contiene string con el
nombre del nodo en conjunto con el nodo mismo.
Document Ready
La instruccin document ready nos permite ejecutar cdigo de javascript cuando ya todas el DOM haya sido
cargado, pero todava las imgenes, stylesheets y subframes estn cargando y de esta forma no tener conflictos
causados por que la inexistencia de alguna etiqueta debido a que el html no haya sido cargado.
1
2
3
$(document).ready(function(){
console.log("pagina cargada");
});
$(document).ready es el equivalente a:
1
2
3
4
document.addEventListener("DOMContentLoaded",
console.log("Hola");
}
);
function(event) {
Se parece a window.load pero son distintos, window.load se gatilla cuando todos los elementos dentro de window
se han terminado de cargar, $(document).ready cuando el DOM se ha terminado de cargar.
Tiene importancia si estamos cargando muchas fotos pesadas, window.load se gatillara despus de que se
carguen todas las fotos, $(document).ready se gatillara antes despus de leer todo el HTML con las
fotos pero no antes de que estas se carguen.
Existe otra forma ms de hacer lo mismo, que es con:
1
2
$(function() {
});
El operador $(this)
Jquery tiene un operador muy curioso llamado $(this) el secreto para entenderlo es comprender que:
$() es la funcin constructora de Jquery
this es una referencia al elemento del DOM que se est invocando (por defecto es el objeto Document)
$(this) aplica el constructor al elemento this y como resultado se obtiene un super this que incluye mtodos
de Jquery
Control de eventos.
jQuery hace que sea fcil de responder a la interaccin del usuario con una pgina web.
Esto significa que se puede escribir cdigo que se ejecuta cuando un usuario hace clic en una cierta parte de la
pgina, o cuando se mueve el mouse sobre un elemento de formulario.
Cuando se produce un evento, se ejecuta la funcin prevista. Dentro de la funcin, this se refiere al elemento que
ha gatillado el evento.
Por ejemplo, este cdigo se ejecutara cuando un usuario haga clic en cualquier elemento li en la pgina:
1
2
3
El objeto evento
1
2
3
4
5
6
7
8
9
delegacin de eventos
La delegacin de eventos nos permite adjuntar un nico controlador de eventos a un elemento padre, que se
activar para todos los descendientes que coinciden con un selector, independiente si existen estos descendientes
o se aaden en el futuro. Usando el siguiente ejemplo:
Cuando se hace clic en un link en nuestro grupo #list, queremos registrar su texto a la consola.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="container">
<ul id="list">
<li><a href="http://domain1.com">Item #1</a></li>
<li><a href="/local/path/1">Item #2</a></li>
<li><a href="/local/path/2">Item #3</a></li>
<li><a href="http://domain4.com">Item #4</a></li>
</ul>
</div>
<script src="http://code.jquery.com/jquery-2.2.1.min.js"></script
</body>
</html>
Normalmente usaramos el controlador de evento click en los links usando el mtodo .on() Aunque esto
funciona perfectamente bien, hay inconvenientes.
Qu es lo que sucede cuando se aade un nuevo link despus de haber creado el controlador de eventos?
Si hacemos click en nuestro link que acabamos de agregar, no pasara nada, esto se debe a que al controlador de
eventos directamente vinculado que hemos conectado previamente.
Los eventos directos solamente estn unidos a los elementos en el momento en que el mtodo .on() se llama.
En este caso, como no exista nuestro nuevo link cuando .on() fue llamado, no se dispara el controlador de
eventos.
1
2
3
4
5
La comprensin de cmo se propagan los eventos es un factor importante para poder aprovechar la delegacin
de eventos. Cada vez que se hace clic en una de nuestras etiquetas link, un evento de clic es disparado por ese
link. Luego se propaga hacia arriba en el rbol DOM, provocando que en cada uno de sus ancestros se ejecute el
controlador de evento clic. Esto significa que cada vez que se hace clic en uno de nuestros links, se est haciendo
clic en todo el cuerpo del documento! Esto se llama propagacin de eventos.
Ya que sabemos cmo funciona la propagacin de eventos, podemos crear un evento delegado.
1
2
3
4
5
La Delegacin de eventos se refiere al proceso de utilizacin de la propagacin de eventos para manejar eventos
en un nivel superior en el DOM de el elemento en el que se origin el evento. Se nos permite adjuntar un nico
controlador de eventos para los elementos que existen en la actualidad o en el futuro.
1
2
3
4
5
6
7
8
$.ajax({
url: '/path/to/file',
type: 'default GET (Other values: POST)',
dataType: 'default: Intelligent Guess (Other values: xml, json, script, or h
data: {param1: 'value1'},
})
.done(function() {
console.log("success");
9
10
11
12
13
14
15
})
.fail(function() {
console.log("error");
})
.always(function() {
console.log("complete");
});
Un llamado ajax se hace siempre a una pgina que puede ser de un servidor nuestro o un externo, el llamado
puede ser GET o Post, el tipo obtenido usualmente ser json o script y los datos sern los datos que nosotros
enviemos.
El mtodo .done slo se ejecutar en caso de que haya xito, el .fail en caso de fracaso del pedido y .always
siempre se ejecutar.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
</head>
<body>
<div id="weather"> </div>
<select type="select" id="city">
<option selected value="Santiago">Santiago</option>
<option value="New York">New York</option>
<option value="Londres">Londres</option>
</select>
<script src="js/main.js"></script>
</body>
</html>
En esta parte no tendremos ningn cambio, lo que haremos ser reimplementar lo que hicimos con javascript
puro en esta ocasin utilizando jquery
1
2
3
4
5
$(function() {
$("#city").on("change", function(){
console.log($(this).val())
})
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$(document).ready(function() {
$("#city").on("change", function(){
var city = $(this).val();
$.ajax({
url: 'http://api.openweathermap.org/data/2.5/weather',
type: 'GET',
dataType: 'json',
data: {q: city, APPID:"596acd6e062eb1652cc943e8f20407e9"
})
.done(function(data) {
console.log(data);
})
})
});
Luego lo nico que nos falta es utilizar esos datos para ponerlos en la pgina.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$(document).ready(function() {
$("#city").on("change", function(){
var city = $(this).val();
$.ajax({
url: 'http://api.openweathermap.org/data/2.5/weather',
type: 'GET',
dataType: 'json',
data: {q: city, APPID:"596acd6e062eb1652cc943e8f20407e9"
})
.done(function(data) {
console.log(data);
$("body").append("<p> La temperatura en " + city + " es de "
})
})
});
Si queremos los datos en Celcius en lugar de Fahreneheit simplemente tenemos que aplicar la formula de
conversin.
Ademas explorando el objeto dentro de la consulta podramos darnos cuenta que podemos obtener el clima, la
humedad, el viento y muchas otras cosas interesantes que se dejan como tarea al lector de implementar.