03 4 Lectura JavaScript
03 4 Lectura JavaScript
El editor de texto
Para escribir código vas a necesitar un editor de texto. Un editor de texto es
una aplicación que nos permite crear y editar archivos de texto.
A diferencia de un procesador de palabras (como Microsoft Word), un editor de
texto se utiliza para crear archivos de texto sin formato.
Cada sistema operativo trae algún editor de texto como Bloc de Notas en
Windows o TextEdit en Mac. Sin embargo, existen editores de texto
especializados para programadores que tienen varias ventajas sobre el editor
que viene en tu sistema operativo:
La consola de Node.js
Para abrir la consola de Node.js ejecuta el siguiente comando desde la línea de
comandos:
$ node
>
La consola de Node.js nos permite escribir una expresión de JavaScript, oprimir
Enter, y ver el resultado de esa expresión en la siguiente línea, muy parecido a
cómo lo hicimos sobre la consola del navegador en la sección pasada.
Desde un archivo
La otra forma de ejecutar código JavaScript en Node.js es crear un archivo con
extensión js en el que escribimos nuestro código y lo ejecutamos con el
comando node.
Crea un archivo llamado app.js, ábrelo con tu editor favorito y pega el siguiente
contenido:
console.log("Hola Mundo!");
Guárdalo y ejecuta node app.js sobre la línea de comandos (asegúrate de estar
ubicado sobre la carpeta donde se encuentra el archivo). Deberías ver el texto
"Hola Mundo" en la siguiente línea:
$ node app.js
Hola Mundo
Cambia el texto por cualquier otro y vuelve a ejecutar el archivo.
Errores
Veamos ahora qué pasa si cometemos algún error en nuestro código. Por
ejemplo, borra el caracter lde la palabra console y vuelve a ejecutar el archivo.
Te debería aparecer un mensaje de error similar al siguiente:
/Users/germanescobar/Projects/node/app.js:1
(function (exports, require, module, __filename, __dirname) { consoe.log("Hola
Mundo");
^
^^^^^^^^^^^^^
SyntaxError: Invalid or unexpected token
at Object.exports.runInThisContext (vm.js:78:16)
at Module._compile (module.js:543:28)
at Object.Module._extensions..js (module.js:580:10)
at Module.load (module.js:488:32)
at tryModuleLoad (module.js:447:12)
at Function.Module._load (module.js:439:3)
at Module.runMain (module.js:605:10)
at run (bootstrap_node.js:420:7)
at startup (bootstrap_node.js:139:9)
at bootstrap_node.js:535:3
Esta vez el mensaje SyntaxError: Invalid or unexpected token no es tan claro,
pero fíjate que nos indica dónde está el problema con varios caracteres ^.
Node.js ejecuta el archivo línea por línea, una después de la otra. Así que
podemos agregar una segunda línea a nuestro archivo:
console.log("Hola Mundo");
console.log("Esto está muy bacano");
El ejecutar el archivo deberías ver el siguiente resultado:
$ node app.js
Hola Mundo
Esto está muy bacano
Comentarios
Los comentarios se utilizan para documentar o aclarar nuestro código y son
ignorados al ejecutar el archivo. En JavaScript se utilizan los caracteres // para
crear un comentario de una línea. Por ejemplo:
// este es un comentario de una línea
console.log("Hola Mundo");
console.log("Esto está muy bacano"); // este es otro comentario
También puedes crear comentarios de múltiples líneas encerrando el texto
entre /* y */. Por ejemplo:
/*
este es un comentario
de varias líneas
console.log("esto no aparece al ejecutar el archivo")
*/
console.log("Hola Mundo");
console.log("Esto está muy bacano");
Fíjate que la última línea del comentario es código JavaScript válido. Sin
embargo, ese código no se ejecuta porque está como comentario.
Tipos y Operadores
En este capítulo vamos a hablar sobre cadenas de texto, números y booleanos
(verdadero o falso), que son tipos de datos básicos en JavaScript, y cómo
realizar algunas operaciones con ellos. Empecemos con las cadenas de texto.
Cadenas de texto
Una cadena de texto es un conjunto de caracteres encerrados entre comillas
simples (') o dobles ("). Por ejemplo:
"Texto entre comillas dobles"
'Texto entre comillas simples'
Aunque parece fácil, existen tres errores comunes al definir una cadena de texto
para que los tengas en cuenta e intentes evitarlos:
Variables
Las variables son uno de los conceptos básicos de la programación y nos
permiten almacenar información temporal que podemos usar más adelante en
nuestros programas.
Como buena práctica se recomienda empezar las variables con una letra en
minúscula y, si el nombre se compone de varias palabras, capitalizar cada
palabra después de la primera (más conocido como camel case). Por
ejemplo videoTranscoder o firstName.
Los nombres de las variables diferencian mayúsculas y minúsculas
(p.e. firstname es diferente a firstName).
Las variables se almacenan en en una memoria especial del computador llamada memoria RAM y
viven durante la ejecución del programa, es decir, desde el momento en que las defines hasta
que tu programa termina de ejecutarse. Si abres la consola de Node.js y defines una variable,
esta vive hasta que cierres esa sesión.
La memoria RAM es una memoría de rápido acceso que está disponible mientras tu computador
está encendido. El sistema operativo se encarga de administrar la memoria RAM y asignarle una
porción a cada programa que se está ejecutando. Cuando el programa termina, el sistema
operativo reclama esa memoria y "destruye" todas las variables que ese programa haya creado.
Nota: Más adelante, cuando veamos funciones, aprenderemos que las variables tienen
un alcance y no todas las variables sobreviven hasta que termina el programa.
Condicionales
Hasta ahora hemos visto código que se ejecuta línea a línea, una detrás de otra.
Pero a veces se hace necesario romper esa secuencia y crear ramas que nos
permitan tomar diferentes caminos en el código dependiendo de ciertas
condiciones.
Por ejemplo, imagina cómo podríamos hacer un programa que nos diga si un
número es mayor o menor a diez. Si es mayor a 10 debería imprimir una cosa,
pero si es menor debería imprimir otra.
De lo contrario (else)
Lo único que necesitas para hacer condicionales es el if. Pero existen dos
atajos que te van a permitir escribir código más corto.
El primer atajo es el else, que significa "de lo contrario" en Inglés. El else nos
permite definir el código que se debe ejecutar si el if no se cumple, es decir si
la condición evalúa a falso. La sintaxis es la siguiente:
if (<condición>) {
// código que se ejecuta si se cumple la condición
} else {
// código que se ejecuta si NO se cumple la condición
}
Podemos modificar el programa anterior, que nos dice si el número almacenado
en la variable num es menor a 10, o si es mayor o igual, con un else.
var num = 8;
Condiciones anidadas
Ahora imagina que queremos modificar este programa para que en vez de
imprimir "El número es igual o mayor a 10", imprima "El número es igual a 10" o
"El número es mayor a 10" dependiendo si el número es igual 10 o mayor a 10
respectivamente.
Condiciones compuestas
Imagina que queremos escribir un programa que imprima "El número está entre
10 y 20" si el valor de una variable está efectivamente entre 10 y 20. ¿Cómo te
imaginas que lo podríamos solucionar?
Una opción es usar condiciones anidadas, de esta forma:
var num = 15;
num >= 15 ? console.log('Es mayor o igual que 15') : console.log('Es menor que
15');
1. Verdadero.
2. Falso.
3. Verdadero.
4. Falso.
5. Falso.
6. Verdadero.
7. Verdadero.
8. Falso.
Cuando utilizamos y las dos expresiones deben ser verdaderas para que el
resultado sea verdadero. Cuando utilizamos o cualquiera de las dos
expresiones puede ser verdadera para que el resultado sea verdadero.
1. true
2. false
3. 1 < 1
4. 2 != 3
5. 1 < 1 && 2 != 3
Fíjate que el resultado solo es true cuando los dos lados del && son true.
Hagamos lo mismo para el ó (||):
Expresión Resultado
Con el ó cualquiera de los lados puede ser true para que el resultado sea true.
A estas tablas se les conoce como Tablas de Verdad.
!true es false
!false es true
El proceso para solucionar cualquier expresión booleana, sin importar qué tan
compleja sea, es el siguiente:
Iteraciones o ciclos
Los ciclos nos permiten repetir la ejecución de un código varias veces. Imagina
que quisiéramos repetir la frase "Hola mundo" 5 veces. Podríamos hacerlo
manualmente. Crea un archivo llamado loops.js y escribe el siguiente código:
console.log("Hola Mundo");
console.log("Hola Mundo");
console.log("Hola Mundo");
console.log("Hola Mundo");
console.log("Hola Mundo");
Ejecútalo y deberías ver la frase "Hola mundo" 5 veces en tu pantalla:
$ node loops.js
Hola mundo
Hola mundo
Hola mundo
Hola mundo
Hola mundo
Ahora imagina que quisieramos repetirlo 850 veces. Ya no sería tan divertido
copiar todo ese número de líneas en el archivo. Podemos entonces utilizar un
ciclo. Un ciclo se crea utilizando la palabra clave while seguido de una
condición, que va a definir el número de veces que se va a repetir ese ciclo.
Reemplaza el contenido del archivo loops.rb por el siguiente:
var i = 0;
while (i < 850) {
console.log("Hola mundo");
i = i + 1;
}
Ejecútalo y revisa que la frase "Hola mundo" aparezca 850 veces. Como
ejercicio modifícalo para que aparezca el valor de i antes de cada frase.
Debería salir algo así (omitimos algunas líneas para no gastar tanto
pap...ehhh...espacio en disco):
$ node loops.js
0 Hola mundo
1 Hola mundo
2 Hola mundo
...
345 Hola mundo
...
849 Hola mundo
Un ciclo en JavaScript tiene la siguiente sintaxis:
while (<condicion>) {
// acá va el cuerpo del ciclo, el código que se va a repetir mientras la
condición se cumpla
}
La condición puede ser cualquier valor o expresión booleana. El cuerpo del ciclo
se va a ejecutar mientras que la condición se cumpla. Por ejemplo, crea un
archivo llamado inifiniteLoop.js que contenga lo siguiente:
while (true) {
console.log("Hola Mundo");
}
¿Qué crees que va a ocurrir? Antes de ejecutarlo debes saber que puedes
interrumpir cualquier programa oprimiendo Ctrl + C :)
El código anterior crea lo que en programación llamamos un ciclo infinito.
Intenta evitarlos.
for
El while es todo lo que necesitas para hacer ciclos en JavaScript. Sin embargo,
ese patrón que vimos en el ejemplo anterior en el que tenemos
una inicialización (var i = 0), una condición (i < 850) y
un incrementador (i++) es tan común, que JavaScript tiene un atajo para esto,
el for.
El for tiene la siguiente sintaxis:
for (<inicialización>; <condición>; <incrementador>) {
// el cuerpo del ciclo, el código que se repite mientras que la condición
sea verdadera
}
El ejemplo anterior lo podemos reescribir de la siguiente forma:
for (var i = 0; i < 850; i ++) {
console.log("Hola mundo");
}
Son equivalentes, la única diferencia es que el inicializador, la condición y el
incrementador están definidos en la misma línea, pero se ejecuta de la misma
forma que el while:
Algunos ejemplos
Imagina que queremos hacer un programa que imprima los números del 10 a 20
pero saltando cada otro número, es decir, que imprima 10, 12, 14, 16, 18 y 20.
El primer paso antes de escribir el ciclo es identificar las diferentes partes del
ciclo: la inicialización, la condición, el incrementador y el cuerpo.
Para este ejemplo serían:
Con esta información ya puedes implementar el ciclo con while o for, recuerda
que son equivalentes. La solución utilizando un while sería:
var i = 10; // el inicializador
while (i <= 20) { // la condición
console.log(i);
i = i + 2; // el incrementador
}
Podemos hacer lo mismo con un for:
for (var i=10; i <= 20; i = i + 2) {
console.log(i);
}
Hagamos otro ejemplo. Imagina que queremos imprimir los números del 1 a al
100 pero deforma descendente, es decir, 100, 99, 98 ... 1. Empecemos
identificando las partes del ciclo:
var i = 100;
while (i > 0) {
console.log(i);
i--;
}
Arreglos
Hasta ahora hemos trabajado con cadenas de texto, números y booleanos. En
este capítulo vamos a hablar de un nuevo tipo de datos: los arreglos.
Recorriendo un arreglo
En el ejemplo anterior pudimos imprimir cada una de las posiciones porque era
un arreglo de pocos elementos. Sin embargo esto no siempre es práctico.
Primero, el arreglo puede ser muy grande o puede que no sepamos el tamaño
del arreglo. Crea un archivo llamado arrays.js y escribe el siguiente código:
var array = [1, "Pedro", true, false, "Juan"];
Reemplazando un elemento
Es posible reemplazar el valor de cualquier elemento del arreglo. Por ejemplo:
var array = [1, "Pedro", true, false, "Juan"];
array[1] = "Germán"; // reemplazamos el elemento en la posición 1
Eliminando elementos
Para eliminar elementos de un arreglo utilizas el método splice. Por ejemplo:
var array = ["Pedro", "Germán", "Diana"];
array.splice(1, 1); // ["Pedro", "Diana"]
El método splice recibe uno o dos argumentos cuando quieres eliminar
elementos: el índice del elemento que quieres eliminar y la cantidad de
elementos a eliminar. Si omites el segundo argumento se eliminarán todos los
elementos después del índice que hayas especificado en el primer argumento.
Por ejemplo:
var array = ["Pedro", "Germán", "Diana"];
array.splice(0); // []
Funciones
Eventualmente vas tener algunas líneas de código que necesitan ser ejecutadas
varias veces y desde diferentes partes de tu programa. En vez de repetir el
mismo código una y otra vez puedes crear una función (también se les conoce
como procedimientos o métodos) e invocarla cada vez que necesites ejecutar
ese trozo de código.
Crea un archivo llamado functions.js y escribe lo siguiente:
function hello() {
console.log("Hola Mundo");
}
Para definir una función usamos la palabra reservada function, le damos un
nombre (en este caso hello), abrimos y cerramos paréntesis (()). Después
abrimos corchetes ({), escribimos el cuerpo de la función (el código que
queremos ejecutar cuando sea invocada), y por último cerramos los corchetes }.
Si ejecutamos este código no aparece nada en la pantalla:
$ node functions.js
Una característica de las funciones es que no se ejecutan hasta que alguien
las invoque. Modifiquemos nuestro programa para invocarla:
function hello() {
console.log("Hola Mundo");
}
Argumentos
Las funciones pueden recibir cero o más argumentos (o parámetros). Piensa en
los argumentos como variables que puedes utilizar dentro de la función.
Utilizando argumentos podemos hacer una función reutilizable que salude a
cualquier persona:
function hello(name) {
console.log("Hola " + name);
}
hello("Germán");
hello("David");
Si lo ejecutamos deberías ver lo siguiente:
$ node methods.js
Hola Germán
Hola David
Los argumentos se definen dentro de los paréntesis al declarar la función y se
separan con coma.
Retornando un valor
Opcionalmente puedes retornar un valor desde la función utilizando la palabra
clave return. Podemos modificar la función hello para que en vez de imprimir
con console.log retorne una cadena de texto:
function hello(name) {
return "Hola " + name;
}
console.log(hello("Pedro"));
Si ejecutas este código deberás ver lo siguiente:
$ node functions.js
Hola Pedro
La última línea de la función nunca va a ser ejecutada porque la función siempre
retorna antes de llegar a ella.
Cada argumento debe tener un nombre de una variable válido. Recuerda que el
nombre de una variable debe comenzar con $, _ o una letra, y después puede
contener letras, dígitos, _ y $.
Puedes retornar un valor desde la función utilizando la palabra clave return.
El valor de retorno debe ser un tipo válido de JavaScript: un número, una
cadena de texto, un booleano, un arreglo, etc.
Cajas negras
En muchas ocasiones es bueno pensar en funciones como cajas negras que
reciben unos parámetros de entrada y genera un valor de salida (el valor de
retorno).
Ejemplo
Vamos a hacer una función que calcule el indice de masa corporal (IMC). El IMC
es una medida que relaciona el peso de una persona con su altura. La formula
para calcular el IMC es peso dividido altura al cuadrado:
IMC = peso / (altura^2)
Traduzcamos eso a código JavaScript. Crea un archivo llamado bmi.js (BMI por
Body Mass Index) y escribe lo siguiente:
function bmi(weight, height) {
return weight / height ** 2
}