Java Script
Java Script
Fichero externo
<script src="js/main.js"></script>
Comentarios
//De línea
/*
De bloque
*/
No hay que utilizar document.write porque sobreescribe lo que hay en pantalla sino que
hay que modificar el innerHTM del nodo.
document.write("Hola Mundo");
ALERT
<script>
alert('Hola Mundo');
</script>
Consola log
console.log(variable);
DOM
<script>
document.querySelector("body").innerHTML = "Hola mundo";
</script>
Devuelve un string
valorIntroducido = prompt(“mensaje”, “valor por defecto”);
Variables
Definición
Nombres
Casesensitive
var
var y = 6;
var z = x + y;
var carName;
let
Asignación =
carName = "Volvo";
Ámbito Scope
Ver closures
window
window es un scope total. Todo lo que asignamos a window tiene acceso desde
cualquier parte desde la misma ventana
Constantes
Const a=1;
Números
Decimal .
Operaciones numéricas
()
* /
+ -
% modulo
Operadores unarios
a+=10 a=a+10
a-=5; a=a-5
a*=3; a=a*3
a/=2; a=a/2
a%4; a=a%4
a++; a=a+1
a--; a=a-1
Otras operaciones
NO ES NUMERO
ES ENTERO
TRUNCAR Math.trunc(42.7) // 42
Cambio de tipo
Octales
Empiezo por 0
//octales 0-7
var octal = 0546377;
Hexadecimal
Empieza con 0x
typeof variable;
Si no está declarada
Strings
Operaciones
MAYÚSCULAS: cadena.toUpperCase()
MINÚSCULAS: cadena.toLowerCase()
cadena.startsWith(“ola”);
console.log(cadena.startsWith("ola",1)); //Empiezo por el carácter 1
cadena.endsWith(“ola”);
cadena.includes(“ola”);
cadena.includes(“ola”, 2); //Desde la posición 2
Con slice:
REPETIR: cadena.repeat(3);
Conversión
<script>
//usamos el + como suma
var num1 = 6;
var num2 = 6;
console.log(num1+num2); //12 Con dos números + es suma
var num1 = 6;
var num2 = "6";
console.log(num1+num2); //66 Con que tenga un string lo pasa todo a string y
concatena
if (isNaN(tot)) {
console.log("Error: El total no es numérico");
} else {
console.log("El total es:",tot);
}
</script>
Secuencias de escape
\n salto de línea
\r retorno de carro
\t tabulador
\\ carácter \
\’ comilla simple
\” comilla doble
\b carácter anterior
\f salto de página
String Templates
Se interpola con ${} variables o funciones o cualquier expresión que retorne algo.
function nombre() {
return 'Rafa';
}
Tagged templates
Devuelve
Rafa
Booleanas
true o false
Symbol
Los símbolos son únicos e inmutables y son utilizados como identificadores para
propiedades de objetos.
Pueden tener una descripción opcional para fines de depuración. Cada símbolo tiene
asignado una cadena o undefined que sirve como descripción del símbolo.
Arrays
Primer índice 0
No tienen tipo
Definir
Empieza en el 0
Son objetos
array[4];
Rellenar / populate
días[0] = “Domingo”;
Extraer / Eliminar
Spread – espander
let abc = [‘a’, ‘b’, …cde, ‘f’, ‘g’] // let abc = [‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’]
Iteracion
Funciones
array1.length;
Ordenar
Filter
Escribiendo la función
map
Se aplica a un array. Se le pasa como parámetro una función y devuelve otro array con
los resultados de aplicar la función a los elementos del array original.
foreach
numeros.forEach(imprimeArray);
function imprimeArray(numero) {
console.log(numero);
}
Otro
reduce
Reduce un array a un único valor. Ejecuta una función (que se pasa como parámetro) a
todos los elementos del array (de izquierda a derecha) y acumula el resultado.
Otro
Si quiero pasar una copia puedo hacer un map que recorra todos los elementos y
devuelva una copia de cada elemento.
Objeto Math
Métodos cálculo
abs(n)
exp(n)
log(n)
sqrt(n)
max(x,y)
min(x,y)
Métodos redondeo
ceil(n)
floor(n)
Métodos trigonometría
cos(n)
acos(n)
sin(n)
asin(n)
tan(n)
atan(n)
Constantes
PI
LN2
LN10
LOG2E
LOG10E
SQRT2
Domingo 0
Métodos
Get
Tom valor del sistema. Mejor tomarla del servidor con PHP.
getMilliseconds()
getFullYear()
set
Objetos
Objetos JS
Los objetos de JS son navigator, document, window y history. Window se puede omitir.
document.write("Hola Mundo");
Creación de objetos
//objeto
var alumno = new Object();
//poblar un objeto
alumno.nombre = "Pedro";
alumno.apellido = "Picapiedra";
alumno.edad = 40;
alumno.empleado = "Montacargas";
//asignamos un arreglo
alumno.calificaciones = [7,8,9,6,7,8,9];
//asignar un objeto
alumno.direccion = {calle:"Rocadura", num:99, ciudad:"Rocapulco"};
//Creación de objeto al vuelo
//Antes:
obj = {x:x, y:y}
//Ahora:
obj = { x, y }
console.log(obj.x, obj.y)
let obj = {
foo: "bar",
[ "id" + num() ]: 4
}
console.log(obj);
//
function num(){
return Math.floor(Math.random()*10);
}
Métodos
obj = {
suma (a, b) { return a+b }, // suma: function (a,b) {return a+b}
multiplica (x, y) { return x*y },
*num (x, y) { }
}
console.log(obj.suma(10,3));
console.log(obj.multiplica(10,3));
Spread – espander
Método assign
https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/Obj
ect/assign
Al igualar objetos se pasan por referencia (están relacionados). Assign pasa los
parámetros
var o1 = { a: 1 };
var o2 = { b: 2 };
var o3 = { c: 3 };
var obj = Object.assign(o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
console.log(o1); // { a: 1, b: 2, c: 3 }
var obj = { a: 1 };
var copy = Object.assign({}, obj);
console.log(copy); // { a: 1 }
Object.assign(objetivo, ...fuentes)
objetivo
El objeto destino.
fuentes
Los objetos origen.
Valor devuelto
El objeto destino.
Las propiedades en el objeto destino serán sobrescritas por las propiedades en las fuentes
si tienen la misma clave. Propiedades posteriores de las fuentes podrán sobrescribir las
anteriores.
Conjuntos Set
No aceptan duplicados
//Sets
var s = new Set();
//Añade 3 elementos, cadena1 se repite
s.add("cadena1").add("cadena2").add("cadena1");
//El tamaño es 2
console.log(s.size); // 2
//EL conjunto no tiene la cadena hola
console.log(s.has("hola")); // false
//EL conjunto tiene la cadena cadena1
console.log(s.has("cadena1")); // true
Mapas Map
//Maps
var m = new Map();
//Añade la llave "hola" con el valor 42
m.set("hola",42);
//Añade la llave "a" con el valor 34
m.set("a",34);
// Obtiene el valor asociado a la llave
console.log(m.get("a")); // 34
console.log(m.get("hola")); // 42
Condicionales
If – else
if (condición) {
} else if(condición) {
} else {
}
switch(variable) {
case valor1:
case valor2:
//Instrucciones
break;
******
default:
//Instrucciones
}
Operadores lógicos
or ||
and &&
Operadores de comparación
== igualdad
!= diferente
!
> >=
< <=
(opción)?verdadera:falsa;
Equivalente a:
if(opción) {
verdadera
} else {
Falsa
}
Bucles - Ciclos
while
while (condición) {
//Poner instrucción que haga que la condición sea falsa en algún momento
}
Do – while
do {
//Poner instrucción que haga que la condición sea falsa en algún momento
} while (condición);
for
continue
break
Crear funciones
Podemos dar un valor por defecto a los parámetros (incluso dar un valor de una función
que se ejecuta si no se pasa el parámetro.
<script>
function esPar(numero=2)
{
if(numero % 2 == 0 )
{
return true;
}
return false;
}
document.querySelector("body").innerHTML = esPar(6);
</script>
Invocar funciones
La invocamos con su nombre y los paréntesis con los parámetros, aunque no lleve
parámetros.
esPar(5);
Funciones autoejecutables
Poner en PHPStorm (func y autocompletar. Poner al final (); para que funcione.
(function () {
console.log('Rafa');
})();
Si solo tiene un return se puede eliminar la palabra. Se devuelve lo que hay detrás de la
flecha.
Es equivalente a:
var x = function(a, b) {
return a+b;
}
//Con function
var cuadrados = numeros.map(function (numero) { return numero*numero;
});
console.log(cuadrados);
setTimeout(function () {
this.nombre = 'nombre nuevo';
},500);
}
//Para poder acceder al atributo del padre
function Tutor() {
this.nombre = "Uriel";
var self = this;
setTimeout(function () {
self.nombre = 'nombre nuevo';
},500);
}
//Con arrow functions hereda el scope del padre
function Tutor() {
this.nombre = "Uriel";
setTimeout( () => {
this.nombre = 'nombre nuevo';
},500);
}
Funciones Generadoras
Son un tipo especial de función que devuelve una serie de valores con un algoritmo
definido por el usuario. Para definir series como cuadrados, serie de fibonnacci, …
Contiene una o más expresiones yield en vez del return y se declara con function*
Yield devuelve e valor pero guarda el estado, status, de las variables de la función. La
próxima vez que llamo a la función sigue con el valor siguiente.
Rangos
<script>
function* rango (inicio, fin, incremento)
{
while (inicio<fin) {
yield inicio;
inicio+=incremento;
}
}
Serie
Cuadrados
<script>
function* cuadrados ()
{
var n= 1; //Empieza por el 1
while (true) { //Bucle sin fin
var c = n * n; //Calcula el cuadrado
n++; //Incrementa para la próxima iteración
yield c; //Devuelve el valor actual
}
}
Spread – espander
function fun1(…números) {
console.log(números.length);
}
fun1(); // 0
fun1(5); // 1
fun1(5,6,7) // 3
Promises
Permiten administrar las funciones de callback de los procesos asíncronos. Par saber si
la función de callback devuelve lo que se le ha pedido.
Para enviar información dentro de las promesas, se envían con resolve() y reject() y
dentro de estos métodos un return.
<script>
setTimeout(()=>{
reject("Todo mal"); // A los 1500 segundos lanzo el error
},1500);
})
miPromesa.then((res)=>{
console.log(res);
}, (err)=>{
console.log(err);
});
</script>
<script>
if (resultado) {
todoBien("listo");
} else {
todoMal("algo falló");
}
});
miPromesa.then(function(resultado) {
console.log("El resultado es "+resultado);
})
.catch(function(resultado){
console.log("El resultado es "+resultado);
});
</script>
window.onload
Como el script de javascript suele ponerse al inicio del código hay que ejecutarlo
cuando ya se ha cargado la página y están todas las etiquetas. Para ello el manejo de
nodos lo haremos dentro del evento window.onload
window.onload = function(){}
Cada etiqueta es un nodo del árbol y puede tener subnodos generando otro subarbol
DOM permite acceder desde JavaScript a todos los elementos del árbol.
OJO!!! Los contenidos y atributos también son nodos diferentes a las etiquetas
Añadir nodos
Añadir atributos
Agregar como hijo. Loas añade al final. No hay una función que añada hijos al inicio.
<form id="form">
<!--Los corchetes indican que enviamos un array de campos-->
<input type="email" placeholder="Correo" name="mails[]">
</form>
<!--Quiero agregar más campos correo al formulario-->
<button id="btn">Agregar más correos</button>
<script>
//Selecciono el botón
$("#btn").addEventListener("click", function () {
// createElement crea un elemento de la etiqueta que indique.
var nodoInput = document.createElement("input");
nodoInput.setAttribute("type", "email");
nodoInput.setAttribute("placeholder", "Correo");
nodoInput.setAttribute("name", "mails[]");
console.log($("body").children[]);
Elementos de un aclase
function recorreElementosDeClaseClose() {
var elements = document.querySelectorAll(".close");
for (var posicion = elements.length-1; posicion >= 0; posicion--)
{
var element = elements[posicion];
console.log(element);
}
}
Seleccionar nodos
<style>
h1{color:blue;}
.rojo{ color:red; }
.verde{ color:green; }
#amarillo{ color:yellow; }
</style>
window.onload = function(){
//seleccionamos por clase
var rojos = document.querySelectorAll(".rojo");
console.log("Tenemos "+rojos.length+" elementos rojos");
Seleccionar por id
<script>
window.onload = function(){
//seleccionamos los elementos con la clase rojo
var rojos = document.getElementsByClassName("rojo");
console.log("Elementos que contienen la clase 'rojo' son: "+rojos.length);
for (var i = 0; i < rojos.length; i++) {
console.log("El contenido de los nodos es :"+rojos[i].innerHTML);
}
}
</script>
<style>
.rojo{ color:red; }
</style>
<ul>
<li class="rojo">Document</li>
<li class="rojo">Object</li>
<li class="rojo">Model</li>
</ul>
Para evitar esto hay que poner windo.onload que indica que se haga una vez cargada la
página
Windows.onload = function(){sole.log
var div = document.getElementsByTagName("div");
con(“El numero de etiquetas div es: “+div.lehgth);
}
Tipo de nodo
Devuelve un número
Nodos Hijos
Para acceder a los nodos hijos se usa nodo.childNodes y devuelve un array de nodos.
Incluye la propia etiqueta, las etiquetas de los hijos y los contenidos de los hijos. Cada
cosa es un nodo
innerHTML es una propiedad que nos permite trabajar con el texto o contenido del
nodo.
Obtener texto
window.onload = function(){
//recuperamos la informacion de un nodo
var d = document.querySelector(".rojo").innerHTML;
Modificar el contenido
window.onload = function(){
//recuperamos la informacion de un nodo
var d = document.querySelector(".rojo").innerHTML;
//modificando el contenido con etiquetas añadidas
document.querySelector(".rojo").innerHTML = "<b>"+d+"</b>";
Eliminar el contenido
window.onload = function(){
//recuperamos la informacion de un nodo
var d = document.querySelector(".rojo").innerHTML;
//eliminar el contenido
document.querySelector(".rojo").innerHTML = "";
miNodo.getAttribute(“align”);
Modificar el atributo
miNodo.setAttribute(“align”, “left”);
miDOM.setAttribute("class","rojo");
Devuelve un bool.
miNodo.hasAttribute(“class”);
miNodo.removeAttribute(“class”);
Navegar en el documento
OJO!!! Los navegadores toman los espacios (entre las etiquetas) como nodos
parentNode (hacia arriba)
<script>
window.onload = function(){
var medio = document.getElementById("medio");
do{
console.log(medio.nodeName, medio.innerHTML);
medio = medio.nextElementSibling;
}while(medio)
}
</script>
EVENTOS
onmouseover
onmouseout
Listeners
document.getElementById("mi_boton").addEventListener("click", clic,
false);
Orden
<div id="mi_div">
<button id="mi_boton"> Clic para abrir un alert</button>
</div>
document.getElementById("mi_div").addEventListener("click", clic2,
true);
document.getElementById("mi_boton").addEventListener("click", clic,
false);
document.getElementById("mi_div").addEventListener("click", clic2,
false);
document.getElementById("mi_boton").addEventListener("click", clic,
true);
Con los dos false ejecuta primero el de dentro (clic) y después clic2
document.getElementById('boton').addEventListener("click", function ()
{
console.log('Hola');
});
CLOSURES
(function () {
})();
Para no contaminar el scope global se puede poner el código en una función que se
llama a sí misma. Es una función declarada dentro de otra función.
La declaración de variables en una función autoinvocada, se hace sólo la primera vez.
El truco para que la función externa sea inmediatamente ejecutada y el valor retornado
sea asignado, es encerrar la definición de la función entre paréntesis, de este modo
indicamos que se va a ejecutar una function expression ya que los paréntesis no pueden
contener declaraciones (ej. function declaration).
document.getElementById('boton').addEventListener("click",
function () {
console.log('Hola');
});
})();
Un closure tiene acceso a las variables de la función padre incluso después de cerrar la
función padre.
Recibe una referencia a las variables del padre por lo que si las modifico se modifican
en el global.
function holaMundo(nombre) {
function construct() {
return 'Hola ' + nombre;
}
return construct(); //Devuelve una función
}
JSON
Reglas:
Los datos son pares “nombre”:valor (Nombre en comillas dobles o sin comillas)
Los datos están separados por comas ,
Las llaves {} contienen objetos
Los corchetes contienen arrays
'{"firstName":"John","lastName":"Doe" },' +
'{"firstName":"Anna","lastName":"Smith" },' +
'{"firstName":"Peter","lastName":"Jones" }]}';
obj = JSON.parse(text);
document.getElementById("demo").innerHTML = obj.employees[1].firstName
+ " " + obj.employees[1].lastName;
CLASES
Clases ES5
//Definición de la clase
function Tutor(nombre, apellido) {
//definición de atributos
this.nombre = nombre;
this.ocupacion = 'tutor';
this.nombreCompleto = nombre + ' ' + apellido;
//definición de métodos
this.cargo = function () {
console.log("Tutor: " + this.nombre + ' cargo: ' +
this.ocupacion);
}
this.saludar = function () {
console.log("Hola soy " + this.nombreCompleto);
}
}
//Creación de un objeto
var uriel = new Tutor("Urial", "Hernández");
uriel.cargo();
Prototype
console.log(uriel.__proto__); // Tutor
console.log(uriel.__proto__.__proto__); // Object es el propotype
padre
Se pueden asignar atributosy métodos fuera del prototipo pero otros objetos del
prototipo no pueden acceder. Son únicos.
rafa.edad=47;
Para que puedan ser accesibles por todos puede usarse prototype
Tutor.prototype.edad=22;
Permite métodos
class Tutor {
constructor(nombre, apellido){
this.nombre = nombre;
this.apellido = apellido;
}
nomCommpleto() {
return this.nombre + ' ' + this.apellido;
}
}
console.log(tutor.nomCommpleto());
Objetos
Cuando se usa un punto para acceder al método del objeto, this se refiere al objeto a la
izquierda del punto.
Herencia
Super()
La función super() ejecuta el método con el mismo nombre desde el que se está
llamando a super().
Getters y Setters
Métodos estáticos
Se pueden llamar sin crear una instancia de la clase. Se accede con el nombre de la
clase.
Collator
NumberFormat
Formato moneda
DateTimeFormat
EJEMPLOS
Cuenta atrás
<script type="text/javascript">
function muestraCuentaAtras(){
var horas, minutos, segundos;
var ahora = new Date();
var fechaExpiracion = new Date($fecha);
var falta = Math.floor( (fechaExpiracion.getTime() - ahora.getTime()) / 1000 );
if (falta < 0) {
cuentaAtras = '-';
}
else {
horas = Math.floor(falta/3600);
falta = falta % 3600;
minutos = Math.floor(falta/60);
falta = falta % 60;
segundos = Math.floor(falta);
cuentaAtras = (horas < 10 ? '0' + horas : horas) + 'h '
+ (minutos < 10 ? '0' + minutos : minutos) + 'm '
+ (segundos < 10 ? '0' + segundos : segundos) + 's ';
setTimeout('muestraCuentaAtras()', 1000);
}
document.getElementById('tiempo').innerHTML = '<strong>Faltan:</strong> ' +
cuentaAtras;
}
muestraCuentaAtras();
</script>