Documentos de Académico
Documentos de Profesional
Documentos de Cultura
ESTRUCTURAS DE
ALMACENAMIENTO EN
MEMORIA
[Subtítulo del documento]
[FECHA]
[NOMBRE DE LA COMPAÑÍA]
[Dirección de la compañía]
Introducción
o Principales diferencias entre los lenguajes compilados e interpretados.
o Operadores en JavaScript
o Apoye todas las argumentaciones con imágenes ilustrativas y no olvide referenciar las fuentes
de información utilizadas.
DESARROLLO
Lenguajes compilados
La diferencia entre lenguajes compilados e interpretados está contenida en la forma en
que interactúan con el ordenador. Es una noción común que los ordenadores se expresan
y entienden el código binario, pero antes hablé claramente de funciones escritas en inglés
(print). Bueno, en un lenguaje compilado estas funciones, a menudo llamadas por la
terminología inglesa, son convertidas en ensamblador por el compilador y posteriormente
ensambladas en lenguaje binario para que la PC pueda leerlas.
Sin embargo, el Assembly es un código que varía según la familia de
procesadores, por lo que es muy costoso en términos de tiempo y energía escribir
un programa para cada código Assembly. Por tanto, la solución pasa por escribir
un programa de alto nivel que pueda ser universal. Sin embargo, el problema
sigue siendo que para realizar cambios tendrás que acceder al código fuente,
cambiar el necesario y volver a convertirlo
El lenguaje compilado necesita que antes de ser ejecutada una compilación se
convierta el código fuente escrito a un lenguaje de máquina
El código creado debe traducirse de manera que el procesador del computador o
smartphone pueda comprenderlo, a este proceso se le llama compilación
Lenguajes interpretados
Para proceder a la explicación de esta segunda familia de lenguajes nos referiremos
a la propia etimología, Interpretada. El proceso de interpretación consiste en la
traducción de un idioma a otro idioma, en este es la traducción del idioma elegido al
idioma binario para que la PC pueda leerlo y ejecutarlo.
https://aulab.es/noticia/18/diferencia-entre-lenguajes-de-programacion-compilados-
e-interpretados
https://sena.territorio.la/content/index.php/institucion/Titulada/institution/SENA/Tec
nologia/228118/Contenido/OVA/CF14/index.html#/curso/tema1
#1 Encadenamiento opcional en
JavaScript con el operador «?.»
El operador de encadenamiento opcional permite acceder de forma simplificada a
los atributos de un objeto cuando este puede ser undefined o null. Por ejemplo,
supón que tienes un objeto como el siguiente:
const toni = {
name: 'Antonio',
details: {
age: 35,
},
};
El problema que tenemos en la función anterior, y que seguro que has sufrido en
tus carnes, es que no siempre te pasan un objeto válido.
Si person o person.details es undefined, la función anterior devolvería un error:
getAge( toni ); // 35
getAge( {} ); // Uncaught TypeError: person.details is undefined
Esta solución, aunque efectiva, tiene un gran defecto: hemos pasado de algo
sencillo a un «monstruo» lleno de comprobaciones previas que dificultan la
inteligibilidad de nuestro código. Para simplificarlo, lo único que debemos hacer es
usar el operador de encadenamiento opcional ?.:
con lo que nos ahorramos las salvaguardas y evitamos que el código pete si
alguna de las propiedades intermedias es undefined o null.
Por ejemplo, supón que tenemos un selector en nuestro store de Redux que nos
permite recuperar un valor definido por el usuario. Si el usuario aún no ha definido
ningún valor, en el store lo mismo tenemos un undefined, con lo que podemos
usar || para asignarle un valor por defecto:
Veamos qué valores nos devuelve la función según los setValue que haya hecho
el usuario:
// No setValue( x )...
getValue(); // 5
setValue( 2 );
getValue(); // 2
setValue( 1 );
getValue(); // 1
setValue( 0 );
getValue(); // 5
// No setValue( x )...
getValue(); // 5
setValue( 2 );
getValue(); // 2
setValue( 1 );
getValue(); // 1
setValue( 0 );
getValue(); // 0
Por cierto, este operador puede usarse, como la mayoría de los demás
operadores, junto con el operador de asignación. Por ejemplo, esta expresión:
value = value ?? 5;
#3 Promises y funciones
asíncronas
Las promises son un mecanismo que permite simplificar nuestro código cuando
trabajamos con operaciones asíncronas, esto es, operaciones cuyo resultado no
podemos obtener de forma immediata. Por ejemplo, si queremos recuperar un
dato de nuestro servidor, está claro que la respuesta no será instantánea, puesto
que tenemos que esperar a que el servidor reciba la petición, la procese y nos
envíe la respuesta.
jQuery.ajax( {
url: 'https://server.com/wp-json/wp/users/1',
success: ( user ) => {
console.log( user );
},
} );
Cuando se trata de una única petición, usar callbacks es una solución sencilla y
relativamente elegante. El problema es que es muy fácil que degenere. Si
queremos, por ejemplo, recuperar dos usuarios en lugar de uno, lo mismo
empezamos a tener callbacks anidados dentro de otros callbacks:
jQuery.ajax( {
url: 'https://server.com/wp-json/wp/v2/users/1',
success: ( user1 ) => {
jQuery.ajax( {
url: 'https://server.com/wp-json/wp/v2/users/2',
success: ( user2 ) => {
console.log( user1, user2 );
},
} );
},
} );
Para solucionar este problema aparecieron las promises. La idea detrás del
concepto de promises es muy sencilla: en aquellos casos en los que obtener un
resultado no es immediato (como, por ejemplo, cuando recuperamos algo del
servidor), una promise en JavaScript es un objeto que sí podemos devolver al
instante que sirve como «promesa» de que, en un futuro, el resultado estará
disponible.
Por ejemplo, el primer código que hemos visto, escrito usando promises, sería tal
que así:
Como ves, la petición usando la librería wp.apiFetch devuelve una promise que
podemos asignar directamente a una variable. Luego, lo único que tenemos que
hacer es pasar un callback a la promise para recuperar el valor. Lo mismo estás
pensando que esto no es muy diferente a lo que hacíamos hasta ahora… pero la
ventaja es que, como te decía, nos permite ahorrar el código spaghetti:
¿Has visto? Acabamos de lanzar dos peticiones en paralelo para recuperar los
usuarios 1 y 2 y luego, usando Promise.all, hemos esperado a que ambas
peticiones estuvieran resueltas para acceder a los resultados. No está nada mal,
¿eh?
Pues bien, JavaScript incluye una sintaxis adicional para trabajar con promises y
código asíncrono como si fuera síncrono. Lo único que debes hacer es definir una
función como asíncrona usando la palabra reservada async y, de repente, trabajar
con operaciones asíncronas en su cuerpo se convierte en un juego de niños:
Lo único que debes tener presente es que, cuando defines una operación
como async, el resultado de la misma siempre, siempre, siempre será
una promise (porque, por definición, una función asíncrona es aquella que, en
general, no puede devolverte un resultado en seguida):
let x = 1;
console.log( x ); // 1
x = 2;
console.log( x ); // 2
const y = 1;
console.log( y ); // 1
y = 2; // Uncaught TypeError: invalid assignment to const 'y'
console.log( y ); // 1
En principio puedes pensar que let es muy parecido al antiguo var, ¿no? Ambas
palabras clave permiten declarar una variable cuyo valor podemos cambiar. Pero
existe una diferencia sustancial entre ellos, y es el ámbito de aplicación de una
variable. Con let y const, el ámbito de la variable es el bloque donde se define.
En var, es la función entera.
function fn() {
if ( true ) {
var x = 1;
let y = 2;
const z = 3;
}//end if
console.log( x ); // 1
console.log( y ); // Uncaught ReferenceError: y is not defined
console.log( z ); // Uncaught ReferenceError: z is not defined
}
#5 Transformación de datos
usando JSON.parse
La función JSON.parse permite procesar una cadena de texto en formato JSON y
construir el objeto equivalente. Por ejemplo:
#6 Separador de miles en el
código fuente usando _
El último truco que te traigo hoy es el separador de miles en el código fuente. Hay
una propuesta (actualmente, en fase 4) para permitir escribir los números en
nuestro código fuente de una forma que sea mucho más inteligible para los
humanos. Por ejemplo, ¿qué numeros ves aquí?
10000000000
2189719.25
10_000_000_000
2_189_719.25
https://neliosoftware.com/es/blog/6-caracteristicas-de-javascript-que-debes-
conocer/
• Tipos primitivos.
• Tipos no primitivos.
Tipos primitivos:
El número máximo y mínimo que podemos alcanzar con tipo number es:
→ boolean: El tipo booleano, es un valor lógico que tiene únicamente nos ofrece
dos posibles valores: verdadero y falso.
→ symbol (nuevo en ECMAScript 6): el tipo de dato symbol, lo usaremos para
crear identificadores únicos para objetos. Con ello, queremos decir, que cada objeto
será único (concepto de singleton) y si creamos dos objetos y comparamos sus tipos
el resultado que nos arrojará el console.log será true ya que ambos son de tipo
symbol. En caso de comparar los dos objetos (pese a que contienen lo mismo)
vemos que el resultado es false.
De hecho, hasta si creamos dos objetos sin añadirle valor, podemos ver que el
resultado con ambos operadores es false y false:
→ undefined: el tipo de dato undefined, nos sirve saber que tenemos variables sin
valores asignados.
→ null: es el tipo de dato más complicados de entender. Ya que, pese a que null
es un tipo de datos primitivo, cuando se hace un typeof de un tipo null, la consola
nos devolverá “object “.
Podemos asignar el valor null a cualquier variable, lo que básicamente significa que
está en blanco. Pero tenemos que declararlo nosotros (lo que se conoce como que
el programador tiene una intencionalidad → tener una intención) ya que por defecto
si no especificamos valor, el valor por defecto será undefined (tal y como hemos
visto en el tipo de dato anterior).
Null apunta a un objeto (nulo, dirección inexistente, inválido). Por lo que cuando
hacemos el typeof mostrará object aunque es un objeto de tipo null.
Lo más recomendable es no utilizar este tipo de dato primitivo. Ya que nos podemos
encontrar con muchos problemas. Vamos a ver algunos de ellos:
Para comparar si es null un tipo de dato, no podemos hacer un typeof como hasta
ahora, ya que este, nos devuelve que es de tipo object. Para analizar si el valor de
una variable es null, en este caso, podemos utilizar la comparación de tipo de dato
== (compara si el valor es igual) y de === (compara valor y tipo de dato) y enfretarlo
contra null o contra un valor que sepamos que es null. En este caso, al ser
literalmente iguales tanto en valor como en tipo ambos resultados devuelven true.
Hay que tener mucho cuidado con el operador que utilizamos cuando enfrentemos
un tipo de dato null vs un tipo de dato undefined. Ya que, si comparamos un tipo de
dato null con uno undefined según el tipo de operador que utilicemos en dicha
comparación podremos ver el resultado es uno u otro.
Pero en cambio, si comparamos con el operador === (compara valor y tipo de dato)
vemos que da false porque como ya hemos visto, aunque en valor para JavaScript
sería el mismo (la ausencia de valor), también estamos comparando por tipo de dato
y null vs undefined no son iguales por lo que el resultado arrojado será un false.
JavaScript no se lleva “muy bien” con los null, así que, es mejor no declararlos
y trabajar directamente con valores undefined.
Espero que os hayan quedado un poco más claros los distintos tipos de datos
primitivos ya que esta información nos puede ser de utilizan para trabajar sobre
otros aspectos en JavaScript ¡Un saludo!
https://www.escuelafrontend.com/articulos/los-tipos-primitivos-en-javascript
Operadores en JavaScript
12 * 3 + 4 - 8 / 2 % 3
En este caso primero se ejecutan los operadores * / y %, de izquierda a derecha,
con lo que se realizarían estas operaciones. Primero la multiplicación y luego la
división por estar más a la izquierda del módulo.
36 + 4 - 4 % 3
Ahora el módulo.
36 + 4 - 1
Por último las sumas y las restas de izquierda a derecha.
40 - 1
Lo que nos da como resultado el valor siguiente.
39
De todos modos, es importante darse cuenta que el uso de los paréntesis puede
ahorrarnos muchos quebraderos de cabeza y sobretodo la necesidad de sabernos
de memoria la tabla de precedencia de los operadores. Cuando veamos poco
claro el orden con el que se ejecutarán las sentencias podemos utilizarlos y así
forzar que se evalúe antes el trozo de expresión que se encuentra dentro de los
paréntesis.
Para acabar con el tema de operadores de Javascript básicos nos quedan por ver
el Operador ternario en Javascript y también otro operador un tanto especial,
llamado typeof. En versiones del lenguaje más modernas añadieron más
operadores que podrás conocer en el Manual de Javascript ES6.
https://javadesde0.com/tipos-de-datos-primitivos-en-javascript/
https://desarrolloweb.com/articulos/529.php