Apunte1 Javascript
Apunte1 Javascript
AVANZADO
CLASE 1 : JAVASCRIPT
INTRODUCCIÓN
Front-end vs Back-end
Front-end y back-end son términos que se refieren a la separación de intereses entre una
capa de presentación y una capa de acceso a datos, respectivamente. Pueden traducirse al
español el primero como interfaz, frontal final o frontal y el segundo como motor, dorsal
finalo zaga,aunque es común dejar estos por separado.
En diseño de software el front-end es la parte del software que interactúa con los usuarios y
el back-end es la parte que procesa la entrada desde el front-end. La separación del sistema
en front-ends y back-ends es un tipo de abstracción que ayuda a mantener las diferentes
partes del sistema separadas. La idea general es que el front-end sea el responsable de
recolectar los datos de entrada del usuario, que pueden ser de muchas y variadas formas, y
los transforma ajustándolos a las especificaciones que demanda el back-end para poder
procesarlos, devolviendo generalmente una respuesta que el front-end recibe y expone al
usuario de una forma entendible para este. La conexión del front-end y el back-end es un
tipo de interfaz. 2
ECMAScript
Desde el lanzamiento en junio de 1997 del estándar ECMAScript 1, han existido las
versiones 2, 3 y 5, que es la más usada actualmente (la 4 se abandonó). En junio de 2015 se
cerró y publicó la versión ECMAScript 6. 3
WEB APIs
TIPOS DE DATOS
El último estándar ECMAScript define siete tipos de datos : 5
● Primitivos
● Boolean : true y false.
● null : Una palabra clave especial que denota un valor null. Como JavaScript es
case-sensitive, null no es lo mismo que null, NULL, o cualquier otra variante.
● Undefined : Una propiedad de alto nivel cuyo valor no es definido.
● Number : 42 o 3.14159.
● String : "Hola" , ‘hola’, `hola`
● Symbol (nuevo en ECMAScript 6).
● Object
● Object : { indice : valor } Son matrices ordenadas de manera asociativa de un
valor con un índice.
● Array : [ valor ] Son matrices ordenadas de manera secuencial numérica
ascendente.
● Function : Son objetos con la habilidad de poder ser ejecutados.
● etc...
CONSTRUCTORES
VAR
Las variables inicializadas con el constructor ‘var’ cumplen con los siguientes tres puntos :
● Admiten redeclaración : Es decir que puedo volver a declarar una variable que ya
había sido inicializada:
var a = true
var a = false
var a = true
a = false
● Admite alcance global : Es decir que salvo por los bloques funcionales, una variable
declarada siempre es global, por lo tanto es una propiedad del objeto global window.
if (true) {
var a = true
}
console.log(a)//true
LET
Las variables inicializadas con el constructor ‘vlet’ cumplen con los siguientes tres puntos :
● No admiten redeclaración : Es decir que no puedo volver a declarar una variable que
ya había sido inicializada:
let a = true
let a = false //Error!!!
let a = true
a = false
if (true) {
let a = true
}
console.log(a)//Error!!!
CONST
Las variables inicializadas con el constructor ‘const’ cumplen con los siguientes tres puntos
:
● No admiten redeclaración : Es decir que no puedo volver a declarar una variable que
ya había sido inicializada:
const a = true
const a = false //Error!!!
var a = true
a = false //Error!!!
● No admiten alcance global :Es decir las variables declaradas pertenecen únicamente
al bloque donde se crearon.
if (true) {
const a = true
}
console.log(a)//Error!!!
const obj = {
x : 1,
y : 2
}
obj.x = 10 // {x:10,y:2}
Notación de corchete
obj["x"]//1
Notación de punto
obj.x // 1
● Índice variable : No puedo ingresar a un elemento usando una variable como índice.
ITERACIONES
for(let i in obj){}
El bucle for...in es ideal para recorrer una matriz asociativa, osea un objeto literal cualquiera.
FUNCIONES FLECHA
La expresión de función flecha tiene una sintaxis más corta que una expresión de función
convencional y no vincula sus propios this, arguments, super, o new.target. Las funciones
flecha siempre son anónimas. Estas funciones son funciones no relacionadas con métodos
y no pueden ser usadas como constructores. 10
Las funciones flecha tienen muchas variantes para poderlas escribir, las cuales vamos a ir
viendo a lo largo del curso 11. Por el momento vamos a nombrar una muy útil :
BOM y DOM
console.log("Soy Global!")
//Nunca decimos
De hecho, es tan global que todas las variables que escribimos sueltas en nuestros archivos
van a ir a parar, a menos que les digamos lo contrario, a window! :
var a = true
console.log(a)//true
console.log(window.a)//true
Dentro de este objeto tenemos muchas propiedades que vamos a ir viendo a lo largo del
curso pero para ir mencionando algunas que podríamos llegar a usar para escribir front-end
podríamos mencionar cosas como :
window.innerHeight // Alto del documento abierto
window.innerWidth // Ancho del documento abierto
//Los inner* no toman en cuenta la consola de
desarrollo, barras de scroll, barra de navegación, etc.
window.outerHeight // Alto de todo el navegador
window.outerWidth // Ancho de todo el navegador
//Los outer* toman en cuenta absolutamente todo en el
navegador
window.location.href // Variable que controla la
direccion de la barra de navegacion
window.console // Objeto interfaz de la API Console. En
el tenemos la popular función log
window.alert // Para notificaciones de alerta
window.confirm // Para ventanas de confirmación
window.prompt // Para ventanas de ingreso de texto
window.history // Para revisar el estado de historial de
navegación del cliente
window.document // Para acceder a información relativa
del documento abierto
Crear un nodo 7
let h1 = document.createElement("h1")
document.getElementById(id);
document.getElementsByClassName(names);
Element.getElementsByTagName(name);
Element.querySelector(selectors8);
Element.querySelectorAll(selectors);
Tener en cuenta que si optamos por usar los métodos nuevos, tenemos las ventaja de poder
usar selectores de nodos mucho más avanzados que solo por ID o por nombre de etiqueta
HTML.
Editar un nodo
Cada nodo, desde document en adelante, va a ser una referencia de alguna etiqueta de
HTML y por consiguiente, los atributos de HTML se ven reflejados como las propiedades de
cada nodo cada vez que seleccionamos o creamos uno nuevo; además existe otro lugar en
donde se almacenan los atributos de HTML con su valor inicial y es la propiedad .attributes
de cada nodo. La mayoría de los atributos de HTML se inicializan en cada nodo con el
mismo nombre aunque algunos tienen un nombre distinto por cuestiones de nombres
reservados. Entonces si quisiera modificar el atributo ID de HTML de algún nodo podría :
let h1 = document.createElement("h1")
h1.id = "titulo"
console.log(h1) // <h1 id="titulo"></h1>
Hay propiedades que nos presentan alguna complejidad extra a veces . Podríamos
mencionar la de el atributo CLASS y DATA-* . Si uno quisiera manipular las clases de una
etiqueta de HTML tendría que usar la propiedad .className la cual guarda un string con el o
las clases registradas que tenga esa etiqueta hasta ese momento. Por lo tanto, agregar o
remover clases re volvería una tarea demasiado tediosa para realizar a mano. Por lo que
Javascript nos brinda facilidades como por ejemplo :
h1.classList.add("clase1")
h1.classList.remove("clase1")
h1.classList.toggle("clase1")
De esta forma tenemos una manera más conveniente de manipular clases. De esta misma
forma también podemos observar el caso de los atributos data :
<h1 data-type="title">Titulo</h1>
let h1 = document.createElement("h1")
console.log(h1.dataset)
h1.dataset.type = "nuevoTipo"
Para poder manipular este tipo de atributos también tenemos una interfaz JSON más
funcional.
Cada nodo por si solo tiene la habilidad de incorporar y remover nodos de su propio interior,
es decir que todos van a tener un método que corresponde a cada operación :
element.appendChild(Child);
Este método nos permite agregar un nodo cualquiera dentro de otro que hayamos
seleccionado previamente. Por ejemplo, si quisiéramos agregar una nueva etiqueta que
creamos a una que ya teníamos escrita en HTML podríamos hacer lo siguiente :
Y luego en mi script :
Si tuviera que agregar muchos elementos al mismo tiempo solo puedo hacerlos uno por
uno, no admite ingreso de múltiples nodos en simultáneo.
Por otro lado si quisiera remover un nodo existente podría realizar algo como esto en el
HTML :
<div id="cont">
<p>lorem ipsum</p>
</div>
const p = document.querySelector("p")
const parent = p.parentNode
parent.removeChild(p)
DOCUMENT FRAGMENT
El DOM es una estructura que tiene sus reglas. Una regla principal es esta: “Se deben
minimizar al máximo la cantidad de cambios en el DOM”. Es decir, que si debo elegir entre
hacer un cambio para incluir 10 ítems o hacer 10 cambios para incluir 1 ítem cada vez, debo
elegir siempre la primera. Sin embargo, hasta ahora no disponemos de una estructura que
nos permita incluir varios items de un solo impacto al DOM. Ahí es cuando el
DocumentFragment entra en acción. Un DocumentFragment es un DOM temporal en el cual
puedo hacer cambios (como agregar elementos). Al hacer esos cambios, no estoy
impactando en el DOM real. Finalmente, cuando el DocumentFragment tenga los elementos
deseados, se puede realizar un solo appendChild en un elemento del DOM real para incluir
todos estos elementos de un solo cambio
const f = document.createDocumentFragment()
1. https://developer.mozilla.org/es/docs/Web/JavaScript
2. https://es.wikipedia.org/wiki/Front-end_y_back-end
3. https://es.wikipedia.org/wiki/ECMAScript
4. https://developer.mozilla.org/es/docs/WebAPI
5. https://developer.mozilla.org/es/docs/Web/JavaScript/Data_structures
6. JSON : Javascript Object Notation
7. Nodo : Es una etiqueta de HTML pero referenciada desde el punto de vista de Javascript
8. https://drafts.csswg.org/selectors/
9. https://caniuse.com/#search=getelements
10. https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Funciones/Arrow_functi
ons