Programacion en Javascript
Programacion en Javascript
Programacion en Javascript
Aquí aprenderá a utilizar objetos, matrices y funciones. Además, conocerá los métodos
incorporados más comunes y la diferencia entre cadenas indefinidas, nulas y vacías. Y
explorará tanto el manejo de errores como la programación defensiva.
Hágase responsable
Cuénteles a sus amigos los cursos que está realizando, publique sus logros en sus
cuentas de las redes sociales o publique en un blog sus tareas. Contar con una
comunidad y una red de apoyo de amigos y familiares que le animen marca la diferencia
Consejo: Mientras ve una clase en Coursera, puede hacer clic en el botón "Guardar
nota" situado debajo del vídeo para guardar una captura de pantalla en sus notas del
curso y añadir sus propios comentarios.
Únase a la discusión
Los foros de discusión del curso son un lugar estupendo para hacer preguntas sobre las
tareas, discutir temas, compartir recursos y hacer amigos. Nuestras investigaciones
demuestran que los alumnos que participan en los foros de debate tienen un 37% más de
probabilidades de completar un curso. Así que ¡haga un post hoy mismo!
Comentarios en JavaScript
He elegido los comentarios como punto de partida por dos razones:
1
// this is a comment!
1
2
3
4
5
6
7
/*
this
is
a
multi-line
comment
*/
1
/* this is a multi-line comment on a single line */
Por qué es útil escribir comentarios
En este curso, se asume que usted nunca ha escrito una sola línea de
código JavaScript.
La verdad es que la mayoría de las veces, puede pensar que añadir punto
y coma en JavaScript es opcional - y algo así como una preferencia
estilística.
Una vez que haya instalado el navegador y lo ejecute, haga clic con el
botón derecho del ratón en la página web activa en ese momento y haga
clic en el comandoInspect del menú contextual del botón derecho.
1
console.log("Hello, World");
Si ha hecho todo según las instrucciones, las palabras "Hola, Mundo"
deberían salir en la consola.
1
console.log("%cHello, World", "color: blue; font-size: 40px");
Si añade el%c justo después del carácter", podrá dar estilo a la salida de
la consola añadiendo el carácter, después del segundo"y luego, dentro de
otro par de caracteres" y", utilizar código CSS válido para dar estilo a las
palabras que desea que salgan en la consola.
Operadores en profundidad
Estado: Traducido automáticamente
del Inglés
Traducido automáticamente del
Inglés
En esta lectura, aprenderá sobre operadores adicionales, precedencia de operadores y
asociatividad de operadores. También le proporcionaré algunos ejemplos de operadores
lógicos.
1. Operadores adicionales
Operador lógico AND:&&
Operador lógico OR:||
Operador lógico NOT:!
El operador módulo:%
El operador de igualdad ==
El operador de igualdad estricta: ===
El operador de desigualdad: !=
El operador de desigualdad estricta: !==
El operador de asignación de suma:+=
El operador de asignación de concatenación:+=(es el mismo que el anterior - más
sobre esto más adelante)
El operador lógico AND en JavaScript:&&
El operador lógicoAND se utiliza, por ejemplo, para confirmar si varias comparaciones
devolverán verdadero.
1
2
var currentTime = 10;
console.log(currentTime > 9 && currentTime < 17);
¿Cómo funciona este código?
currentTime > 9
currentTime < 17
1
console.log(10 > 9 && 10 < 17);
La comparación de10 > 9 devolverátrue.
Esto significa que puedo reescribir aún más la línea dos de mi solución de la siguiente
manera:
1
console.log(true && true);
En esencia, así es como funciona mi código.
Para entender la respuesta, necesita conocer el comportamiento del operador lógico &&.
1
2
var currentTime = 7;
console.log(currentTime < 9 || currentTime > 17);
En la línea uno del código asigno el número7 a la variablecurrentTime.
1
2
var currentTime = 7;
console.log(true || false);
Estas son las reglas de cómo el operador|| evalúa los valores dados:
console.log(false || true)salida:true
Volviendo al ejemplo de comprobar sicurrentTime < 9 ocurrentTime > 17, esto tiene sentido:
la única vez que obtendráfalse es cuando el valor almacenado en la variablecurrentTime
sea mayor que9 y menor que17.
Puede pensar en el operador! como un interruptor, que invierte el valor booleano evaluado
detrue afalse y defalse atrue.
...entonces puedo registrar por consola el hecho de que la mascota ya no tiene hambre
utilizando el operador ! para voltear el valor booleano almacenado dentro de la variable
petHungry, de esta forma:
1
2
3
4
Pet is hungry: true
Feeding the pet
Pet is hungry: false
true
La razón del cambio de salida en la consola es porque ha volteado el valor almacenado
dentro de la variablepetHungry, detrue afalse.
Observe, sin embargo, que el código de la línea cinco del ejemplo anterior sigue dando
como salidatrue- eso se debe a que no he reasignado el valor de la variablepetHungry.
He aquí cómo podría cambiar permanentemente el valor almacenado en la
variablepetHungry detrue afalse:
1
2
var petHungry = true;
petHungry = !petHungry;
En este ejemplo, primero asigno el valor detrue a la nueva variable depetHungry. Después,
en la línea dos, asigno el valor opuesto, el!true- léase: no verdadero - a la variable
existentepetHungry.
El operador módulo:%
El operador módulo es otro operador matemático en JavaScript. Devuelve el resto de una
división.
Para demostrar cómo funciona, imagine que un pequeño restaurante que tiene 4 sillas por
mesa, y un total de 5 mesas, recibe de repente 22 comensales.
1
console.log(22 % 5); // 2
El resultado es2, es decir, cuando divido22 y5, obtengo un4, y el resto es2, es decir, hay2
personas que no han podido conseguir un sitio en este restaurante.
El operador de igualdad,==
El operador de igualdad comprueba si dos valores son iguales.
Además, aunque uno de los valores comparados sea de tipo número y el otro de tipo
cadena, el valor devuelto sigue siendo true: 5 == "5".
Esto significa que el operador de igualdad sólo compara los valores, pero no los tipos.
Con el operador de igualdad estricta, la comparación 5 === 5 sigue devolviendo true. Los
valores a cada lado del operador de igualdad estricta tienen el mismo valor y el mismo tipo.
Sin embargo, comparar 5 == "5" devuelve ahora false, porque los valores son iguales, pero
el tipo de datos es diferente.
El operador de desigualdad,!=
El operador de desigualdad comprueba si dos valores no son iguales, pero no comprueba
la diferencia de tipos.
Por ejemplo, 5 != "5" devuelve falso, porque es falso afirmar que el número 5 no es igual al
número 5, aunque este otro número sea del tipo de datos cadena.
Por ejemplo, 5 !== 5 devuelve false porque es falso que el número 5 no tenga el mismo
valor y tipo de datos que otro número 5.
1
console.log(5 !== "5")
Sin embargo, el operador+ también se utiliza para unir tipos de datos de cadenas.
Por ejemplo:
1
2
"inter" + "net" // "internet"
"note" + "book" // "notebook"
Si el operador+ se utiliza para unir cadenas, entonces se denomina operador
deconcatenación, y se dirá que se utiliza paraconcatenar cadenas.
He aquí un ejemplo:
1
2
3
365 + " days" // "365 days"
12 + " months" // "12 months"
1
1 + "2"
¿Cuál será el resultado de1 + "2"?
Observe que el valor de1 es del tipo de datos número, y el valor de"2" es del tipo de datos
cadena, por lo que JavaScript coaccionará el número1 a una cadena de"1", y luego lo
concatenará con la cadena de"2", por lo que el resultado será una cadena de"12".
No tiene que especificar el tipo de trabajo, sólo quiere contar el total de horas.
1
2
3
4
5
6
var mon = 1;
var tue = 2;
var wed = 1;
var thu = 2;
var fri = 3;
console.log(mon + tue + wed + thu + fri); // 9
Puede simplificar el código anterior utilizando el operador de asignación de suma, como se
indica a continuación:
1
2
3
4
5
6
var overtime = 1;
overtime += 2;
overtime += 1;
overtime += 2;
overtime += 3;
console.log(overtime); // 9
El uso del operador de asignación de suma reduce las líneas de su código.
1
2
3
4
5
6
7
var longString = "";
longString += "Once";
longString += " upon";
longString += " a";
longString += " time";
longString += "...";
console.log(longString); // "Once upon a time..."
1
1 * 2 + 3
El resultado del código anterior es 5, porque el operador de multiplicación tiene
precedencia sobre el operador de suma.
EjecutarRestablecer
A continuación, debe escribir un fragmento de código que pueda utilizarse para determinar
si el juego ha terminado, en función de si el valor de la variable timeRemaining es 0 o el
valor de la variable energy es 0.
EjecutarRestablecer
Pruebe a cambiar la variable timeRemaining por cualquier valor superior a 0 y vea cómo
afecta al resultado.
Para realizar esta tarea, necesita declarar seis variables, como se indica a continuación:
EjecutarRestablecer
Inténtelo usted mismo con diferentes valores para explorar el operador módulo.
Nota: Esta tarea debe completarse en una sola línea de código. La salida en la consola
debe ser 15.
1
EjecutarRestablecer
1. La primera variable debe ser una cadena con el siguiente valor: "Now in ". Nombre
la variable now.
2. La segunda variable debe ser un número con el valor: 3. Nombre la variable three.
3. La tercera variable debe ser una cadena con el siguiente valor: "D!". Nombre la
variable d.
4. Registre en la consola el siguiente código: now + three + d.
Nota: La salida esperada debería ser: "Now in 3D!".
EjecutarRestablecer
Mejoras en JavaScript
Estado: Traducido automáticamente
del Inglés
Traducido automáticamente del
Inglés
En esta lectura, conocerá la historia de JavaScript y la importancia de ECMA (Asociación
Europea de Fabricantes de Ordenadores) y ECMAScript.
Fue creado en tan sólo 10 días en 1995 por una sola persona, Brendan Eich, a quien se le
encargó construir un lenguaje de scripting sencillo para utilizarlo en la versión 2 del
navegador Netscape. Inicialmente se llamó LiveScript, pero como el lenguaje Java era tan
popular en aquella época, se cambió el nombre a JavaScript, aunque Java y JavaScript no
están relacionados en modo alguno.
Durante los primeros años, tras su creación, JavaScript fue un simple lenguaje de scripting
para añadir efectos mouseover y otra interactividad. Esos efectos se añadían a las páginas
web mediante el elemento HTML<script>.
Dentro de cada uno de los elementos script, podía haber algo de código JavaScript.
Debido a la regla de que HTML, CSS y JavaScript deben ser retrocompatibles, incluso el
código más avanzado escrito en JavaScript hoy en día acaba escribiéndose entre esas
etiquetas script.
Con el paso de los años, JavaScript se hizo cada vez más potente y, en los últimos
tiempos, no ha dejado de figurar entre los tres lenguajes más utilizados.
Se puede pensar en un estándar como una forma acordada de cómo deben funcionar las
cosas. Así, ECMA-262 es un estándar que especifica cómo debe funcionar el lenguaje
JavaScript.
Tradicionalmente, el único entorno en el que era posible ejecutar un motor JavaScript, era
el navegador. Más concretamente, un motor JavaScript no era más que otro bloque de
construcción del navegador. Estaba ahí para ayudar a un navegador a cumplir el objetivo
de sus usuarios de utilizar Internet para trabajar, investigar y jugar.
Así pues, cuando los desarrolladores escriben código JavaScript, lo hacen para interactuar
con un motor JavaScript. Dicho de otro modo, los desarrolladores escriben código
JavaScript para poder "hablar con" un motor JavaScript.
Además, el propio motor JavaScript viene con diferentes formas de interactuar con otras
partes del navegador. Éstas se conocen como API del navegador.
Aunque tradicionalmente sólo era posible interactuar con el motor JavaScript dentro del
navegador, todo esto cambió en 2009, cuando Ryan Dahl creó Node.js.
Tanto if else como switch se utilizan para determinar el flujo de ejecución del programa
en función de si se han cumplido o no algunas condiciones.
Por eso a veces se las denomina sentencias de control de flujo. En otras palabras,
controlan el flujo de ejecución de su código, de forma que parte del código puede
omitirse, mientras que otra parte puede ejecutarse.
Por lo general, if else es más adecuada si existe una opción binaria en la condición.
Por ejemplo, en lenguaje llano:si hace sol, póngase gafas de sol. Si no, no las lleve.
1
2
3
4
5
6
7
8
9
10
if(light == "green") {
console.log("Drive")
} else if (light == "orange") {
console.log("Get ready")
} else if (light == "red") {
console.log("Dont' drive")
} else {
//this block will run if no condition matches
console.log("The light is not green, orange, or red");
}
Sin embargo, si hay muchos resultados posibles, la mejor práctica es utilizar una
sentencia switch porque es más fácil menos verbosa. Al ser más fácil de leer, es más
sencillo seguir la lógica y, por tanto, se reduce la carga cognitiva de leer múltiples
condiciones.
Para reforzar este punto, he aquí un ejemplo de la anterior sentencia condicional if else,
utilizando la sintaxis switch:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//converting the previous if-else example with switch-case
switch(light) {
case 'green':
console.log("Drive");
break;
case 'orange':
console.log("Get ready");
break;
case 'red':
console.log("Don't drive");
break;
default:
//this block will run if no condition matches
console.log('The light is not green, orange, or red');
break;
}
Tenga en cuenta que mantendremos esta discusión a alto nivel porque hay múltiples
"piezas del rompecabezas" que aún faltan para su comprensión en este punto.
Por eso no nos enfrascaremos en los detalles de la sintaxis y la implementación, sino que
simplemente discutiremos cómo y por qué se utilizan los bucles en el trabajo diario de los
desarrolladores de JavaScript.
Considere el siguiente ejemplo: Usted trabaja como desarrollador para una tienda en línea.
La tienda vende cubos de letras para niños pequeños, y toda la sección "Compre ahora"
del sitio está organizada en un diseño en el que cada cubo a la venta se muestra en un
simple componente de tarjeta, con una imagen del cubo, la letra que enseña, una breve
descripción y el precio.
Las tarjetas están organizadas en filas, de modo que cada fila contiene tres tarjetas, tres
letras diferentes.
Cada tarjeta es una vista previa de ese cubo de letras específico a la venta, y también es
un enlace a una página entera, dedicada a proporcionar más información sobre los cubos,
su valor didáctico, y a proporcionar al visitante una forma de completar su proceso de
compra.
Ahora, he aquí una pregunta rápida: ¿dónde encajarían los bucles para mostrar esta
cuadrícula de tarjetas con los cubos de letras en oferta?
Para entender cómo funciona esto, permítame codificar un prototipo básico de cómo
podría funcionar.
Como todavía no tiene los conocimientos suficientes para mostrar diseños de sitios web en
el navegador con la ayuda de JavaScript, por ahora tendré que conformarme con utilizar
una simple cadena y la consola.
1
2
3
4
5
6
var cubes = 'ABCDEFG';
//styling console output using CSS with a %c format specifier
for (var i = 0; i < cubes.length; i++) {
var styles = "font-size: 40px; border-radius: 10px; border: 1px solid
blue; background: pink; color: purple";
console.log("%c" + cubes[i], styles)
}
EjecutarRestablecer
Nota: Para que se apliquen los estilos, intente ejecutar este fragmento de código en la consola de
su navegador.
Eso es, con este simple código, la salida en la consola muestra cada letra en una línea
separada, con el estilo de un cubo de letras para niños pequeños.
Así que esto me da el número 7, haciendo que mi bucle for tenga este aspecto:
1
2
3
4
5
6
var cubes = 'ABCDEFG';
//styling console output using CSS with a %c format specifier
for (var i = 0; i < 7; i++) {
var styles = "font-size: 40px; border-radius: 10px; border: 1px solid
blue; background: pink; color: purple";
console.log("%c" + cubes[i], styles)
}
La segunda pieza de código que es nueva aquí es el fragmentocubes[i].
Esto simplemente se dirige a cada letra individual en el bucle, basado en el valor actual de
la variablei.
Esto continúa durante tantos bucles como ejecute mi bucle for - y esto viene determinado
por el valorcubes.length.
También es muy versátil, ya que, si yo, por ejemplo, decidiera cambiar la longitud de la
cadenacubes, no tendría que actualizar la condición dei < cubes.length, porque se actualiza
automáticamente cuando cambio la longitud de la cadenacubes.
Existen otras formas de almacenar datos en aplicaciones JavaScript de las que no ha oído
hablar.
Pero podemos utilizar el mismo enfoque con esos otros tipos de datos, para conseguir
resultados que esencialmente funcionan según el mismo principio que el que acabamos de
describir.
Utilizar bucles con datos formateados adecuadamente para una tarea determinada es un
componente crucial de la construcción de software.
En las lecciones que siguen, aprenderemos distintas formas de agrupar datos relacionados
y de mostrarlos en pantalla utilizando JavaScript.
Cuando se combina con lo que ya ha aprendido sobre bucles, esto le proporciona las
habilidades necesarias para construir varios tipos de interfaces de usuario en las que haya
información repetitiva.
hacer un bucle sobre los títulos de las entradas de un blog en algunos datos
estructurados, y mostrar cada título de entrada de blog en la página de inicio de un
blog
recorrer en bucle las publicaciones de las redes sociales en algunos datos
estructurados y mostrar cada una de ellas en función de determinadas condiciones
realizar un bucle sobre algunos datos estructurados sobre la ropa disponible para
la venta en una tienda de ropa en línea, y mostrar los datos pertinentes para cada
artículo de ropa
Ahora comprende la importancia de saber trabajar con bucles en JavaScript. En las
próximas lecciones, aprenderemos otra información relevante que le permitirá ser capaz
de hacer esto.
1
2
3
function listArrayItems(arr) {
// ... code to be added ...
}
Así pues, he declarado una funciónlistArrayItems, y la he configurado para que acepte
un único parámetro,arr- que significa matriz.
Ahora, necesitaré codificar un bucle for para hacer un bucle sobre un array.
Como ya hemos visto en lecciones anteriores de este curso, un bucle for necesita la
siguiente información:
2. la condición de salida (el valor máximo de la variable contador del bucle i, por encima
del cual el bucle deja de ejecutarse)
Esto significa que tendré un mapeo uno a uno del valor actual de la variablei en
cualquier momento dado, correspondiente a la misma posición de índice de cualquier
elemento de la matrizarr 2.
La condición de salida del bucle for es cuando el valor dei es igual o mayor
quearr.length.
Esto significa prácticamente que la condición de salida de este bucle for serái <
arr.length devolviendofalse.
En otras palabras, mientrasi < arr.length sea verdadero, este bucle for continuará
ejecutándose. 3. Para asegurarme de que no se salta ninguno de los elementos de la
matrizarr, tengo que incrementar el valor dei en1 después de cada bucle.
Ahora que sé exactamente cómo debe comportarse mi bucle for, puedo añadirlo a mi
funciónlistArrayItems():
1
2
3
4
5
function listArrayItems(arr) {
for (var i = 0; i < arr.length; i++) {
// ... code pending here ...
}
}
Ahora sólo me queda decidir cómo quiero dar salida a cada elemento de la matrizarr
recibida.
Puede ser tan sencillo como registrar en la consola el índice de elemento del array del
valor actual dei:
1
2
3
4
5
function listArrayItems(arr) {
for (var i = 0; i < arr.length; i++) {
console.log(arr[i]) //display the array item where the index is e
uqal to i
}
}
1
2
var colors = ['red', 'orange', 'yellow', 'green', 'blue', 'purple', 'pink
'];
listArrayItems(colors); //display all items in the array at once
La salida será:
1
2
3
4
5
6
7
red
orange
yellow
green
blue
purple
pink
Puedo actualizar la salida como quiera. Por ejemplo, aquí están mis elementosarr con
un número delante de cada elemento:
1
2
3
4
5
6
7
8
//function that takes an array as input and display all items of this arr
ay
function listArrayItems(arr) {
for (var i = 0; i < arr.length; i++) {
console.log(i, arr[i])
}
}
var colors = ['red', 'orange', 'yellow', 'green', 'blue', 'purple', 'pink
'];
listArrayItems(colors);
1
2
3
4
5
6
7
0 'red'
1 'orange'
2 'yellow'
3 'green'
4 'blue'
5 'purple'
6 'pink'
Para iniciar el recuento desde uno en lugar de cero, puedo actualizar mi declaración de
función de la siguiente manera:
1
2
3
4
5
function listArrayItems(arr) {
for (var i = 0; i < arr.length; i++) {
console.log(i+1, arr[i])
}
}
1
2
3
4
5
6
7
8
9
function listArrayItems(arr) {
for (var i = 0; i < arr.length; i++) {
if (arr[i] == 'red') {
console.log(i*100, "tomato!")
} else {
console.log(i*100, arr[i])
}
}
}
1
2
3
4
5
6
7
0 'tomato!'
100 'orange'
200 'yellow'
300 'green'
400 'blue'
500 'purple'
600 'pink'
Para poder acceder a este literal de objeto, es muy común asignarlo a una variable,
como:
1
var user = {}; //create an object
1
2
3
4
5
6
7
8
9
//creating an object with properties and their values
var assistantManager = {
rangeTilesPerTurn: 3,
socialSkills: 30,
streetSmarts: 30,
health: 40,
specialAbility: "young and ambitious",
greeting: "Let's make some money"
}
2. Asignar los valores a cada una de las claves del objeto, utilizando el operador de
asignación,=
Observe que es muy fácil construir cualquier tipo de objeto en JavaScript utilizando esta
sintaxis de ejemplo.
1
2
3
4
5
var table = {
legs: 3,
color: "brown",
priceUSD: 100,
}
1
console.log(table);//display the object in the developer console
1
{legs: 3, color: 'brown', priceUSD: 100}
1
console.log(table.color); // 'brown'
Ahora que tengo esta "receta sintáctica", puedo construir cualquier otro objeto de forma
similar:
1
2
3
4
5
var house = {
rooms: 3,
color: "brown",
priceUSD: 10000,
}
1
2
3
4
var house2 = {};
house2.rooms = 4;
house2.color = "pink";
house2.priceUSD = 12345;
1
2
3
console.log(house); // {rooms: 3, color: "brown", priceUSD: 10000}
house.windows = 10;
console.log(house); // {rooms: 3, color: "brown", priceUSD: 10000, window
s: 10}
1
2
house.windows = 11;
console.log(house); // {rooms: 3, color: "brown", priceUSD: 10000, window
s: 11}
Literales de objeto y la notación de
corchetes
Estado: Traducido automáticamente
del Inglés
Traducido automáticamente del
Inglés
Al final de esta lectura, será capaz de:
Para entender cómo funciona, lo mejor es utilizar un ejemplo, así que volveré a pasar por
el proceso de codificación del objetohouse2, de la misma forma que lo hice con la notación
de puntos, sólo que esta vez, utilizaré la notación de corchetes.
1
2
3
4
5
var house2 = {};
house2["rooms"] = 4;
house2['color']= "pink";
house2["priceUSD"] = 12345;
console.log(house2); // {rooms: 4, color: 'pink', priceUSD: 12345}
Tenga en cuenta que utilizando la notación de corchetes, esencialmente sólo envuelvo la
clave de cada propiedadcomo una cadena, dentro de las comillas simples o dobles - al igual
que con las cadenas regulares.
Antes de tratar el tema de las matrices y los objetos, permítame darle otra información
importante sobre la notación de corchetes.
Con la notación de corchetes, puedo añadir caracteres de espacio dentro de los nombres
de las propiedades, así:
1
2
car["number of doors"] = 4;
console.log(car); // {color: 'green', speed: 100, number of doors: 4}
Además, puedo añadir números (como el tipo de datos cadena) como claves de
propiedades:
1
2
car["2022"] = 1901;
console.log(car); // {2022: 1901, color: 'green', speed: 100, number of d
oors: 4}
Sin embargo, se desaconseja hacer esto, debido a las razones obvias de que tener una
clave de propiedad como una cadena de números no transmite realmente mucha
información útil.
Por último, hay una cosa realmente útil que tiene la notación de corchetes pero que no
está disponible en la notación de puntos: Puede evaluar expresiones.
1
2
3
4
5
6
7
8
9
var arrOfKeys = ['speed', 'altitude', 'color'];
var drone = {
speed: 100,
altitude: 200,
color: "red"
}
for (var i = 0; i < arrOfKeys.length; i++) {
console.log(drone[arrOfKeys[i]])
}
El código anterior dará como resultado la siguiente salida:
1
2
3
100
200
red
Utilizando el hecho de que la notación de corchetes puede evaluar expresiones, accedí a
la propiedadarrOfKeys[i] del objetodrone.
Explicar que las matrices son objetos, con sus propias propiedades y métodos
incorporados
Esbozar la forma habitual de ampliar matrices utilizando el método push()
y explicar cómo recortar el último miembro de una matriz utilizando el método
pop()
Las matrices son objetos
En JavaScript, las matrices son objetos. Eso significa que las matrices también tienen
algunas propiedades y métodos incorporados.
Uno de los métodos incorporados más utilizados en las matrices son los métodospush()
ypop().
1
2
3
var fruits = [];
fruits.push("apple"); // ['apple']
fruits.push('pear'); // ['apple', 'pear']
Para eliminar el último elemento de una matriz, puedo utilizar el método pop():
1
2
fruits.pop();
console.log(fruits); // ['apple']
Enlazando con algunas lecciones anteriores de este curso, ahora puedo construir una
función que tome todos sus argumentos y los introduzca en una matriz, así:
1
2
3
4
5
6
7
function arrayBuilder(one, two, three) {
var arr = [];
arr.push(one);
arr.push(two);
arr.push(three);
console.log(arr);
}
1
arrayBuilder('apple', 'pear', 'plum'); // ['apple', 'pear', 'plum']
1
2
3
4
5
6
7
function arrayBuilder(one, two, three) {
var arr = [];
arr.push(one);
arr.push(two);
arr.push(three);
return arr;
}
1
var simpleArr = arrayBuilder('apple', 'pear', 'plum');
1
console.log(simpleArr); // ['apple','pear','plum']
Para todos los ejemplos, utilizaré una o ambas de las siguientes variables:
1
2
var greet = "Hello, ";
var place = "World"
Tenga en cuenta que cualquiera de las propiedades y métodos sobre cadenas que
demuestre en los siguientes ejemplos, podría haberlos ejecutado sobre esas cadenas
directamente, sin guardarlas en una variable como las que he nombradogreet yplace.
1
greet.length; // 7
Para leer cada carácter individual en un índice específico de una cadena, empezando por
cero, puedo utilizar el métodocharAt():
1
greet.charAt(0); // 'H'
El métodoconcat() une dos cadenas:
1
"Wo".concat("rl").concat("d"); // 'World'
ElindexOf devuelve la ubicación de la primera posición que coincide con un carácter:
1
2
3
"ho-ho-ho".indexOf('h'); // 0
"ho-ho-ho".indexOf('o'); // 1
"ho-ho-ho".indexOf('-'); // 2
EllastIndexOf encuentra la última coincidencia, por lo demás funciona igual que elindexOf.
1
"ho-ho-ho".split("-"); // ['ho', 'ho', 'ho']
También existen algunos métodos para cambiar el casing de las cadenas. Por ejemplo:
1
2
greet.toUpperCase(); // "HELLO, "
greet.toLowerCase(); // "hello, "
Aquí tiene una lista de todos los métodos cubiertos en esta hoja de trucos:
charAt()
concat()
indexOf()
lastIndexOf()
split()
toUpperCase()
toLowerCase()
Métodos de objeto
Estado: Traducido automáticamente
del Inglés
Traducido automáticamente del
Inglés
Es posible que ya esté familiarizado con los objetos en JavaScript.
En este vídeo, aprenderá a diseñar objetos como combinaciones de datos y
funcionalidad.
Como ya sabrá, un objeto consta de pares clave-valor, conocidos como
propiedades.
Podemos añadir nuevos pares clave-valor a objetos existentes utilizando la
notación de punto y el operador de asignación.
1
2
var car = {};
car.color = "red"; //update the value of a property of the car objj
ect
Éstas se conocen como propiedades, y pueden tomar muchos tipos de datos,
incluidas las funciones.
1
2
3
4
5
6
7
8
var car = {};
car.color = "red";
//add a method to the car object so that it can be called as car.tu
rnkey()
car.turnKey = function() {
console.log('engine running');
}
Si la función es una propiedad de un objeto, entonces se denomina método.
Se trata de una función a la que sólo se puede acceder a través del objeto
JavaScript del que es miembro. Por ejemplo, al método log, que pertenece al
objeto consola, sólo se puede acceder a través del objeto consola.
console.log('Hello world');
Exploremos esto más a fondo ahora. Crearé un objeto utilizando algo conocido
como función constructora.
1
2
3
4
var car = {};
car.mileage = 98765;
car.color = "red";
console.log(car);
EjecutarRestablecer
Primero, construiré un nuevo objeto llamado literalmentecar. Escribovar,
espacio,car, espacio, signo igual, espacio, seguido de un conjunto de llaves
rizadas, y finalmente un punto y coma.
Ahora, ampliaré el objetocar asignándole una propiedad llamadamileage.
Cuando inspecciono el objeto, puedo confirmar que contiene una
propiedadmileage asignada a98765.
Quiero añadir otra propiedad al objetocar. Esta vez, añadiré una propiedad
llamadacolor y le asignaré el valor"red".
Puedo volver a inspeccionar el objeto escribiendo su nombre en la consola del
navegador. Así que ahora, cuando escriboconsole.log(car), obtengo un objeto
con dos propiedades: la propiedadmileage, que está establecida en98765, y la
propiedadcolor, establecida en"red".
Genial, ahora he añadido dos propiedades a mi objeto.
A continuación, quiero añadir un método a mi objetocar. Y este método, cuando
sea llamado, mostrará algún texto en la consola.
Así que, una vez más, añado otra propiedad a mi objetocar. Al fin y al cabo, un
método no es más que otra propiedad del objetocar. No es más que otro par
clave-valor que contiene el objeto coche.
Lo que es único es que el valor que le estoy asignando es una función.
1
2
3
4
5
6
7
8
var car = {};
car.mileage = 98765;
car.color = "red";
console.log(car);
car.turnTheKey = function() {
console.log("The engine is running")
}
console.log(car);
EjecutarRestablecer
Así que empiezo escribiendocar puntoturnTheKey, igual, y luego escribo el
código de mi función. Así quefunction, paréntesis abierto-cerrado. Luego las dos
llaves donde colocaré mi código. Por último, dentro de las llaves, escribo el
punto de consola log seguido del mensaje"The engine is running".
Ahora puedo inspeccionar de nuevo mi objetocar escribiendo su nombre en el
método log de la consola. Esta vez, muestra que el objetocar contiene tres
propiedades; la propiedadcolor, la propiedadmileage y la propiedadturnTheKey.
Recuerde que todos los pares clave-valor de un objeto se denominan
simplemente propiedades. Sin embargo, si quiero diferenciar las propiedades
que se pueden ejecutar, entonces me refiero a dichas propiedades como métodos.
Así pues, ahora quiero añadir otro método al objetocar. A éste lo
llamarélightsOn.
Una vez más, escribocar.lightsOn, y luego añado un signo igual, y de nuevo
como es un método, lo estoy asignando a una función. Esta función también
tendrá un registro de consola en su cuerpo, y sólo estoy registrando la cadena
con el texto"The lights are on".
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//example of adding properties and methods to an object
var car = {};
car.mileage = 98765;
car.color = "red";
console.log(car);
car.turnTheKey = function() {
console.log("The engine is running")
}
car.lightsOn = function() {
console.log("The lights are on.")
}
console.log(car);
car.turnTheKey();
car.lightsOn()
EjecutarRestablecer
Ok, así que ahora he añadido cuatro propiedades a mi objeto. Y dos de ellas son
métodos.
Ya me he asegurado de que estoy obteniendo losmileage ycolor correctos de mi
objetocar. Ahora, intentaré ejecutar los métodosturnTheKey ylightsOn.
En primer lugar, invocaré el métodoturnTheKey.
Recuerde que sólo se puede acceder a este método a través del objetocar, por lo
que primero necesito escribir el nombre del objeto que contiene el
métodoturnTheKey. En otras palabras, necesito escribir la palabracar, seguida
de un punto, y luego el nombre de mi método, que esturnTheKey.
Recuerde que esta propiedad es un método. Así que, para ejecutarlo, necesito
añadir un paréntesis de apertura y otro de cierre para que el motor JavaScript
pueda procesar mi código JavaScript.
Observe que el resultado es la cadena"The engine is running" registrada en la
consola.
Ahora probaré el otro método. Una vez más, necesito acceder a él a través del
objetocar, así que escribocar.lightsOn, y de nuevo, necesito añadir esos
paréntesis para invocar el métodolightsOn. Pulso la tecla ENTER y observo que
el texto aparece en la consola.
¡Éxito! Es importante recordar que cuando el motor JavaScript ejecuta esta línea
de código, localiza el objetocar en su memoria. Luego, encuentra el
métodolightsOn en el objetocar. Lee la declaración de la función que está
guardada en esta propiedad y la ejecuta, línea por línea.
Como sólo hay una línea de código, el motor JavaScript registra la cadena"The
lights are on" en la consola.
ReferenceError
SyntaxError
TypeError
RangeError
Existen algunos otros errores en JavaScript. Estos otros errores incluyen
AggregateError
Error
InternalError
URIError
Sin embargo, en esta lectura me centraré en los errores de Referencia, Sintaxis, Tipo y
Rango.
ReferenceError
Un ReferenceError se lanza cuando, por ejemplo, se intenta utilizar variables que no han
sido declaradas en ninguna parte.
Un ejemplo puede ser, digamos, intentar registrar en la consola una variable que no
existe:
1
console.log(username);
1
Uncaught ReferenceError: username is not defined
SyntaxError
Cualquier tipo de código JavaScript no válido provocará un SyntaxError.
Por ejemplo:
1
var a "there's no assignment operator here";
1
Uncaught SyntaxError: Unexpected string
TypeError
Un TypeError se lanza cuando, por ejemplo, se intenta ejecutar un método en un tipo de
datos no soportado.
1
"hello".pop() // Uncaught TypeError: "hello".pop is not a function
El comportamiento tipo array de las cadenas ya se trató en una lección anterior de este
curso.
Sin embargo, como se puede confirmar ejecutando la línea de código anterior, las
cadenas no tienen todos los métodos de array a su disposición, e intentar utilizar algunos
de esos métodos provocará que se lance un TypeError.
RangeError
Un RangeError se lanza cuando estamos dando un valor a una función, pero ese valor
está fuera del rango permitido de valores de entrada aceptables.
He aquí un ejemplo sencillo de conversión de unnúmero cotidiano deBase 10(un
número del sistema decimal común) a unnúmero de Base 2(es decir, un número
binario).
Por ejemplo
1
(10).toString(2); // '1010'
1
(10).toString(8); // 12
1
(10).toString(100); // Uncaught RangeError: toString() radix argument mus
t be between 2 and 36
Un ejemplo es la funciónconsole.log().
Si ejecuto
1
console.log('Hello');
... aquí está la salida en la consola:
2
undefined
Dado que la funciónconsole.log() está construida de forma que no tiene el valor de retorno
establecido explícitamente, obtiene el valor de retorno por defecto deundefined.
1
2
3
4
function consoleLog(val) {
console.log(val)
return val
}
Estoy utilizando la funciónconsole.log() dentro de mi declaración de función
personalizadaconsoleLog. Y estoy especificando que devuelva el valor de su argumento.
1
consoleLog('Hello')
Obtengo la siguiente salida:
1
2
Hello
'Hello'
Por lo tanto, el valor se emite en la consola, pero también se devuelve.
Es útil porque puedo utilizar valores de retorno de una función dentro de otra función.
He aquí un ejemplo.
Primero codificaré una función que devuelve un doble de un número que recibió:
1
2
3
function doubleIt(num) {
return num * 2
}
Ahora codificaré otra función que construya un objeto con un valor específico:
1
2
3
4
5
function objectMaker(val) {
return {
prop: val
}
}
Puedo llamar a la funciónobjectMaker() con el valor que quiera, por ejemplo:
1
objectMaker(20);
El valor devuelto será un objeto con una única claveprop establecida en20:
1
{prop:20}
Ahora considere este código:
1
doubleIt(10).toString()
El código anterior devuelve el número20 como una cadena, es decir:"20".
1
objectMaker( doubleIt(100) );
Esto devolverá ahora el siguiente valor:
1
{prop: 200}
¿Qué significa todo esto?
Poder devolver valores personalizados es uno de los fundamentos que hacen posible la
programación funcional.
Principios de programación orientada a
objetos
Estado: Traducido automáticamente del
Inglés
Traducido automáticamente del Inglés
En esta lectura, conocerá las ventajas de la programación orientada a objetos (POO) y
los principios de la POO.
La POO ayuda a los desarrolladores a imitar la relación entre los objetos en el mundo
real. En cierto modo, le ayuda a razonar sobre las relaciones entre las cosas en su
software, igual que lo haría en el mundo real. Así, la POO es un enfoque eficaz para
idear soluciones en el código que escribe. La POO también:
1
2
3
4
5
class Animal { /* ...class code here... */ }
console.log (Animal)
EjecutarRestablecer
Un método más común de crear objetos a partir de clases es utilizar la palabra clave
new. Cuando se utiliza un método constructor predeterminado o vacío, JavaScript llama
implícitamente a la superclase Object para crear la instancia.
1
2
3
4
5
class Animal { /* ...class code here... */ }
console.log (Animal)
EjecutarRestablecer
Todo esto puede sonar un poco "informático", así que aquí tiene un ejemplo más
práctico:
1
2
3
class Animal { /* ...class code here... */ }
class Bird extends Animal { /* ...class code here... */ }
class Eagle extends Bird { /* ...class code here... */ }
En los términos más sencillos, la encapsulación tiene que ver con hacer que la
implementación de un código esté "oculta" para otros usuarios, en el sentido de que no
tengan que saber cómo funciona mi código para "consumir" el código.
1
"abc".toUpperCase();
Polimorfismo es una palabra derivada del griego que significa "formas múltiples". Una
traducción alternativa podría ser: "algo que puede adoptar muchas formas".
Así pues, para entender de qué trata el polimorfismo, consideremos algunos objetos de
la vida real.
Una puerta tiene un timbre. Podría decirse que el timbre es una propiedad del
objeto puerta. Este timbre se puede tocar. ¿Cuándo tocaría alguien el timbre de
la puerta? Obviamente, para que alguien se presente en la puerta.
Consideremos ahora el timbre de una bicicleta. Una bicicleta tiene un timbre.
Podría decirse que el timbre es una propiedad del objeto bicicleta. Este timbre
también podría sonar. Sin embargo, el motivo, la intención y el resultado de que
alguien haga sonar el timbre de una bicicleta no es el mismo que hacer sonar el
timbre de una puerta.
Los conceptos anteriores pueden codificarse en JavaScript de la siguiente manera:
1
2
3
4
5
6
7
8
9
10
const bicycle = {
bell: function() {
return "Ring, ring! Watch out, please!"
}
}
const door = {
bell: function() {
return "Ring, ring! Come here, please!"
}
}
1
bicycle.bell(); // "Get away, please"
1
door.bell(); // "Come here, please"
Llegados a este punto, se puede concluir que el mismo nombre exacto del método puede
tener la intención exactamente opuesta, en función del objeto para el que se utilice.
Ahora, para hacer que este código sea realmente polimórfico, añadiré otra declaración
de función:
1
2
3
function ringTheBell(thing) {
console.log(thing.bell())
}
1
ringTheBell(bicycle); // Ring, ring! Watch out, please!
1
ringTheBell(door); // "Ring, ring! Come here, please!"
1
"abc".concat("def"); // 'abcdef'
1
["abc"].concat(["def"]); // ['abc', 'def']
1
2
["abc"] + ["def"]; // ["abcdef"]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Bird {
useWings() {
console.log("Flying!")
}
}
class Eagle extends Bird {
useWings() {
super.useWings()
console.log("Barely flapping!")
}
}
class Penguin extends Bird {
useWings() {
console.log("Diving!")
}
}
var baldEagle = new Eagle();
var kingPenguin = new Penguin();
baldEagle.useWings(); // "Flying! Barely flapping!"
kingPenguin.useWings(); // "Diving!"
Las subclasesPenguin yEagle heredan ambas de la superclaseBird. La subclaseEagle
hereda el métodouseWings() de la claseBird, pero lo amplía con un registro de consola
adicional. La subclasePenguin no hereda la claseuseWings(), sino que tiene su propia
implementación, aunque la propia clasePenguin sí extiende la claseBird.
Practique un poco con el código anterior, intente crear algunas de sus propias clases.
(pista : piense en cosas que conozca de la vida cotidiana)
1
// create your classes here
Constructores
Estado: Traducido automáticamente del
Inglés
Traducido automáticamente del Inglés
JavaScript tiene una serie de tipos de objetos incorporados, tales como:
Math,Date,Object,Function,Boolean,Symbol,Array,Map,Set,Promise,JSON, etc.
Por ejemplo, para crear una nueva instancia del objetoDate, puedo ejecutar:new Date().
Lo que obtengo de vuelta es la fecha y hora actuales, como:
Sin embargo, no todos los objetos incorporados vienen con una función constructora.
Un ejemplo de este tipo de objeto es el objeto incorporadoMath.
Así, puedo concluir que algunos objetos incorporados sí tienen constructores, cuando
sirven a un propósito concreto: permitirnos instanciar una instancia específica del
constructor de un objeto dado. El objeto incorporadoDate es perfectamente adecuado
para tener un constructor porque cada nueva instancia de objeto de fecha que construya
debe tener datos únicos por definición, ya que va a ser una marca de tiempo diferente:
se va a construir en un momento diferente en el tiempo.
Otros objetos incorporados que no tienen constructores, como el objetoMath, no
necesitan un constructor. Son simplemente objetos estáticos a cuyas propiedades y
métodos se puede acceder directamente, desde el propio objeto incorporado. En otras
palabras, no tiene sentido construir una instancia del objeto incorporadoMath para
poder utilizar su funcionalidad.
Por ejemplo, si quiero utilizar el métodopow del objetoMath para calcular valores
exponenciales, no hay necesidad de construir una instancia del objetoMath para hacerlo.
Por ejemplo, para obtener el número 2 a la potencia de 5, ejecutaría:
Math.pow(2,5); // --> 32
No es necesario construir una instancia del objetoMath ya que no habría nada que
almacenar en la instancia de ese objeto específico.
Además de las funciones constructoras para los objetos incorporados, también puedo
definir funciones constructoras personalizadas.
He aquí un ejemplo:
1
2
3
4
5
6
function Icecream(flavor) {
this.flavor = flavor;
this.meltIt = function() {
console.log(`The ${this.flavor} icecream has melted`);
}
}
EjecutarRestablecer
Ahora puedo hacer tantos helados como quiera:
1
2
3
4
5
6
7
8
9
10
11
function Icecream(flavor) {
this.flavor = flavor;
this.meltIt = function() {
console.log(`The ${this.flavor} icecream has melted`);
}
}
EjecutarRestablecer
Acabo de construir dos objetos instancia del tipoIcecream.
El caso de uso más común denew es utilizarlo con uno de los tipos de objeto
incorporados.
Tenga en cuenta que utilizar funciones constructoras en todos los objetos incorporados
no es a veces el mejor enfoque.
1
2
let apple = new String("apple");
apple; // --> String {'apple'}
1
2
let pear = "pear";
pear; // --> "pear"
Además de ser más performante, debido al hecho de que cada objeto en Javascript es
único, no se puede comparar un objeto String con otro objeto String, incluso cuando sus
valores son idénticos.
En JavaScript, puede construir una instancia del constructor RegExp utilizando new
RegExp.
1
2
"abcd".match(/d/); // ['d', index: 3, input: 'abcd', groups: undefined]
"abcd".match(/a/); // ['a', index: 0, input: 'abcd', groups: undefined]
1
2
3
4
5
6
7
new Date();
new Error();
new Map();
new Promise();
new Set();
new WeakSet();
new WeakMap();
La lista anterior no es concluyente, pero sólo está ahí para darle una idea de algunas
funciones constructoras que seguramente puede utilizar.
Tenga en cuenta que se proporcionan enlaces sobre RegExp y la expresión regular en el
elemento de la lección titulado "Lectura adicional".
Creación de clases
Estado: Traducido automáticamente del
Inglés
Traducido automáticamente del Inglés
Al final de esta lectura, debería ser capaz de explicar, con ejemplos, el concepto de
extender clases utilizando la herencia básica para alterar los comportamientos dentro de
las clases hijas.
Todos los objetos que se construyen a partir del prototipo comparten la misma
funcionalidad.
Cuando necesite codificar relaciones OOP más complejas, puede utilizar la palabra
claveclass y su sintaxis fácil de entender y razonar.
Una vez que haya codificado esta clase, podrá utilizar la palabra clavenew para
instanciar objetos de la claseTrain.
Por ahora, sin embargo, primero necesita definir la claseTrain, utilizando la siguiente
sintaxis:
1
class Train {}
Entre las llaves, la primera pieza de código que debe definir es elconstructor:
1
2
3
4
5
class Train {
constructor() {
}
}
Por ahora, digamos que sólo hay dos propiedades que cada instancia de objeto de la
claseTrain debe tener en el momento en que se instancie:color ylightsOn.
1
2
3
4
5
6
class Train {
constructor(color, lightsOn) {
this.color = color;
this.lightsOn = lightsOn;
}
}
En primer lugar, observe que no existe la palabra clavefunction. Además, observe que
se utiliza la palabra claveconstructor para definir esta función. Usted da los parámetros
de su funciónconstructor dentro de un paréntesis de apertura y cierre, igual que en las
funciones normales. Los nombres de los parámetros soncolor ylightsOn.
Esencialmente, este es todo el código que necesita escribir para lograr dos cosas:
1
new Train()
Dentro de los paréntesis, necesito pasar valores como"red" yfalse, por ejemplo, lo que
significa que la propiedadcolor se establece en"red" y la propiedadlightsOn se
establece enfalse.
Y, para poder interactuar con el nuevo objeto construido de esta forma, necesita
asignarlo a una variable.
1
var myFirstTrain = new Train('red', false);
Como cualquier otra variable, ahora puede, por ejemplo, registrar por consola el
objetomyFirstTrain:
1
console.log(myFirstTrain); // Train {color: 'red', lightsOn: false}
1
2
var mySecondTrain = new Train('blue', false);
var myThirdTrain = new Train('blue', false);
También puede añadir métodos a las clases, y estos métodos serán entonces
compartidos por todos los futuros objetos instancia de mi claseTrain.
Por ejemplo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Train {
constructor(color, lightsOn) {
this.color = color;
this.lightsOn = lightsOn;
}
toggleLights() {
this.lightsOn = !this.lightsOn;
}
lightsStatus() {
console.log('Lights on?', this.lightsOn);
}
getSelf() {
console.log(this);
}
getPrototype() {
var proto = Object.getPrototypeOf(this);
console.log(proto);
}
}
1
var train4 = new Train('red', false);
Y ahora, puede ejecutar cada uno de sus métodos, uno tras otro, para confirmar su
comportamiento:
1
2
3
4
train4.toggleLights(); // undefined
train4.lightsStatus(); // Lights on? true
train4.getSelf(); // Train {color: 'red', lightsOn: true}
train4.getPrototype(); // {constructor: f, toggleLights: f, ligthsStatus:
f, getSelf: f, getPrototype: f}
Para heredar de una clase a una nueva subclase, JavaScript proporciona la palabra
claveextends, que funciona de la siguiente manera:
1
2
class HighSpeedTrain extends Train {
}
Como en el ejemplo anterior, la sintaxis de la subclase es coherente con la forma en que
se define la clase base en JavaScript. El único añadido aquí es la palabra claveextends, y
el nombre de la clase de la que hereda la subclase.
1
2
3
4
5
6
7
class HighSpeedTrain extends Train {
constructor(passengers, highSpeedOn, color, lightsOn) {
super(color, lightsOn);
this.passengers = passengers;
this.highSpeedOn = highSpeedOn;
}
}
A continuación, dentro del cuerpo del constructor, usted utiliza la palabra clave super y
pasa las propiedades heredadascolor ylightsOn que provienen de la claseTrain. En las
líneas siguientes usted asignapassengers athis.passengers, yhighSpeedOn
athis.highSpeedOn.
1
2
3
4
5
6
7
8
9
10
11
class HighSpeedTrain extends Train {
constructor(passengers, highSpeedOn, color, lightsOn) {
super(color, lightsOn);
this.passengers = passengers;
this.highSpeedOn = highSpeedOn;
}
toggleHighSpeed() {
this.highSpeedOn = !this.highSpeedOn;
console.log('High speed status:', this.highSpeedOn);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class HighSpeedTrain extends Train {
constructor(passengers, highSpeedOn, color, lightsOn) {
super(color, lightsOn);
this.passengers = passengers;
this.highSpeedOn = highSpeedOn;
}
toggleHighSpeed() {
this.highSpeedOn = !this.highSpeedOn;
console.log('High speed status:', this.highSpeedOn);
}
toggleLights() {
super.toggleLigths();
super.lightsStatus();
console.log('Lights are 100% operational.');
}
}
1
2
3
toggleLights() {
this.lightsOn = !this.lightsOn;
}
1
console.log('Lights are 100% operational.');
Ha añadido esta tercera línea para demostrar que puedo combinar el código del método
"prestado" de la superclase con su propio código personalizado en la subclase.
1
2
var train5 = new Train('blue', false);
var highSpeed1 = new HighSpeedTrain(200, false, 'green', false);
1
2
train5.toggleLights(); // undefined
train5.lightsStatus(); // Lights on? true
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
class Train {
constructor(color, lightsOn) {
this.color = color;
this.lightsOn = lightsOn;
}
toggleLights() {
this.lightsOn = !this.lightsOn;
}
lightsStatus() {
console.log('Lights on?', this.lightsOn);
}
getSelf() {
console.log(this);
}
getPrototype() {
var proto = Object.getPrototypeOf(this);
console.log(proto);
}
}
Además, ayuda a visualizar lo que está ocurriendo obtener el prototipo tanto del
trentrain5 como delhighSpeed1:
1
2
train5.getPrototype(); // {constructor: ƒ, toggleLights: ƒ, lightsStatus:
ƒ, getSelf: ƒ, getPrototype: ƒ}
highSpeed1.getPrototype(); // Train {constructor: ƒ, toggleHighSpeed: ƒ,
toggleLights: ƒ}
Los valores devueltos en este caso pueden parecer inicialmente un poco complicados de
comprender, pero en realidad es bastante sencillo:
Utilizar la instancia de una clase como propiedad del constructor de otra clase
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
class StationaryBike {
constructor(position, gears) {
this.position = position
this.gears = gears
}
}
class Treadmill {
constructor(position, modes) {
this.position = position
this.modes = modes
}
}
class Gym {
constructor(openHrs, stationaryBikePos, treadmillPos) {
this.openHrs = openHrs
this.stationaryBike = new StationaryBike(stationaryBikePos, 8)
this.treadmill = new Treadmill(treadmillPos, 5)
}
}
console.log(boxingGym.openHrs) //
console.log(boxingGym.stationaryBike) //
console.log(boxingGym.treadmill) //
EjecutarRestablecer
La clase Treadmill también tiene una posición, y otra propiedad, denominada modes
(como en "modos de ejercicio").
Este código me permite instanciar un nuevo objeto instancia de la clase Gym, y cuando
lo inspecciono, obtengo la siguiente información:
Lo que esto significa es que voy a utilizar una característica de ES6 que me permite
establecer un parámetro por defecto dentro de una definición de función, que va de la
mano con el enfoque de codificación defensiva, mientras que no requiere casi ningún
esfuerzo para poner en práctica.
Por ejemplo, considere una declaración de función sin parámetros por defecto
establecidos:
1
2
3
function noDefaultParams(number) {
console.log('Result:', number * number)
}
1
noDefaultParams(); // Result: NaN
JavaScript, debido a su naturaleza dinámica, no lanza un error, pero devuelve una salida
sin sentido.
1
2
3
function withDefaultParams(number = 10) {
console.log('Result:', number * number)
}
Los parámetros por defecto me permiten construir una función que se ejecutará con los
valores de los argumentos por defecto, incluso si no le paso ningún argumento, mientras
que sigue siendo lo suficientemente flexible como para permitirme pasar valores de
argumentos personalizados y tratar con ellos en consecuencia.
Esto me permite ahora codificar mis clases de forma que promueva una instanciación de
objetos más sencilla.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class NoDefaultParams {
constructor(num1, num2, num3, string1, bool1) {
this.num1 = num1;
this.num2 = num2;
this.num3 = num3;
this.string1 = string1;
this.bool1 = bool1;
}
calculate() {
if(this.bool1) {
console.log(this.string1, this.num1 + this.num2 + this.num3);
return;
}
return "The value of bool1 is incorrect"
}
}
1
2
var fail = new NoDefaultParams(1,2,3,false);
fail.calculate(); // 'The value of bool1 is incorrect'
Este ejemplo podría poner de relieve la razón por la que a veces aparecen mensajes de
error extraños cuando se utiliza algún software: quizás los desarrolladores no tuvieron
tiempo suficiente para construirlo mejor.
Sin embargo, ahora que conoce los parámetros por defecto, este ejemplo puede
mejorarse de la siguiente manera:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class WithDefaultParams {
constructor(num1 = 1, num2 = 2, num3 = 3, string1 = "Result:", bool1
= true) {
this.num1 = num1;
this.num2 = num2;
this.num3 = num3;
this.string1 = string1;
this.bool1 = bool1;
}
calculate() {
if(this.bool1) {
console.log(this.string1, this.num1 + this.num2 + this.num3);
return;
}
return "The value of bool1 is incorrect"
}
}
var better = new WithDefaultParams();
better.calculate(); // Result: 6
Diseñar un programa OO
Estado: Traducido automáticamente del
Inglés
Traducido automáticamente del Inglés
En esta lectura, le mostraré cómo crear clases en JavaScript, utilizando todos los
conceptos que ha aprendido hasta ahora.
Hay dos palabras clave que son esenciales para la programación orientada a objetos con
clases en JavaScript.
1
2
3
class Animal {
// ... class code here ...
}
1
2
3
class Cat extends Animal {
// ... class code here ...
}
Antes de empezar, necesito pensar en cosas como: * ¿Qué debe ir en la clase base
deAnimal? En otras palabras, ¿qué heredarán todas las subclases de la clase base? *
¿Cuáles son las propiedades y métodos específicos que separan a cada clase de las
demás? * En general, ¿cómo se relacionarán mis clases entre sí?
Una vez que lo haya pensado bien, podré construir mis clases.
En este momento, con todos los requisitos escritos como comentarios, mi código
debería ser el siguiente:
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
class Animal {
// constructor: color, energy
// isActive()
// if energy > 0, energy -=20, console log energy
// else if energy <= 0, sleep()
// sleep()
// energy += 20
// console.log energy
}
class Cat extends Animal {
// constructor: sound, canJumpHigh, canClimbTrees, color, energy
// makeSound()
// console.log sound
}
class Bird extends Animal {
// constructor: sound, canFly, color, energy
// makeSound()
// console.log sound
}
class HouseCat extends Cat {
// constructor: houseCatSound, sound, canJumpHigh, canClimbTrees, col
or, energy
// makeSound(option)
// if (option)
// super.makeSound()
// console.log(houseCatSound)
}
class Tiger extends Cat {
// constructor: tigerSound, sound, canJumpHigh, canClimbTrees, color,
energy
// makeSound(option)
// if (option)
// super.makeSound()
// console.log(tigerSound)
}
class Parrot extends Bird {
// constructor: canTalk, sound, canJumpHigh, canClimbTrees, color, en
ergy
// makeSound(option)
// if (option)
// super.makeSound()
// if (canTalk)
// console.log("talking!")
Ahora que he codificado mis requisitos dentro de los comentarios de clases que, de otro
modo, estarían vacías, puedo empezar a codificar cada clase según mis especificaciones.
Codificación de la claseAnimal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Animal {
constructor(color = 'yellow', energy = 100) {
this.color = color;
this.energy = energy;
}
isActive() {
if(this.energy > 0) {
this.energy -= 20;
console.log('Energy is decreasing, currently at:', this.energ
y)
} else if(this.energy == 0){
this.sleep();
}
}
sleep() {
this.energy += 20;
console.log('Energy is increasing, currently at:', this.energy)
}
getColor() {
console.log(this.color)
}
}
Cada objeto animal, sea cual sea, compartirá las propiedades decolor yenergy.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Cat extends Animal {
constructor(sound = 'purr', canJumpHigh = true, canClimbTrees = true,
color, energy) {
super(color, energy);
this.sound = sound;
this.canClimbTrees = canClimbTrees;
this.canJumpHigh = canJumpHigh;
}
makeSound() {
console.log(this.sound);
}
}
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
class HouseCat extends Cat {
constructor(houseCatSound = "meow", sound,canJumpHigh,canClimbTrees,
color,energy) {
super(sound,canJumpHigh,canClimbTrees, color,energy);
this.houseCatSound = houseCatSound;
}
makeSound(option) {
if (option) {
super.makeSound();
}
console.log(this.houseCatSound);
}
}
Ahora que hemos establecido toda esta estructura de herencia, podemos construir varios
objetos animales.
Por ejemplo, puedo construir dos loros: uno que puede hablar y otro que no.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var polly = new Parrot(true); // we're passing `true` to the constructor
so that polly can talk
var fiji = new Parrot(false); // we're passing `false` to the constructor
so that fiji can't talk
polly.color; // yellow
polly.energy; // 100
penguin.sound; // 'shriek'
penguin.canFly; // false
penguin.color; // 'black and white'
penguin.energy; // 200
penguin.isActive(); // Energy is decreasing, currently at: 180
1
var leo = new HouseCat();
1
2
3
4
5
// leo, no purring please:
leo.makeSound(false); // meow
1
var cuddles = new Tiger();
1
2
cuddles.makeSound(false); // Roar!
cuddels.makeSound(true); // purr, Roar!
Aquí está el código completo de esta lección, para que sea más fácil copiar y pegar:
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
class Animal {
constructor(color = 'yellow', energy = 100) {
this.color = color;
this.energy = energy;
}
isActive() {
if(this.energy > 0) {
this.energy -= 20;
console.log('Energy is decreasing, currently at:', this.energ
y)
} else if(this.energy == 0){
this.sleep();
}
}
sleep() {
this.energy += 20;
console.log('Energy is increasing, currently at:', this.energy)
}
getColor() {
console.log(this.color)
}
}
Para empezar, es importante saber que un bucle for of no puede funcionar sobre un
objeto directamente, ya queun objeto no es iterable. Por ejemplo:
1
2
3
4
5
6
7
8
const car = {
speed: 100,
color: "blue"
}
for(prop of car) {
console.log(prop)
}
EjecutarRestablecer
La ejecución del fragmento de código anterior arrojará el siguiente error:
1
Uncaught TypeError: car is not iterable
1
2
3
4
const colors = ['red','orange','yellow']
for (var color of colors) {
console.log(color);
}
EjecutarRestablecer
1
2
3
rojo
naranja
amarillo
Por suerte, puede utilizar el hecho de que un bucle for of puede ejecutarse sobre
matricespara hacer un bucle sobre objetos.
¿Pero cómo?
Antes de que pueda responder adecuadamente a esta pregunta, primero necesita revisar
tres métodos incorporados:Object.keys(),Object.values(), yObject.entries().
Métodos incorporados
El métodoObject.keys()
El métodoObject.keys() recibe un objeto como parámetro. Recuerde que este objeto esel
objeto sobre el que desea realizar el bucle. Aún es demasiado pronto para explicar
cómo realizará el bucle sobre el objeto en sí; por ahora, céntrese en la matriz de
propiedades devuelta cuando llame al métodoObject.keys().
1
2
3
4
5
const car2 = {
speed: 200,
color: "red"
}
console.log(Object.keys(car2)); // ['speed','color']
EjecutarRestablecer
El método Object.values()
1
2
3
4
5
const car3 = {
speed: 300,
color: "yellow"
}
console.log(Object.values(car3)); // [300, 'yellow']
El método Object.entries()
Por último, existe otro método útil,Object.entries(), que devuelve una matriz con las
claves y los valores.
1
2
3
4
5
const car4 = {
speed: 400,
color: 'magenta'
}
console.log(Object.entries(car4));
1
[ ['speed', 400], ['color', 'magenta'] ]
Esta vez, los valores que se devuelven son arrays de 2 miembros anidados dentro de un
array. En otras palabras, se obtiene un array de arrays, donde cada elemento del array
tiene dos miembros, siendo el primero la clave de una propiedad, y el segundo el valor
de una propiedad.
1
2
3
4
5
[
[llave de propiedad, valor de propiedad],
[llave de propiedad, valor de propiedad],
...etc
]
Ejemplos
Ahora tiene todos los ingredientes que necesita para hacer un bucle sobre las clavesy
valores de las propiedades propias de cualquier objeto.
1
2
3
4
5
6
7
8
9
10
var clothingItem = {
price: 50,
color: 'beige',
material: 'cotton',
season: 'autumn'
}
Recuerde que también aprendió cómo puede acceder dinámicamente al nombre de una
propiedad.
Para retomar este concepto y mostrar una demostración práctica de cómo funciona,
vamos a codificar una declaración de función que asigne aleatoriamente la cadena speed
o la cadenacolor a un nombre de variable y, a continuación, construyamos un objeto que
sólo tenga dos claves: una clavespeed y una clavecolor.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function testBracketsDynamicAccess() {
var dynamicKey;
if(Math.random() > 0.5) {
dynamicKey = "speed";
}else{
dynamicKey = "color";
}
var drone = {
speed: 15,
color: "orange"
}
console.log(drone[dynamicKey]);
}
testBracketsDynamicAccess();
EjecutarRestablecer
Ahora ya conoce los elementos que hacen que el bucle for sea útil para iterar sobre
objetos,aunque los objetos no son iterables .
A continuación, verá un ejemplo práctico de cómo trabajar tanto con el bucle for of
como con el bucle for in. Cada bucle tiene su lugar y puede considerarse útil en
diferentes situaciones.
Hasta ES6, la única forma de construir cadenas en JavaScript era delimitarlas entre
comillas simples o dobles:
2
1
"Hello, World!"
'Hello, World!'
Junto a las anteriores formas de construir cadenas, ES6 introdujo el uso de caracteres
backtick como delimitadores:
1
`Hello, World!`
El fragmento de código anterior es un ejemplo de cadena de plantilla, que también se
conoce como literal de plantilla.
1
Hello World !
1
2
3
var greet = "Hello";
var place = "World";
console.log(greet + " " + place + "!"); //display both variables without
using template literals
1
2
3
4
`Hello,
World
!
`
Observe que esto no puede hacerse utilizandoliterales de cadena (es decir, cadenas
delimitadas por comillas simples o dobles):
1
2
"Hello,
World"
En pocas palabras, los literales de plantilla permiten cadenas de varias líneas, algo que
simplemente no es posible con los literales de cadena.
1
2
//it's possible to perform arithmetic operation inside a template literal
expression
console.log(`${1 + 1 + 1 + 1 + 1} stars!`)
Esto abre un sinfín de posibilidades. Por ejemplo, es posible evaluar una expresión
ternaria dentro de un literal de plantilla.
Algunos casos de uso adicionales de los literales de plantilla son los literales deplantilla
anidados y lasplantillas etiquetadas. Sin embargo, son un poco más complicados y
están fuera del alcance de esta lectura.
Si tiene curiosidad por saber cómo funcionan, consulte la lectura adicional que se
proporciona al final de esta lección.
Nos centraremos en el trabajo con las estructuras de datos Object, Array, Map y Set en
JavaScript, a través de una serie de ejemplos.
Tenga en cuenta que esta lectura no incluirá la discusión de algunas estructuras de datos
que existen en otros lenguajes, como las colas o las listas enlazadas. Aunque estas
estructuras de datos (¡y otras estructuras de datos también!) pueden codificarse de forma
personalizada en JavaScript, la naturaleza avanzada de estos temas y la dificultad de
realizar ejercicios relacionados con ellos hacen que queden fuera del alcance de esta
lectura.
Sin embargo, aún quedan algunos temas importantes por cubrir, y uno de ellos es, por
ejemplo, el trabajo con algunos métodos incorporados.
En esta lectura, la atención se centra en tres métodos específicos que existen en las
matrices:
1. forEach
2. filter
3. map
Exploremos estos métodos.
El método forEach()
Las matrices en JavaScript vienen con un práctico método que le permite hacer un bucle
sobre cada uno de sus miembros.
1
2
3
4
5
const fruits = ['kiwi','mango','apple','pear'];
function appendIndex(fruit, index) {
console.log(`${index}. ${fruit}`)
}
fruits.forEach(appendIndex);
El resultado de ejecutar el código anterior es el siguiente:
1
2
3
4
0. kiwi
1. mango
2. apple
3. pear
Para explicar la sintaxis, el métodoforEach() aceptauna función que trabajará sobre cada
elemento del array. El primer parámetro de esa función es el propio elemento actual de la
matriz, y el segundo parámetro (opcional) es el índice.
1
2
3
4
const veggies = ['onion', 'garlic', 'potato'];
veggies.forEach( function(veggie, index) {
console.log(`${index}. ${veggie}`);
});
Esto hace que el código sea más compacto, pero quizás algo más difícil de leer. Para
aumentar la legibilidad, a veces se utilizan funciones de flecha. Puede encontrar más
información sobre las funciones de flecha en la lectura adicional.
El métodofilter()
Otro método muy útil sobre la matriz es el métodofilter(). Filtra sus arrays basándoseen una
prueba específica. Se devuelven los elementos del array que superan la prueba.
1
2
3
4
const nums = [0,10,20,30,40,50];
nums.filter( function(num) {
return num > 20;
})
Aquí está el valor del array devuelto:
1
[30,40,50]
Similar al métodoforEach(), el métodofilter() también acepta una función y esa función
realiza algún trabajo en cada uno de los elementos del array.
El método map
Por último, existe un método muy útilmap.
Este método se utiliza para mapear cada elemento del array sobre el elemento de otro
array, basándose en cualquier trabajo que se realice dentro de la función que se pasa al
mapa como parámetro.
Por ejemplo:
1
2
3
[0,10,20,30,40,50].map( function(num) {
return num / 10
})
El valor de retorno del código anterior es
1
[0,1,2,3,4,5]
Como ya se ha comentado, la elección de una estructura de datos adecuada afecta al
propio código que puede escribir. Esto se debe a que la propia estructura de datos viene
con alguna funcionalidad incorporada que facilita la realización de ciertas tareas o la hace
más difícil o incluso imposible sin convertir su código a una estructura de datos adecuada.
Ahora que ha cubierto los métodos, vamos a explorar cómo trabajar con diferentes
estructuras de datos incorporadas en JavaScript.
1
2
3
4
5
6
7
8
9
10
const result = [];
const drone = {
speed: 100,
color: 'yellow'
}
const droneKeys = Object.keys(drone);
droneKeys.forEach( function(key) {
result.push(key, drone[key])
})
console.log(result)
Este es el resultado de ejecutar el código anterior:
1
['speed',100,'color','yellow']
Aunque esto es posible y funciona, tener que hacer algo así puede significar que no ha
elegido la estructura de datos correcta con la que trabajar en su código.
Por otro lado, a veces no puede elegir la estructura de datos con la que trabaja. Tal vez
esos datos procedan de un proveedor de datos externo y lo único que puede hacer es
codificar su programa para que los consuma. Aprenderá más sobre el intercambio de
datos en la web cuando conozca JSON (JavaScript Object Notation).
1
new Map();
Un mapa puede parecer muy similar a un objeto en JS.
Sin embargo, no tiene herencia. No tiene prototipos Esto lo hace útil como
almacenamiento de datos.
Por ejemplo:
1
2
3
4
5
6
let bestBoxers = new Map();
bestBoxers.set(1, "The Champion");
bestBoxers.set(2, "The Runner-up");
bestBoxers.set(3, "The third place");
console.log(bestBoxers);
Aquí está la salida de la consola:
1
Map(3) {1 => 'The Champion', 2 => 'The Runner-up', 3 => 'The third place
'}
Para obtener un valor específico, debe utilizar el métodoget(). Por ejemplo:
1
bestBoxers.get(1); // 'The Champion'
1
new Set();
El constructorSet puede, por ejemplo, aceptar un array.
Esto significa que podemos utilizarlo para filtrar rápidamente un array en busca de
miembros únicos.
1
2
3
const repetitiveFruits = ['apple','pear','apple','pear','plum', 'apple'];
const uniqueFruits = new Set(repetitiveFruits);
console.log(uniqueFruits);
El código anterior muestra lo siguiente en la consola:
1
{'apple', 'pear', 'plum'}
Colas
Listas enlazadas (enlazadas simple y doblemente)
Árboles
Grafos
1
2
3
4
const fruits = ['apple', 'pear', 'plum']
const berries = ['blueberry', 'strawberry']
const fruitsAndBerries = [...fruits, ...berries] // concatenate
console.log(fruitsAndBerries); // outputs a single array
Este es el resultado:
1
['apple', 'pear', 'plum', 'blueberry', 'strawberry']
1
2
3
4
const flying = { wings: 2 }
const car = { wheels: 4 }
const flyingCar = {...flying, ...car}
console.log(flyingCar) // {wings: 2, wheels: 4}
1
2
3
4
let veggies = ['onion', 'parsley'];
veggies = [...veggies, 'carrot', 'beetroot'];
console.log(veggies);
He aquí el resultado:
1
['onion', 'parsley', 'carrot', 'beetroot']
1
2
3
const greeting = "Hello";
const arrayOfChars = [...greeting];
console.log(arrayOfChars); // ['H', 'e', 'l', 'l', 'o']
1
2
3
4
5
6
7
8
9
const car1 = {
speed: 200,
color: 'yellow'
}
const car 2 = {...car1}
car1.speed = 201
console.log(car1.speed, car2.speed)
1
2
3
4
const fruits1 = ['apples', 'pears']
const fruits2 = [...fruits1]
fruits1.pop()
console.log(fruits1, "not", fruits2)
1
['apples'] 'not' ['apples','pears']
Tenga en cuenta que el operador spread sólo realiza una copia superficial del array u
objeto de origen. Para más información al respecto, consulte la lectura adicional.
Hay muchos más trucos que puede realizar con el operador spread. Algunos de ellos son
realmente útiles cuando se empieza a trabajar con una biblioteca como React.
Interactividad JavaScript
Estado: Traducido automáticamente del
Inglés
Traducido automáticamente del Inglés
El propósito de esta lectura es presentarle una explicación sencilla de la manipulación
de páginas web y algunos ejemplos de la misma.
Al principio, a finales de la década de 1990, existía el JavaScript plano que había que
retocar para adaptarlo a cada navegador.
Luego, a mediados de la década de 2000, apareció la biblioteca jQuery, con la idea de
escribir menos código, pero hacer más con él. Igualó las condiciones", ya que permitió a
los desarrolladores utilizar una única base de código para varios navegadores.
Esta tendencia continuó y aparecieron muchos otros frameworks como React, Vue,
Angular, D3 y más.
Aunque el CSS se ha desarrollado mucho a lo largo de los años, sigue siendo JavaScript
el que permite a los usuarios:
Obtener su geolocalización,
Interactuar con mapas,
Jugar en el navegador,
Manejar todo tipo de eventos desencadenados por el usuario,
independientemente del dispositivo,
Verificar la entrada de un formulario antes de enviarlo al backend de una
aplicación web,
¡y mucho más!
Hay muchas, muchas maneras en las que JavaScript le permite construir experiencias
ricas e interactivas en la web.
Hay sitios web que se comunican con otros sitios web, que obtienen datos de fuentes y
proveedores de datos, tanto de pago como gratuitos.
Todos estos flujos de datos deben facilitarse con algún tipo de formato de datos.
Así pues, las dos razones principales por las que el formato JSON se ha convertido en el
formato de intercambio de datos dominante que es hoy son dos:
En primer lugar, es muy ligero, con una sintaxis muy similar a la de "un objeto
JavaScript encadenado". Aprenderá más sobre los detalles de esto más adelante.
En segundo lugar, es más fácil de manejar en código JavaScript, ya que, JSON,
después de todo, essólo JavaScript.
A menudo se dice que JSON es unsubconjunto de JavaScript, lo que significa que se
adhiere a las reglas de sintaxis del lenguaje JavaScript, pero es aún más estricto en cómo
debe formatearse el código JSON adecuado. En otras palabras, todo el código JSON es
JavaScript, pero no todo el código JavaScript es JSON.
Por ejemplo, si tuviera un sitio web con los datos de los movimientos de los precios de las
acciones, podría querer obtener los datos de los precios actuales de las acciones de un
proveedor de datos. Ellos podrían ofrecerle su servicio de datos dándole acceso al archivo
llamado, digamosstockPrices.json, al que usted podría acceder desde sus servidores.
Una vez que haya descargado esos datos JSON encadenados en su propio código, podría
convertir esos datos en un objeto JavaScript plano.
Eso significaría que podría utilizar el código de su aplicación web para "escarbar" en los
datos de terceros convertidos en un objeto JavaScript, con el fin de obtener información
específica basada en un conjunto determinado de criterios.
Por ejemplo, si los datos JSON encadenados se convirtieran en un objeto que tuviera la
siguiente estructura:
1
2
3
4
5
6
7
8
9
10
11
12
13
const currencyInfo = {
[
USD: {
// ...
},
GBP: {
// ...
},
EUR: {
// ...
}
]
}
entonces podría acceder únicamente a los datos de la propiedadUSD, si eso es lo que
necesita su aplicación en un momento dado.
Esperemos que, con esta explicación, comprenda, a un alto nivel, cómo y por qué podría
querer utilizar JSON en su propio código.
JSON puede trabajar con algunas primitivas y algunos tipos de datos complejos, como se
describe a continuación.
¿Qué ocurre si intenta encadenar un tipo de datos que no está aceptado en la sintaxis
JSON?
Por ejemplo, ¿qué ocurre si intenta encadenar una función?La operación fallará
silenciosamente.
Si intenta encadenar otros tipos de datos, como un número BigInt, por ejemplo 123n,
obtendrá el siguiente error:Uncaught TypeError: Do not know how to serialize a BigInt.
'{"color":"red"}'
"color":"red"
"nestedObject": { "color": "blue" }
También es posible tener una cadena JSON que codifique sólo una matriz:
La cadena JSON anterior codifica una matriz que contiene tres elementos, tres valores del
tipo de datos cadena. Obviamente, al igual que los objetos, las matrices pueden anidar
otras estructuras de datos simples o complejas.
Por ejemplo:
En el ejemplo anterior, la cadena JSON codifica una matriz que contiene dos objetos,
donde cada objeto consiste en un único par clave-valor, donde ambos valores son
cadenas.