diff --git a/challenges/01-front-end-development-certification/basic-javascript.json b/challenges/01-front-end-development-certification/basic-javascript.json
index 0e31e16e7c..b4c51e727f 100644
--- a/challenges/01-front-end-development-certification/basic-javascript.json
+++ b/challenges/01-front-end-development-certification/basic-javascript.json
@@ -121,7 +121,19 @@
"assert(/b\\s*=\\s*a\\s*;/g.test(code), 'message: a
should be assigned to b
with =
');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Almacenar valores con el operador igual",
+ "descriptionEs": [
+ "En JavaScript, puedes almacenar un valor en una variable con la asignación o con el operador igual
(=
).",
+ "miVariable = 5;
",
+ "Asigna el valor númerico
de 5
a miVariable
.",
+ "La asignación siempre va de derecha a izquierda. Todo a la derecha del operador =
es resuelto antes que el valor es asignado a la variable a la izquierda del operador.",
+ "
miVar = 5;
miNum = miVar;
",
+ "Asigna 5
a miVar
y entonces resuelve miVar
a 5
otra vez y asigna esta a miNum
.",
+ "Instrucciones
",
+ "Asigna el valor 7
a la variable a
.",
+ "Asigna el contenido de a
a la variable b
."
+ ]
},
{
"id": "56533eb9ac21ba0edf2244a9",
@@ -151,7 +163,15 @@
"assert(/var\\s+a\\s*=\\s*9\\s*/.test(code), 'message: Initialize a
to a value of 9
');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Inicializar variables con el operador igual",
+ "descriptionEs": [
+ "Es común inicializar una variable a un valor inicial en la misma línea que es declarada.",
+ "var miVar = 0;
",
+ "Crea una nueva variable llamada miVar
y le asigna un valor inicial de 0
.",
+ "Instrucciones
",
+ "Define una variable a
con var
e inicializala a un valor de 9
."
+ ]
},
{
"id": "56533eb9ac21ba0edf2244aa",
@@ -188,7 +208,13 @@
"assert(/a = a \\+ 1;/.test(code) && /b = b \\+ 5;/.test(code) && /c = c \\+ \" String!\";/.test(code), 'message: Do not change code below the line');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Entendiendo variables sin inicializar",
+ "descriptionEs": [
+ "Cuando las variables de JavaScript son declaradas, ellas tienen un valor inicial de undefined
. Si tu haces una operación matematica sobre una variable undefined
tu resultado sera NaN
el cual significa \"Not a Number\" es decir \"No es un número\". Si tu concatenas una cadena con una variable undefined
, vas a obtener una cadena literal de \"undefined\"
.",
+ "Instrucciones
",
+ "Inicializa las tres variables a
, b
, y c
con 5
, 10
, y \"I am a\"
respectivamente de manera que no sean undefined
."
+ ]
},
{
"id": "56533eb9ac21ba0edf2244ab",
@@ -227,7 +253,18 @@
"assert(code.match(/titleCaseOver/g).length === 2, 'message: titleCaseOver
should use camelCase in both declaration and assignment sections.');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Entendiendo la distinción en variables",
+ "descriptionEs": [
+ "En JavaScript todas las variables y nombres de funciones distinguen entre mayúsculas y minúsculas. Esto significa que la capitalización importa.",
+ "MIVAR
no es lo mismo que MiVar
o mivar
. Esto hace posible tener múltiples variables distintas con el mismo nombre pero de diferente manera. Es fuertemente recomendado por el bien de la claridad, que tu no uses esta característica del lenguaje.",
+ "Mejor Práctica
",
+ "Escribe nombres de variables en Javascript en capitalizaciónCamello (camelCase). En capitalizaciónCamello, los nombres de variables con múltiples palabras tienen la primera palabra en minúsculas y la primera letra de cada palabra subsecuente es capitalizada.",
+ "Ejemplos:",
+ "var algunaVariable;
var otraVariable;
var esteNombreDeVariableEsMuyLargo;
",
+ "Instrucciones
",
+ "Repara las declaraciones y asignaciones de variables de manera que sus nombres usen capitalizaciónCamello."
+ ]
},
{
"id": "cf1111c1c11feddfaeb3bdef",
@@ -259,7 +296,7 @@
],
"type": "waypoint",
"challengeType": 1,
- "nameEs": "Suma dos números con JavaScript",
+ "nameEs": "Suma dos números con javascript",
"descriptionEs": [
"Intentemos sumar dos números con JavaScript.",
"JavaScript utiliza el símbolo +
para la adición.",
@@ -297,7 +334,7 @@
],
"type": "waypoint",
"challengeType": 1,
- "nameEs": "Resta un número de otro con JavaScript",
+ "nameEs": "Resta un número de otro con javascript",
"descriptionEs": [
"También podemos restar un número de otro.",
"JavaScript utiliza el símbolo -
de sustracción",
@@ -334,7 +371,7 @@
],
"type": "waypoint",
"challengeType": 1,
- "nameEs": "Multiplica dos números con JavaScript",
+ "nameEs": "Multiplica dos números con javascript",
"descriptionEs": [
"También podemos multiplicar un número por otro.",
"JavaScript utiliza el símbolo *
de la multiplicación.",
@@ -371,7 +408,7 @@
],
"type": "waypoint",
"challengeType": 1,
- "nameEs": "Divide un número por otro con JavaScript",
+ "nameEs": "Divide un número por otro con javascript",
"descriptionEs": [
"También podemos dividir un número por otro.",
"JavaScript utiliza el símbolo /
para dividir.",
@@ -410,7 +447,17 @@
"assert(/var myVar = 87;/.test(code), 'message: Do not change code above the line');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Incrementa un número con javascript",
+ "descriptionEs": [
+ "Tu puedes fácilmente incrementar o agregar uno a una variable con el operador ++
.",
+ "i++
",
+ "es el equivalente de",
+ "i = i + 1;
",
+ "Nota
Toda la línea equivale a i++
, sin necesidad del signo igual.",
+ "Instrucciones
",
+ "Cambia el código para usar el operador ++
sobre myVar
."
+ ]
},
{
"id": "56533eb9ac21ba0edf2244ad",
@@ -444,7 +491,17 @@
"assert(/var myVar = 11;/.test(code), 'message: Do not change code above the line');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Decrementar un número con javascript",
+ "descriptionEs": [
+ "Fácilmente puedes decrementar o disminuir una variable por uno con el operador --
.",
+ "i--;
",
+ "es el equivalente a",
+ "i = i - 1;
",
+ "Nota
Toda la línea equivale a i--;
, sin necesidad del signo igual.",
+ "Instrucciones
",
+ "Cambia el código para usar el operador --
en myVar
."
+ ]
},
{
"id": "cf1391c1c11feddfaeb4bdef",
@@ -474,10 +531,12 @@
],
"type": "waypoint",
"challengeType": 1,
- "nameEs": "Crea números decimales con JavaScript",
+ "nameEs": "Crea números decimales con javascript",
"descriptionEs": [
- "Las variables tipo número en JavaScript también pueden tener decimales.",
- "Vamos a crear una variable myDecimal
y a darle un valor decimal."
+ "Podemos almacenar números decimales en variables también. Los números decimales a veces son referidos como números de punto flotante o flotantes.",
+ "Nota
No todos los números reales pueden ser exactamente representados en punto flotante. Esto puede conducir a errores de redondeo. Detalles aquí.",
+ "Instrucciones
",
+ "Crea una variable myDecimal
y dale un valor decimal con una parte fraccional (p.e. 5.7
)."
]
},
{
@@ -506,10 +565,11 @@
],
"type": "waypoint",
"challengeType": 1,
- "nameEs": "Multiplica dos decimales con JavaScript",
+ "nameEs": "Multiplicar dos decimales con javascript",
"descriptionEs": [
"En JavaScript, también puedes realizar cálculos con números decimales, al igual que con números enteros.",
"Vamos a multiplicar dos números decimales para obtener su producto.",
+ "Instrucciones
",
"Cambia el 0.0
para que el producto sea igual a 5.0
."
]
},
@@ -538,9 +598,10 @@
],
"type": "waypoint",
"challengeType": 1,
- "nameEs": "Divide un número decimal por otro con JavaScript",
+ "nameEs": "Divide un número decimal por otro con javascript",
"descriptionEs": [
"Ahora vamos a dividir un decimal por otro.",
+ "Instrucciones
",
"Cambia el 0.0
para que tu cociente sea igual a 2.2
."
]
},
@@ -575,7 +636,18 @@
"assert(/\\d+\\s*%\\s*\\d+/.test(code), 'message: You should use the %
operator');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Encontrar un cociente en javascript",
+ "descriptionEs": [
+ "El operador residuo %
da el residuo de la división de dos números.",
+ "Ejemplo",
+ "5 % 2 = 1 por que
Math.floor(5 / 2) = 2 (Cociente)
2 * 2 = 4
5 - 4 = 1 (Residuo)
",
+ "Uso
En matemáticas, se puede comprobar si un número es par o impar revisando en residuo de la división del número por 2
.",
+ "17 % 2 = 1 (17 es Impar)
48 % 2 = 0 (48 es Par)
",
+ "Nota
El operador residuo es a veces incorrectamente referenciado como el operador \"módulo\". Este es muy parecido a módulo, pero no trabaja apropiadamente con números negativos.",
+ "Instrucciones
",
+ "Asigna remainder
igual al residuo de 11
dividido por 3
usando el operador residuo (%
)."
+ ]
},
{
"id": "56533eb9ac21ba0edf2244af",
@@ -616,7 +688,17 @@
"assert(/var a = 3;/.test(code) && /var b = 17;/.test(code) && /var c = 12;/.test(code), 'message: Do not modify the code above the line');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Asignación con más",
+ "descriptionEs": [
+ "En programación, es común usar asignaciones para modificar el contenido de una variable. Recuerda que todo lo de la derecha del signo igual es evaluado primero, así podemos decir que:",
+ "miVar = miVar + 5;
",
+ "para agregar 5
a miVar
. Dado que este es un patrón común, hay operadores que realizan tanto una operación matemática como una asignación en un paso.",
+ "Uno de tales operadores es el operador +=
.",
+ "miVar += 5;
añadirá 5
a miVar
.",
+ "Instrucciones
",
+ "Convierte las asignaciones para a
, b
y c
usando el operador +=
."
+ ]
},
{
"id": "56533eb9ac21ba0edf2244b0",
@@ -657,7 +739,16 @@
"assert(/var a = 11;/.test(code) && /var b = 9;/.test(code) && /var c = 3;/.test(code), 'message: Do not modify the code above the line');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Asignación con menos",
+ "descriptionEs": [
+ "Al igual que el operador +=
, -=
substrae un número de una variable.",
+ "miVar = miVar - 5;
",
+ "substraerá 5
de miVar
. Esto puede ser reescrito como: ",
+ "miVar -= 5;
",
+ "Instrucciones
",
+ "Convierte las asignaciones para a
, b
, y c
para usar el operador -=
."
+ ]
},
{
"id": "56533eb9ac21ba0edf2244b1",
@@ -698,7 +789,16 @@
"assert(/var a = 5;/.test(code) && /var b = 12;/.test(code) && /var c = 4\\.6;/.test(code), 'message: Do not modify the code above the line');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Asignación con veces igual",
+ "descriptionEs": [
+ "El operador *=
multiplica una variable por un número.",
+ "miVar = miVar * 5;
",
+ "multiplicará miVar
por 5
. Esto puede ser reescrito como: ",
+ "miVar *= 5;
",
+ "Instrucciones
",
+ "Convierte las asignaciones para a
, b
y c
usando el operador *=
."
+ ]
},
{
"id": "56533eb9ac21ba0edf2244b2",
@@ -738,7 +838,16 @@
"assert(/var a = 48;/.test(code) && /var b = 108;/.test(code) && /var c = 33;/.test(code), 'message: Do not modify the code above the line');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Asignación con división",
+ "descriptionEs": [
+ "El operador /=
divide una variable por otro número.",
+ "miVar = miVar / 5;
",
+ "Dividirá miVar
por 5
. Esto puede ser reescrito como: ",
+ "miVar /= 5;
",
+ "Instrucciones
",
+ "Convierte las asignaciones para a
, b
y c
para usar el operador /=
."
+ ]
},
{
"id": "56533eb9ac21ba0edf2244b3",
@@ -777,7 +886,13 @@
"assert(convert(30) === 86, 'message: convert(30)
should return a value of 86
');"
],
"type": "checkpoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Convierte celsius a fahrenheit",
+ "descriptionEs": [
+ "Para probar tu aprendizaje, crearás una solucion \"desde cero\". Coloca tu código entre las líneas indicadas y este será probado contra multiples casos de prueba.",
+ "El algoritmo para convertir de Celsius a Fahrenheit consiste en multiplicar la temperatura en grados Celsius por 9/5 y al resultado agregarle 32.",
+ "Se te da una variable celsius
representando una temperatura en Celsius. Crea una variable fahrenheit
y aplica el algoritmo para asignar la correspondiente temperatura en Fahrenheit."
+ ]
},
{
"id": "bd7123c9c444eddfaeb5bdef",
@@ -853,7 +968,18 @@
"assert(myStr === \"I am a \\\"double quoted\\\" string inside \\\"double quotes\\\"\", 'message: Variable myStr should equal to (\"I am a \"double quoted\" string inside \"double quotes\"\"
).');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Escapar comillas en cadenas de texto",
+ "descriptionEs": [
+ "Cuando estas definiendo una cadena debes iniciar y terminar con apostrofes o comillas. ¿Qué pasa cuando necesitas una comilla: \"
o '
dentro de tu cadena?",
+ "En JavaScript, tu puedes escapar unas comillas para diferenciarlas de las comillas del final de la cadena colocando una barra invertida (\\
) antes de la cita.",
+ "var cadenaEjem = \"Alan dijo, \\\"Pedro esta aprendiendo JavaScript\\\".\";
",
+ "Esto le indica a JavaScript que la comilla siguiente no es el fin de la cadena, sino que debe aparecer dentro de la cadena. Así que si fueras a imprimir esto en la consola, tu obtendrías:",
+ "Alan dijo, \"Pedro esta aprendiendo JavaScript\".",
+ "Instructiones
",
+ "Usa barras invertidaspara asigar una cadena a la variable myStr
de modo que si tu fueras a imprimirla en la consola, tu verías:",
+ "I am a \"double quoted\" string inside \"double quotes\"
"
+ ]
},
{
"id": "56533eb9ac21ba0edf2244b4",
@@ -884,7 +1010,16 @@
"assert(myStr === 'Link', 'message: Only remove the backslashes \\
used to escape quotes.');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Citando cadenas con comillas simples",
+ "descriptionEs": [
+ "Los valores de Cadenas en JavaScript pueden ser escritos con comillas o apostrofes, siempre y cuando inicien y terminen con el mismo tipo de cita. A diferencia de algunos lenguajes, apostrofes y comillas son funcionalmente identicas en Javascript.",
+ "\"Esta cadena tiene \\\"comillas\\\" en esta\"
",
+ "La ventaja de usar una o la otra tiene que ver con la necesidad de escapar
comillas. Si tu tienes una cadena con algunas comillas, esta puede ser difícil de leer y escribir. En su lugar, usa apostrofes:",
+ "'Esta cadena tiene \"comillas\" en esta. Y \"probablemente\" muchas de ellas.'
",
+ "Instrucciones
",
+ "Cambia la cadena dada de comillas a apostrofes y quita el escape."
+ ]
},
{
"id": "56533eb9ac21ba0edf2244b6",
@@ -915,7 +1050,15 @@
"assert(myStr === \"\\\\ \\t \\t \\r \\n\", 'message: myStr
should have the escape sequences for backslash tab tab carriage-return new-line
separated by spaces');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Secuencias de escape en cadenas",
+ "descriptionEs": [
+ "Las comillas no son el único caracter que puede ser escapado dentro de una cadena. Aquí ahí una tabla de secuencias de escape comunes:",
+ "Código | Salida |
---|
\\' | apostrofe |
\\\" | comilla |
\\\\ | barra invertida |
\\n | nueva línea |
\\r | retorno de carro |
\\t | tabulación |
\\b | retroceso |
\\f | salto de página |
",
+ "Nota que la barra invertida por si misma tiene que ser escapada con el fin de mostrarse como una barra invertida.",
+ "Instrucciones
",
+ "Codifica la siguiente secuencia, separada por espacios:
barra invertida tabulación tabulación retorno de carro nueva línea
y asignala a myStr
"
+ ]
},
{
"id": "56533eb9ac21ba0edf2244b7",
@@ -958,7 +1101,16 @@
"assert(/myStr\\s*=/.test(code), 'message: Make sure to assign the result to the myStr
variable.');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Concatenar cadenas con el operador más",
+ "descriptionEs": [
+ "En JavaScript, cuando el operador +
es usado con un valor de Cadena
, este es llamado el operador concatenación. Tu puedes construir una nueva cadena de otras cadenas concatenandolas juntas.",
+ "Ejemplo",
+ "'Mi nombre es Alan,' + ' Yo concateno.'",
+ "Nota
Cuidado con los espacios. La concatenación no agrega espacios entre cadenas concatenadas, así que necesitarás agregarlos tu mismo.",
+ "Instrucciones
",
+ "Construye myStr
con las cadenas \"This is the start. \"
y \"This is the end.\"
usando el operador+
."
+ ]
},
{
"id": "56533eb9ac21ba0edf2244b8",
@@ -998,7 +1150,14 @@
"assert(code.match(/\\w\\s*\\+=\\s*[\"']/g).length > 1 && code.match(/\\w\\s*\\=\\s*[\"']/g).length > 1, 'message: Use the +=
operator to build myStr
');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Concatenar cadenas con el operador mas igual",
+ "descriptionEs": [
+ "Nosotros también podemos usar el operador +=
para concatenar una cadena al final de una variable de cadena existente. Esto puede ser muy útil para romper una cadena larga sobre varias líneas.",
+ "Nota
Cuidado con los espacios. La concatenación no agrega espacios entre cadenas concatenadas, así que necesitarás añadirlos tu mismo.",
+ "Instrucciones
",
+ "Construye myStr
sobre varias líneas concatenando estas dos cadenas:
\"This is the first sentence. \"
y \"This is the second sentence.\"
usando el operador +=
."
+ ]
},
{
"id": "56533eb9ac21ba0edf2244b9",
@@ -1044,7 +1203,13 @@
"assert(code.match(/[\"']\\s*\\+\\s*myName\\s*\\+\\s*[\"']/g).length > 0, 'message: Use two +
operators to build myStr
with myName
inside it');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Construir cadenas con variables",
+ "descriptionEs": [
+ "A veces necesitarás construir una cadena, al estilo Mad Libs. Mediante el uso del operador concatenación (+
), puedes insertar una o más variables dentro de una cadena que estés construyendo.",
+ "Instrucciones
",
+ "Asigna myName
a una cadena igual a tu nombre y construye myStr
con myName
entre las cadenas \"My name is \"
and \" and I am swell!\"
"
+ ]
},
{
"id": "56533eb9ac21ba0edf2244ed",
@@ -1091,7 +1256,13 @@
"assert(code.match(/\\w\\s*\\+=\\s*someAdjective\\s*;/).length > 0, 'message: Append someAdjective
to myStr
using the +=
operator');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Anexando variables a cadenas",
+ "descriptionEs": [
+ "Al igual que podemos construir una cadena en múltiples líneas a partir de cadenas literales, nosotros podemos ademas anexar variables a una cadena usando el operador más igual (+=
).",
+ "Instructiones
",
+ "Asigna someAdjective
y anexalo a myStr
usando el operador +=
."
+ ]
},
{
"id": "bd7123c9c448eddfaeb5bdef",
@@ -1177,7 +1348,7 @@
],
"type": "waypoint",
"challengeType": 1,
- "nameEs": "Usa la notación de corchetes para encontrar el primer acaracter de una cadena",
+ "nameEs": "Usa la notación de corchetes para encontrar el primer carácter de una cadena",
"descriptionEs": [
"La notación de corchetes
es una forma de obtener el caracter en un índice
específico de una cadena.",
"Los computadoras no empiezan a contar desde 1 como hacen los humanos. Comienzan en 0 ",
@@ -1220,7 +1391,17 @@
"assert(/myStr = \"Jello World\"/.test(code), 'message: Do not change the code above the line');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Comprender la inmutabilidad de cadenas",
+ "descriptionEs": [
+ "En JavaScript, los valores de las Cadenas
son inmutables, lo cual significa que ellos no pueden ser alterados una vez creados.",
+ "Por ejemplo, el siguiente código:",
+ "var miCad = \"Bob\";
myCad[0] = \"J\";
",
+ "no puede cambiar el valor de miCad
a \"Job\" porque el contenido de miCad
no puede ser alterado. Nota que esto no significa que miCad
no puede ser cambiado, solo que los valores individuales de una cadena literal no pueden ser cambiados. La única manera de cambiar miCad
sería asignandola a una nueva cadena, como esta:",
+ "var miCad = \"Bob\";
miCad = \"Job\";
",
+ "Instrucciones
",
+ "Corrige la asignación de myStr
para lograr el efecto deseado."
+ ]
},
{
"id": "bd7123c9c450eddfaeb5bdef",
@@ -1257,12 +1438,13 @@
],
"type": "waypoint",
"challengeType": 1,
- "nameEs": "Usa la notación de corchetes para encontrar el n-ésimo caracter en una cadena",
+ "nameEs": "Usar la notación de corchetes para encontrar el n-ésimo caracter en una cadena",
"descriptionEs": [
"También puede usar notación de corchetes
para obtener el caracter en otras posiciones dentro de una cadena.",
"Recuerda que los computadores empiezan a contar a 0, por lo que el primer caracter es en realidad el caracter cero.",
+ "Instrucciones
",
"Vamos a tratar de asignar a thirdLetterOfLastName
la tercera letra
de la variable lastName
.",
- "Si te atascas intenta mirar la declaración de la variable secondLetterOfFirstName
."
+ "Pista
Si te atascas intenta mirar la declaración de la variable secondLetterOfFirstName
."
]
},
{
@@ -1304,6 +1486,7 @@
"descriptionEs": [
"Con el fin de conseguir la última letra de una cadena, puedes restar uno a la longitud de la cadena.",
"Por ejemplo, si var firstName = \"Charles\"
, se puede obtener la última letra usando firstName[firstName.length - 1]
. ",
+ "Instrucciones
",
"Utiliza notación de corchetes
para encontrar el último caracter de la variabel lastName
.",
"Si te atascas intenta mirando la declaración de la variable lastLetterOfFirstName
."
]
@@ -1316,7 +1499,7 @@
"For example, you can get the value of the third-to-last letter of the var firstName = \"Charles\"
string by using firstName[firstName.length - 3]
",
"Instructions
",
"Use bracket notation to find the second-to-last character in the lastName
string.",
- " Hint
Try looking at the thirdToLastLetterOfFirstName
variable declaration if you get stuck."
+ "Hint
Try looking at the thirdToLastLetterOfFirstName
variable declaration if you get stuck."
],
"challengeSeed": [
"// Example",
@@ -1347,8 +1530,9 @@
"descriptionEs": [
"Puede utilizar el mismo principio utilizamos para recuperar el último caracter de una cadena para recuperar el n-ésimo último caracter.",
"Por ejemplo, se puede obtener el valor de la tercera última letra de la cadena var firstName = \"Charles\"
utilizando firstName[firstName.length - 3]
",
+ "Instrucciones
",
"Usa notación de corchete
para encontrar el segundo último caracter de la cadena en lastName
.",
- "Si te atascas intenta mirando la declaración de la variable thirdToLastLetterOfFirstName
."
+ "Pista
Si te atascas intenta mirando la declaración de la variable thirdToLastLetterOfFirstName
."
]
},
{
@@ -1387,7 +1571,14 @@
"assert(/\\bcat\\b/.test(test2) && /\\blittle\\b/.test(test2) && /\\bhit\\b/.test(test2) && /\\bslowly\\b/.test(test2),'message: wordBlanks(\"cat\", \"little\", \"hit\", \"slowly\")
should contain all of the passed words separated by non-word characters (and any additional words in your madlib).');"
],
"type": "checkpoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Espacios en blanco de palabras",
+ "descriptionEs": [
+ "Ahora usaremos nuestro conocimiento de cadenas para construir un juego de palabras estilo \"Mad Libs\" que llamaremos \"Espacios en Blanco de Palabras\". Vas a crear unas oraciones estilo (opcionalmente graciosa) \"Llena los espacios en blanco\".",
+ "Necesitarás usar operadores de cadenas para construir una nueva cadena result
, usando las variables previstas: myNoun
, myAdjective
, myVerb
y myAdverb
.",
+ "Además, necesitarás proporcionar cadenas adicionales, las cuales no cambiarán entre las palabras proporcionadas.",
+ "Nosotros hemos proporcionado un marco de referencia para probar tus resultados con diferentes palabras. La prueba correrá tu función con varias palabras diferentes para asegurarse que todas las palabras proporcionadas aparezcan en la salida, así como en tus cadenas adicionales."
+ ]
},
{
"id": "bd7993c9c69feddfaeb8bdef",
@@ -1420,10 +1611,11 @@
],
"type": "waypoint",
"challengeType": 1,
- "nameEs": "Almacena múltiples valores en una variable utilizando vectores en JavaScript",
+ "nameEs": "Almacena múltiples valores en una variable utilizando vectores en javascript",
"descriptionEs": [
"Con las variables tipo vector
(o en inglés array
) podemos almacenar diversos datos en un solo lugar.",
"Empiezas la declaración de un vector con un corchete de apertura, y terminas con un corchete de cierre, y pones una coma entre cada entrada, así: var sandwich = [\"mantequilla de maní\", \"jalea\" , \"pan\"]
. ",
+ "Instrucciones
",
"Ahora vamos a crear un nuevo vector llamado myArray
que contenga una cadena
y un número
(en ese orden).",
"Consulta el código comentado en el editor de texto si te atascas."
]
@@ -1458,6 +1650,7 @@
"nameEs": "Anida un vector dentro de otro vector",
"descriptionEs": [
"También puedes anidar vectores dentro de otros vectores, como este: [[\"Bulls\", 23], [\"White Sox\", 45]]
.",
+ "Instrucciones
",
"Ahora vamos a crear un vector anidado llamado myArray
."
]
},
@@ -1502,6 +1695,7 @@
"var array = [1,2,3];
",
"array[0]; //es igual a 1
",
"var data = array[1];
",
+ "Instrucciones
",
"Crea una variable llamada myData code> y asignale el primer valor del vector myArray
."
]
},
@@ -1545,6 +1739,7 @@
"Por ejemplo:",
"var ourArray = [3,2,1];
",
"ourArray[0] = 1; // equals [1,2,1]
",
+ "Instrucciones
",
"Ahora establece el dato almacenado en el índice 0 de myArray
para que sea el valor 3."
]
},
@@ -1578,7 +1773,15 @@
"assert(/myArray\\[2\\]\\[1\\]/g.test(code), 'message: You should be using bracket notation to read the value from myArray
.');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Acceder a vectores multi-dimensionales con índices",
+ "descriptionEs": [
+ "Una manera de pensar un vector multi-dimensional, es como un vector de vectores. Cuando usas corchetes para acceder a tu vector, el primer conjunto de brackets se refiere a las entradas en el vector más externo y cada nivel subsecuente de brackets se refiere al siguiente nivel de vectores internos.",
+ "Ejemplo",
+ "var vec = [
[1,2,3],
[4,5,6],
[7,8,9],
[[10,11,12], 13, 14]
];
vec[0]; // es igual [1,2,3]
vec[1][2]; // es igual 6
vec[3][0][1]; // es igual 11
",
+ "Instrucciones
",
+ "Lee de myArray
usando la notación corchete de modo que myData sea igual a 8
"
+ ]
},
{
"id": "56bbb991ad1ed5201cd392cb",
@@ -1617,6 +1820,7 @@
"nameEs": "Manipula vectores con push()",
"descriptionEs": [
"No sólo se pueden sacar datos del final de un vector con pop()
, también puedes empujar (push()
) datos al final del vector.",
+ "Instrucciones
",
"Empuja [\"dog\", 3]
al final de la variable myArray
."
]
},
@@ -1662,6 +1866,7 @@
"Otra forma de cambiar los datos en un vector es con la función .pop()
.",
".pop()
se utiliza para \"sacar\" el valor final de un vector. Podemos almacenar el valor \"sacado\" asignando pop
a una variable por ejemplo durante su declaración.",
"Todo tipo de datos puede ser \"sacado\" de un vector --números, cadenas, incluso los vectores anidadas.",
+ "Instrucciones
",
"Usa la función .pop()
para sacar el último elemento de myArray
y asigna ese valor \"sacado\" a removedFromMyArray
."
]
},
@@ -1704,6 +1909,7 @@
"descriptionEs": [
"pop()
siempre elimina el último elemento de un vector. ¿Qué pasa si quieres quitar el primero?",
"Ahí es donde entra .shift()
. Funciona igual que .pop ()
, excepto que elimina el primer elemento en lugar del pasado. ",
+ "Instrucciones
",
"Usa la función .shift()
para eliminar el primer elemento de myArray
, y el elemento que saques asignalo a removedFromMyArra
"
]
},
@@ -1746,6 +1952,7 @@
"descriptionEs": [
"No sólo se puedes correr
(shift) elementos del comienzo de un vector, también puedes descorrerlos
(unshift) al comienzo.",
"unshift()
funciona exactamente igual que push()
, pero en lugar de añadir el elemento al final del vector, unshift()
añade el elemento al comienzo del vector. ",
+ "Instrucciones
",
"Añade \"Paul\"
al comienzo de la variable myArray
usando unshift()
."
]
},
@@ -1802,7 +2009,14 @@
"assert(count > 4, 'message: You must have at least 5 items in your list');"
],
"type": "checkpoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Lista de compras",
+ "descriptionEs": [
+ "Crea una lista de compras en la variable myList
. La lista tiene que ser un vector multidimensional conteniendo varios sub-vectores.",
+ "El primer elemento en cada sub-vector debe contener una cadena con el nombre del elemento. El segundo elemento debe ser un número representando la cantidad i. e.",
+ "[\"Barra de Chocolate\", 15]
",
+ "Tiene que haber por lo menos 5 sub-vectores en la lista."
+ ]
},
{
"id": "56bbb991ad1ed5201cd392cf",
@@ -1868,7 +2082,7 @@
],
"type": "waypoint",
"challengeType": 1,
- "nameEs": "Escribe código Javascript reutilizable con funciones",
+ "nameEs": "Escribe código javascript reutilizable con funciones",
"descriptionEs": [
"En JavaScript, podemos dividir nuestro código en partes reutilizables llamadas funciones.",
"He aquí un ejemplo de una función:",
@@ -1947,7 +2161,18 @@
"assert(/^\\s*myFunction\\s*\\([\\w\\W]+\\)\\s*;/m.test(code), 'message: Call myFunction
after you define it.');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Pasando valores a funciones con argumentos",
+ "descriptionEs": [
+ "Los parámetros son variables que actúan como marcadores de lugar para los valores que han de ser entrada para una función cuando esta es llamada. Cuando una función es definida, es típicamente definida con uno o más parámetros. Los valores actuales que son entrada (or \"pasados\") dentro de una función cuando esta es llamada son concidos como argumentos.",
+ "Aquí hay una función con dos parámetros, param1
y param2
:",
+ "function testFun(param1, param2) {
console.log(param1, param2);
}
",
+ "Entonces nosotros podemos llamar testFun
:",
+ "testFun(\"Hello\", \"World\");
",
+ "Nosotros hemos pasado dos argumentos, \"Hello\"
y \"World\"
. Dentro de la función, param1
será igual a \"Hello\" y param2
será igual a \"World\". Nota que puedes llamar testFun
otra vez con argumentos diferentes y los parámetros asumirían el valor de los nuevos argumentos.",
+ "Instrucciones
",
+ "- Crea una función llamada
myFunction
que acepte dos argumentos y da salida a su suma en la consola. - Llama la función.
"
+ ]
},
{
"id": "56533eb9ac21ba0edf2244be",
@@ -2020,7 +2245,15 @@
"assert(!/var\\s+oopsGlobal/.test(code), 'message: Do not declare oopsGlobal
using the var
keyword');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Alcance global y funciones",
+ "descriptionEs": [
+ "En JavaScript, alcance se referiere a la visibilidad de variables. Las variables que definas fuera de un bloque de una función tienen alcance Global. Esto significa que ellas pueden ser vistas en todas partes en tu código JavaScript.",
+ "Las variables que pueden ser usadas sin la palabra clave var
son automáticamente creadas en el alcance global
. Esto puede tener consecuencias no deseadas en otras partes de tu código o cuando se ejecuta una función de nuevo. Tu siempre deberías declarar tus variables con var
.",
+ "Instrucciones
",
+ "Declara a variable global
myGlobal
fuera de cualquier función. Inicializala para tener un valor de 10
",
+ "Dentro de la función fun1
, asigna 5
a oopsGlobal
sin usar la palabra clave var
."
+ ]
},
{
"id": "56533eb9ac21ba0edf2244bf",
@@ -2083,7 +2316,16 @@
"assert(/var\\s+myVar/.test(code), 'message: Add a local myVar
variable');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Alcance local y funciones",
+ "descriptionEs": [
+ "Las variables que son declaradas dentro de una función, así como los parámetros de la función tienen alcance local. Eso significa que solo son visibles dentro de esa función.",
+ "Aquí esta una función myTest
con una variable local llamada loc
.",
+ "function myTest() {
var loc = \"foo\";
console.log(loc);
}
myTest(); // \"foo\"
console.log(loc); // \"undefined\"
",
+ "loc
no está definida fuera de la función.",
+ "Instrucciones
",
+ "Declara una variable local myVar
dentro de myFunction
"
+ ]
},
{
"id": "56533eb9ac21ba0edf2244c0",
@@ -2121,7 +2363,16 @@
"assert(/return outerWear/.test(code), 'message: Do not change the return statement');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Alcance global vs. local en funciones",
+ "descriptionEs": [
+ "Es posible tener variables locales y globales con el mismo nombre. Cuando tu haces esto, la variable local
toma precedencia sobre la variable global
.",
+ "En este ejemplo:",
+ "var algunaVar = \"Sombrero\";
function miFun() {
var algunaVar = \"Cabeza\";
return algunaVar;
}
",
+ "La función miFun
regresará \"Cabeza\"
porque la versión local
de la variable tiene precedencia.",
+ "Instrucciones
",
+ "Agrega una variable local a myFunction
para sobreescribir el valor de outerWear
con \"sweater\"
."
+ ]
},
{
"id": "56533eb9ac21ba0edf2244c2",
@@ -2158,7 +2409,16 @@
"assert(timesFive(0) === 0, 'message: timesFive(0)
should return 0
');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Retorna un valor desde una función con return",
+ "descriptionEs": [
+ "Nosotros podemos pasar valores dentro de una función con argumentos. Tu puedes usar una sentencia return
para enviar un valor de vuelta de una función.",
+ "Ejemplo",
+ "function plusThree(num) {
return num + 3;
}
var answer = plusThree(5); // 8
",
+ "plusThree
toma un argumento para num
y retorna un valor igual a num + 3
.",
+ "Instrucciones
",
+ "Crea una función timesFive
que acepte un argumento, lo multiplica por 5
y retorna el nuevo valor."
+ ]
},
{
"id": "56533eb9ac21ba0edf2244c3",
@@ -2204,7 +2464,16 @@
"assert(/processed\\s*=\\s*process\\(\\s*7\\s*\\)\\s*;/.test(code), 'message: You should assign process
to processed
');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Asignación con un valor retornado",
+ "descriptionEs": [
+ "Si recuerdas de nuestra discusión de Almacenar Valores con el Operador Igual, todo a la derecha del signo igual es resuelto antes que el valor sea asignado. Esto significa que nosotros podemos tomar el valor de retorno de una función y asignarlo a una variable.",
+ "Supongamos que tenemos una función pre-definida sum
la cual agrega dos números, entonces: ",
+ "ourSum = sum(5, 12);
",
+ "llamará la función sum
, la cual retornará un valor de 17
y lo asignará a la variable ourSum
.",
+ "Instrucciones
",
+ "Llama la función process
con un argumento de 7
y asigna su valor de retorno a la variable processed
."
+ ]
},
{
"id": "56533eb9ac21ba0edf2244c6",
@@ -2266,7 +2535,12 @@
"queue(testArr, 10); assert(testArr[4] === 10, 'message: After queue(testArr, 10)
, myArr[4]
should be 10
');"
],
"type": "checkpoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Hacer cola",
+ "descriptionEs": [
+ "En Ciencias de la Computación una cola es una Estructura de Datos abstracta donde los elementos son mantenidos en orden. Nuevos elementos pueden ser agregados en la parte trasera de la cola
y los elementos viejos son quitados desde el frente de la cola
.",
+ "Escribe una función queue
la cual toma un vector (arr
) y un número (item
) como argumentos. Agrega el número al final del vector, entonces retira el primer elemento del vector. La función queue debe entonces devolver el elemento que se ha eliminado."
+ ]
},
{
"id": "bd7123c9c441eddfaeb5bdef",
@@ -2303,6 +2577,7 @@
"descriptionEs": [
"En informática las estructuras de datos
son cosas que contienen datos. JavaScript tiene siete de estas. Por ejemplo, la estructura de datos Número
contiene números. ",
"Vamos a aprender acerca de la estructura de datos más básica de todas: el Boolean
. Los booleanos sólo puede contener el valor verdadero o el valor falso. Son básicamente pequeños interruptores de encendido y apagado. ",
+ "Instrucciones
",
"Vamos a modificar nuestra función welcomeToBooleans
para que devuelva true
en lugar de false
cuando se pulse el botón de ejecución."
]
},
@@ -2366,6 +2641,7 @@
" return false;
",
"}
",
"Vamos a usar la instrucción if
con else
(\"else\" puede traducirse como \"de lo contrario\") para hacer un juego de cara o sello.",
+ "Instrucciones
",
"Crea una instrucción if
con else
que retorne la cadena \"heads\"
si la variable flip
es cero, o bien que retorne \"tails\"
si la variable flip
no es cero. "
]
},
@@ -2405,7 +2681,18 @@
"assert(code.match(/val\\s*==[\\s'\"\\d]+/g).length > 0, 'message: You should use the ==
operator');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "La comparación con el operador de igualdad",
+ "descriptionEs": [
+ "Hay muchos Operadores de Comparación en JavaScript. Todos estos operadores retornan un valor booleano true
(verdadero) o false
(falso).",
+ "El operador más básico es el operador de igualdad ==
. El operador de igualdad compara dos valores y retorna true
si son equivalentes o false
si no lo son. Nota que la igualdad es diferente de la asignación (=
), la cual asigna el valor a la derecha del operador a la variable en la izquierda.",
+ "function pruebaIgualdad(miVal) {
if (miVal == 10) {
return \"Igual\";
}
return \"No Es Igual\";
}
",
+ "Si miVal
es igual a 10
, el operador de igualdad retornará true
(verdadero), así el código entre llaves será ejecutado y la función retornará \"Equal\"
. De otra manera, la función retornará \"Not Equal\"
.",
+ "Para que javascript pueda comparar dos tipos de datos
diferentes (por ejemplo, números
y cadenas de texto
), debe convertir un tipo a otro. Una vez que lo hace, sin embargo, puede comparar términos de la siguiente manera:",
+ " 1 == 1 // true
1 == 2 // false
1 == '1' // true
\"3\" == 3 // true
",
+ "Instrucciones
",
+ "Agrega el operador de igualdad
a la línea indicada de manera que la función retornará \"Equal\" cuando val
sea equivalente a 12
"
+ ]
},
{
"id": "56533eb9ac21ba0edf2244d1",
@@ -2441,7 +2728,16 @@
"assert(code.match(/val\\s*===\\s*\\d+/g).length > 0, 'message: You should use the ===
operator');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "La comparación con el operador de estricta igualdad",
+ "descriptionEs": [
+ "Igualdad estricta (===
) es la contraparte del operador de igualdad (==
). Diferente al operador de igualdad, igualdad estricta prueba los tipos de datos
y el valor de los elementos comparados.",
+ "Ejemplos",
+ "3 === 3 // true
3 === '3' // falso
",
+ "En el segundo ejemplo, 3
es de tipo Número
y '3'
es de tipo Cadena
.",
+ "Instrucciones
",
+ "Usa el operador de igualdad estricta en la sentencia if
de manera que la función retorne \"Equal\" cuando val
es estrictamente igual a 7
"
+ ]
},
{
"id": "56533eb9ac21ba0edf2244d2",
@@ -2478,7 +2774,15 @@
"assert(code.match(/val\\s*!=\\s*\\d+/g).length > 0, 'message: You should use the !=
operator');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "La comparación con el operador de desigualdad",
+ "descriptionEs": [
+ "El operador de desigualdad (!=
) es el opuesto al operador de igualdad. Esto significa \"No Igual a\" y retorna false
cuando igualdad retornaría true
y viceversa. Como el operador de igualdad, el operador de desigualdad convertirá tipos de datos mientras compara.",
+ "Ejemplos",
+ "1 != 2 // true
1 != \"1\" // false
1 != '1' // false
1 != true // false
0 != false // false
",
+ "Instrucciones
",
+ "Agrega el operador de desigualdad !=
en la sentencia if
de manera que la función retorne \"Not Equal\" (No igual a) cuando val
no es equivalente a 99
"
+ ]
},
{
"id": "56533eb9ac21ba0edf2244d3",
@@ -2519,7 +2823,15 @@
"assert(code.match(/val\\s*!==\\s*\\d+/g).length > 0, 'message: You should use the !==
operator');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "La comparación con el operador de estricta desigualdad",
+ "descriptionEs": [
+ "El operador de estricta desigualdad (!==
) es el opuesto al operador de estricta igualdad. Esto significa \"Estrictamente no Igual\" y retorna false
(falso) donde igualdad estricta retornaría true
(verdadero) y viceversa. Estricta desigualdad no convertirá tipos de datos.",
+ "Ejemplos",
+ "3 !== 3 // false
3 !== '3' // true
4 !== 3 // true
",
+ "Instrucciones
",
+ "Agrega el operador de estricta desigualdad
a la sentencia if
de manera que la función retorne \"Not Equal\" cuando val
no es estrictamente igual a 17
"
+ ]
},
{
"id": "56533eb9ac21ba0edf2244d4",
@@ -2563,7 +2875,16 @@
"assert(code.match(/val\\s*>\\s*('|\")*\\d+('|\")*/g).length > 1, 'message: You should use the >
operator at least twice');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "La comparación con el operador mayor que",
+ "descriptionEs": [
+ "El operador mayor que (>
) compara los valores de dos números. Si el número a la izquierda es mayor que el número a la derecha, este returna true
(verdadero). De otra manera, este retorna false
(falso).",
+ "Al igual que el operador de igualdad, el operador mayor que convertirá tipos de datos de valores mientras los compara.",
+ "Ejemplos",
+ " 5 > 3 // true
7 > '3' // true
2 > 3 // false
'1' > 9 // false
",
+ "Instrucciones
",
+ "Agrega el operador mayor que
para las líneas indicadas de manera que las sentencias retornadas tengan sentido."
+ ]
},
{
"id": "56533eb9ac21ba0edf2244d5",
@@ -2607,7 +2928,16 @@
"assert(code.match(/val\\s*>=\\s*('|\")*\\d+('|\")*/g).length > 1, 'message: You should use the >=
operator at least twice');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "La comparación con el operador mayor o ogual",
+ "descriptionEs": [
+ "El operador mayor o igual
(>=
) compara los valores de dos números. Si el número de la izquierda es mayor o igual a el número de la derecha, este retorna true
(verdadero). De otra manera, este retorna false
(falso).",
+ "Como el operador de igualdad, el operador mayor o igual
convertirá tipos de datos mientras esta comparando.",
+ "Ejemplos",
+ " 6 >= 6 // true
7 >= '3' // true
2 >= 3 // false
'7' >= 9 // false
",
+ "Instrucciones
",
+ "Agrega el operador mayor o igual
a las líneas indicadas de manera que las sentencias de retorno tengan sentido."
+ ]
},
{
"id": "56533eb9ac21ba0edf2244d6",
@@ -2649,7 +2979,15 @@
"assert(code.match(/val\\s*<\\s*('|\")*\\d+('|\")*/g).length > 1, 'message: You should use the <
operator at least twice');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "La comparación con el operador menor que",
+ "descriptionEs": [
+ "El operador menor que (<
) compara los valores de dos números. Si el número a la izquierda es menor que el número de la derecha, este retorna true
(verdadero). De otra manera, este retorna false
(falso). Como el operador de igualdad, el operador menor que convierte tipos de datos mientra compara.",
+ "Ejemplos",
+ " 2 < 5 // true
'3' < 7 // true
5 < 5 // false
3 < 2 // false
'8' < 4 // false
",
+ "Instrucciones
",
+ "Agregar el operador menor que
a las líneas indicadas de modo que las sentencias de retorno tengan sentido."
+ ]
},
{
"id": "56533eb9ac21ba0edf2244d7",
@@ -2693,7 +3031,15 @@
"assert(code.match(/val\\s*<=\\s*('|\")*\\d+('|\")*/g).length > 1, 'message: You should use the <=
operator at least twice');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "La comparación con el operador menor o igual",
+ "descriptionEs": [
+ "El operador menor o igual
(<=
) compara los valores de dos números. Si el número a la izquierda es menor o igual que el número de la derecha, este retorna true
(verdadero). Si el número a la izquierda es mayor que el número de la derecha, este retorna false
(falso). Al igual que el operador de igualdad, menor o igual
convierte tipos de datos.",
+ "Ejemplos",
+ " 4 <= 5 // true
'7' <= 7 // true
5 <= 5 // true
3 <= 2 // false
'8' <= 4 // false
",
+ "Instrucciones
",
+ "Agrega el operador menor o igual
a las líneas indicadas de modo que las sentencias de retorno tengan sentido."
+ ]
},
{
"id": "56533eb9ac21ba0edf2244d8",
@@ -2741,7 +3087,17 @@
"assert(myTest(51) === \"No\", 'message: myTest(51)
should return \"No\"');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "La comparación con el operador lógico y",
+ "descriptionEs": [
+ "A veces necesitarás probar más de una cosa a la vez. El operador lógico y (&&
) retorna true
(verdadero) si y solo si los operandos a la izquierda y derecha de este son verdaderos.",
+ "El mismo efecto podría lograrse anidando una sentencia if dentro de otro if:",
+ "if (num > 5) {
if (num < 10) {
return \"Yes\";
}
}
return \"No\";
",
+ "solo retornará \"Yes\" si num
esta entre 6
y 9
(6 y 9 incluidos). La misma lógica puede ser escrita como:",
+ "if (num > 5 && num < 10) {
return \"Yes\";
}
return \"No\";
",
+ "Instrucciones
",
+ "Combina las dos sentencias if dentro de una sentencia la cual retornará \"Yes\"
si val
es menor o igual a 50
y mayor o igual a 25
. De otra manera, retornará \"No\"
."
+ ]
},
{
"id": "56533eb9ac21ba0edf2244d9",
@@ -2791,7 +3147,17 @@
"assert(myTest(25) === \"Outside\", 'message: myTest(25)
should return \"Outside\"');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "La comparación con el operador lógico o",
+ "descriptionEs": [
+ "El operador lógico o (||
) retorna true
(verdadero) si cualquiera de los operandos es true
(verdadero). De otra manera, este retorna false
(falso).",
+ "El patrón de abajo debería ser familiar de los puntos de referencia anteriores:",
+ "if (num > 10) {
return \"No\";
}
if (num < 5) {
return \"No\";
}
return \"Yes\";
",
+ "retornará \"Yes\" solo si num
esta entre 5
y 10
(5 y 10 incluidos). La misma lógica puede ser escrita como:",
+ "if (num > 10 || num < 5) {
return \"No\";
}
return \"Yes\";
",
+ "Instrucciones
",
+ "Combina las dos sentencias if
dentro de una sentencia la cual retorne \"Outside\"
si val
no esta entre 10
y 20
, inclusive. De otra manera, retorna \"Inside\"
."
+ ]
},
{
"id": "56533eb9ac21ba0edf2244da",
@@ -2837,7 +3203,14 @@
"assert(/var result = \"\";/.test(code) && /return result;/.test(code), 'message: Do not change the code above or below the lines.');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Introducción de las sentencias else",
+ "descriptionEs": [
+ "Cuando una condición de una sentencia if
es verdadera, el siguiente bloque de código es ejecutado. ¿Y cuando esa condición es falsa? Normalmente nada pasaría. Con una sentencia else
(además), un bloque alternativo de código puede ser ejecutado.",
+ "if (num > 10) {
return \"Más grande que 10\";
} else {
return \"10 o Menos\";
}
",
+ "Instrucciones
",
+ "Combina las sentencias if
dentro de una sola sentencia if/else
."
+ ]
},
{
"id": "56533eb9ac21ba0edf2244db",
@@ -2879,7 +3252,14 @@
"assert(myTest(12) === \"Greater than 10\", 'message: myTest(12)
should return \"Greater than 10\"');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Introducción de las sentencias else if",
+ "descriptionEs": [
+ "Si tienes múltiples condiciones que deben abordarse, puedes encadenar sentencias if
juntas con sentencias else if
.",
+ "if (num > 15) {
return \"Más grande que 15\";
} else if (num < 5) {
return \"Más pequeño que 5\";
} else {
return \"Entre 5 y 15\";
}
",
+ "Instrucciones
",
+ "Convierte la lógica para usar sentencias else if
."
+ ]
},
{
"id": "5690307fddb111c6084545d7",
@@ -2920,7 +3300,21 @@
"assert(myTest(11) === \"Greater than or equal to 10\", 'message: myTest(11)
should return \"Greater than or equal to 10\"');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Orden lógico en sentencias else if",
+ "descriptionEs": [
+ "El orden es importante en las sentencia if
y else if
.",
+ "El ciclo es ejecutado de arriba a abajo por lo que tendrás que ser cuidadoso de cual sentencia va primero.",
+ "Toma estas dos funciones como ejemplo.",
+ "Aquí está la primera:",
+ "function foo(x) {
if (x < 1) {
return \"Less than one\";
} else if (x < 2) {
return \"Less than two\";
} else {
return \"Greater than or equal to two\";
}
}
",
+ "Y el segundo solo cambia el orden de las sentencias:",
+ "function bar(x) {
if (x < 2) {
return \"Less than two\";
} else if (x < 1) {
return \"Less than one\";
} else {
return \"Greater than or equal to two\";
}
}
",
+ "Mientras esas dos funciones parecen casi idénticas, si nosotros pasamos un número a ambas nosotros obtendremos diferentes salidas.",
+ "foo(0) // \"Less than one\"
bar(0) // \"Less than two\"
",
+ "Instrucciones
",
+ "Cambia el orden de la lógica en la función de manera que esta retorne las sentencias correctas en todos los casos."
+ ]
},
{
"id": "56533eb9ac21ba0edf2244dc",
@@ -2964,7 +3358,15 @@
"assert(myTest(25) === \"Huge\", 'message: myTest(25)
should return \"Huge\"');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Encadenamiento de sentencias else if",
+ "descriptionEs": [
+ "Las sentencias if/else
(si/además) pueden ser encadenadas juntas por una lógica compleja. Aquí esta el pseudocódigo de múltiples sentencias if
/ else if
encadenadas:",
+ "if (condition1) {
statement1
} else if (condition2) {
statement2
} else if (condition3) {
statement3
. . .
} else {
statementN
}
",
+ "Instrucciones
",
+ "Escribe sentencias if
/else if
encadenadas para cumplir las siguientes condiciones:",
+ "num < 5
- returna \"Tiny\"
num < 10
- returna \"Small\"
num < 15
- returna \"Medium\"
num < 20
- returna \"Large\"
num >= 20
- returna \"Huge\""
+ ]
},
{
"id": "5664820f61c48e80c9fa476c",
@@ -3005,7 +3407,14 @@
"assert(golfScore(5, 9) === \"Go Home!\", 'message: golfScore(5, 9)
should return \"Go Home!\"');"
],
"type": "checkpoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Código de golf",
+ "descriptionEs": [
+ "En el juego de golf cada hoyo tiene un par promedio para el número de golpes necesarios para meter la pelota. Dependiendo de que tan lejos sobre o bajo par
están tus golpes
, hay un nickname diferente.",
+ "Tu función pasará un par
y golpes
. Retorna cadenas acuerdo a esta tabla (basada en el orden de prioridad - arriba (lo más alto) a abajo (lo más bajo)):",
+ "Golpes | Retorna |
---|
1 | \"Hole-in-one!\" |
<= par - 2 | \"Eagle\" |
par - 1 | \"Birdie\" |
par | \"Par\" |
par + 1 | \"Bogey\" |
par + 2 | \"Double Bogey\" |
>= par + 3 | \"Go Home!\" |
",
+ "par
y golpes
siempre serán numéricos y positivos."
+ ]
},
{
"id": "56533eb9ac21ba0edf2244dd",
@@ -3046,7 +3455,16 @@
"assert(code.match(/break/g).length > 2, 'message: You should have at least 3 break
statements');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Seleccionar desde diferentes opciones con sentencias de cambio",
+ "descriptionEs": [
+ "Si tienes varias opciones para elegir, usa una sentencia switch
. Una sentencia switch
prueba un valor y puede tener varias sentencias case
las cuales definen varios posibles valores. Las sentencias son ejecutadas desde el primer valor case
igualado hasta que un break
sea encontrado.",
+ "Aquí hay un pseudocódigo de ejemplo:",
+ "switch (num) {
case valor1:
sentencia1;
break;
case valor2:
sentencia2;
break;
...
case valorN:
sentenciaN;
break;
}
",
+ "Los valores case
son probados con estricta igualdad (===
). El break
le dice a JavaScript que pare la ejecución de sentencias. Si el break
es omitido, la siguiente sentencia será ejecutada.",
+ "Instrucciones
",
+ "Escribe una sentencia switch la cual pruebe val
y establezca answer
para las siguientes condiciones:
1
- \"alpha\"
2
- \"beta\"
3
- \"gamma\"
4
- \"delta\""
+ ]
},
{
"id": "56533eb9ac21ba0edf2244de",
@@ -3087,7 +3505,15 @@
"assert(code.match(/break/g).length > 2, 'message: You should have at least 3 break
statements');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Agregar una opción por default en sentencias case",
+ "descriptionEs": [
+ "En una sentencia switch
puede que no seas capaz de especificar todos los posibles valores en las sentencias case
. En su lugar, puedes agregar la sentencia default
la cual será ejecutada si no es encontrada ninguna coincidencia con alguna sentencia case
. Piensa en esto como la última sentencia else
en una cadena if/else
.",
+ "Una sentencia default
debería ser el último caso.",
+ "switch (num) {
case valor1:
sentencia1;
break;
case valor2:
sentencia2;
break;
...
default:
sentenciaDefault;
}
",
+ "Instrucciones
",
+ "Escribe una sentencia switch para establecer answer
para las siguientes condiciones:
\"a\"
- \"apple\"
\"b\"
- \"bird\"
\"c\"
- \"cat\"
default
- \"stuff\""
+ ]
},
{
"id": "56533eb9ac21ba0edf2244df",
@@ -3133,7 +3559,16 @@
"assert(code.match(/case/g).length === 9, 'message: You should have nine case
statements');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Multiples opciones idénticas en sentencias de cambio",
+ "descriptionEs": [
+ "Si la sentencia break
es omitida de una sentencia case
de un switch
, las siguientes sentencias case
son ejecutadas hasta que sea encontrado un break
. Si tienes multiples entradas con la misma salida, puede representarlas en una sentencia switch
así:",
+ "switch(val) {
case 1:
case 2:
case 3:
result = \"1, 2, or 3\";
break;
case 4:
result = \"4 alone\";
}
",
+ "Los casos 1, 2, y 3 producirán el mismo resultado.",
+ "Instrucciones
",
+ "Escribe una sentencia switch para establecer answer
para los siguientes rangos:
1-3
- \"Low\"
4-6
- \"Mid\"
7-9
- \"High\"",
+ "Nota
Necesitarás tener una sentencia case
por cada número en el rango."
+ ]
},
{
"id": "56533eb9ac21ba0edf2244e0",
@@ -3188,7 +3623,16 @@
"assert(myTest(156) === \"\", 'message: myTest(156)
should be \"\" (empty string)');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Reemplazar cadenas if else con switch",
+ "descriptionEs": [
+ "Si tienes varias opciones para elegir, una sentencia switch
puede ser más fácil de escribir que varias sentencias if
/if else
anidadas. Lo siguiente:",
+ "if (val === 1) {
answer = \"a\";
} else if (val === 2) {
answer = \"b\";
} else {
answer = \"c\";
}
",
+ "puede ser reemplazado con:",
+ "switch (val) {
case 1:
answer = \"a\";
break;
case 2:
answer = \"b\";
break;
default:
answer = \"c\";
}
",
+ "Instrucciones
",
+ "Cambia las sentencias if
/if else
anidadas dentro de una sentencia switch
."
+ ]
},
{
"id": "5679ceb97cbaa8c51670a16b",
@@ -3228,7 +3672,17 @@
"assert(!/if|else/g.test(code), 'message: You should not use any if
or else
statements');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Retornar valores booleanos desde funciones",
+ "descriptionEs": [
+ "Tal vez recuerdes de La Comparación con el Operador de Igualdad que todos los operadores de comparación retornan un valor booleano true
(verdadero) or false
(falso).",
+ "Un anti-patrón común es usar una sentencia if/else
para hacer una comparación y entonces returnar
true
/false
:",
+ "function isEqual(a,b) {
if (a === b) {
return true;
} else {
return false;
}
}
",
+ "Ya que ===
returna true
(verdadero) o false
(falso), podemos simplemente retornar el resultado de la comparación:",
+ "function isEqual(a,b) {
return a === b;
}
",
+ "Instrucciones
",
+ "Arregla la función isLess
para remover las sentencias if/else
."
+ ]
},
{
"id": "56533eb9ac21ba0edf2244c4",
@@ -3273,7 +3727,17 @@
"assert(abTest(3,3) === 12 , 'message: abTest(3,3)
should return 12
');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Retornar un patron temprano para funciones",
+ "descriptionEs": [
+ "Cuando una sentencia return
es alcanzada, la ejecución de la presente función para y control la retorna a la ubicación de la llamada.",
+ "Ejemplo",
+ "function myFun() {
console.log(\"Hello\");
return \"World\";
console.log(\"byebye\")
}
myFun();
",
+ "La entrada a la consola de arriba \"Hello\", retorna \"World\", pero \"byebye\"
nunca se emite, porque la función existe en la sentencia return
.",
+ "Instrucciones
",
+ "Modifica la función abTest
de manera que si a
o b
son menor que 0
la función saldrá inmediatamente con un valor de undefined
.",
+ "Pista
Recuerda que undefined
es una palabra clave, no una cadena."
+ ]
},
{
"id": "565bbe00e9cc8ac0725390f4",
@@ -3314,7 +3778,15 @@
"assert((function(){ count = 0; cc(3);cc(2);cc('A');cc(10);var out = cc('K'); if(out === \"-1 Hold\") {return true;} return false; })(), 'message: Cards Sequence 3, 2, A, 10, K should return \"-1 Hold\"
');"
],
"type": "checkpoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Contar cartas",
+ "descriptionEs": [
+ "En el juego de casino Blackjack, un jugador puede conseguir ventaja sobre la casa manteniendo un registro del número relativo de cartas altas y bajas restantes en la baraja. Esto es llamado Conteo de Cartas.",
+ "Teniendo más cartas altas restantes en la baraja favorece al jugador. A cada carta es asignado un valor acuerdo a la tabla de abajo. Cuando el conteo es positivo, el jugador debe apostar alto. Cuando el conteo es cero o negativo, el jugador debe apostar bajo.",
+ "Valor | Cartas |
---|
+1 | 2, 3, 4, 5, 6 |
0 | 7, 8, 9 |
-1 | 10, 'J', 'Q', 'K','A' |
",
+ "Vas a escribir una función de conteo de cartas. Esta recibirá un parametro carta
e incrementa o decrementa la variable count
(conteo) global de acuerdo al valor de la carta (ver tabla). La función retornará entonces una cadena con el presente conteo y la cadena \"Bet\"
si el conteo es positivo o \"Hold\"
si el conteo es cero o negativo. El presente conteo y la desición del jugador (\"Bet\"
o \"Hold\"
) debe ser separada por un espacio único.
",
+ "Ejemplo de Salida
\"-3 Hold\"
\"5 Bet\"
"
+ ]
},
{
"id": "56bbb991ad1ed5201cd392d0",
@@ -3362,7 +3834,7 @@
],
"type": "waypoint",
"challengeType": 1,
- "nameEs": "Construye objetos en JavaScript",
+ "nameEs": "Construye objetos en javascript",
"descriptionEs": [
"Es posible que haya oído el término objeto
antes.",
"Los objetos son similares a los vectores
, excepto que en lugar de utilizar los índices para acceder y modificar sus datos, pueden accederse mediante lo que se llama propiedades
.",
@@ -3417,7 +3889,16 @@
"assert(code.match(/testObj\\.\\w+/g).length > 1, 'message: You should use dot notation twice');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Accesar a propiedades de objetos con el operador punto",
+ "descriptionEs": [
+ "Hay dos maneras de acceder a las propiedades de un objeto: con el operador punto (.
) y la notación corchete ([]
), similar a un vector.",
+ "El operador punto es lo que usar cuando tu sabes el nombre de una propiedad que estas intentando acceder antes de tiempo.",
+ "Aquí esta un ejemplo del uso del operador punto (.
) para leer una propiedad de objeto:",
+ "var myObj = {
prop1: \"val1\",
prop2: \"val2\"
};
var prop1val = myObj.prop1; // val1
var prop2val = myObj.prop2; // val2
",
+ "Instrucciones
",
+ "Lee los valores de propiedades de testObj
usando notación punto. Asigna la variable hatValue
igual a la propiedad objeto hat
y asigna la variable shirtValue
igual a la propiedad objeto shirt
."
+ ]
},
{
"id": "56533eb9ac21ba0edf2244c8",
@@ -3458,7 +3939,16 @@
"assert(code.match(/testObj\\s*?\\[('|\")[^'\"]+\\1\\]/g).length > 1, 'message: You should use bracket notation twice');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Acceder a las propiedades de objetos con la notación corchete",
+ "descriptionEs": [
+ "La segunda manera de acceder a las propiedades de un objeto es con la notación corchete ([]
). Si la propiedad del objeto que estas intentando acceder tiene un espacio en el, necesitarás usar la notación corchete.",
+ "Aquí esta un ejemplo del uso de la notación corchete para leer una propiedad de un objeto:",
+ "var myObj = {
\"Space Name\": \"Kirk\",
\"More Space\": \"Spock\"
};
myObj[\"Space Name\"]; // Kirk
myObj['More Space']; // Spock
",
+ "Nota que los nombres de propiedades con espacios en ellos tiene que estar entre comillas (apostrofes o comillas).",
+ "Instrucciones
",
+ "Lee los valores de las propiedades \"an entree\"
y \"the drink\"
de testObj
usando la notación corchete."
+ ]
},
{
"id": "56533eb9ac21ba0edf2244c9",
@@ -3500,7 +3990,18 @@
"assert(/testObj\\s*?\\[\\s*playerNumber\\s*\\]/.test(code),'message: You should use bracket notation to access testObj
');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Acceder a propiedades de objetos con variables",
+ "descriptionEs": [
+ "Otro uso de la notación corchete sobre objetos es usar una variable para acceder a una propiedad. Esto puede ser muy útil para la iteración a través de las listas de propiedades de los objetos o para hacer operaciones de búsqueda.",
+ "Aquí esta un ejemplo del uso de una variable para acceder a una propiedad:",
+ "var someProp = \"propName\";
var myObj = {
propName: \"Some Value\"
}
myObj[someProp]; // \"Some Value\"
",
+ "Aquí hay uno más:",
+ "var myDog = \"Hunter\";
var dogs = {
Fido: \"Mutt\",\n Hunter: \"Doberman\",\n Snoopie: \"Beagle\"
}
var breed = dogs[myDog]; // \"Hunter\"
console.log(breed)// \"Doberman\"
",
+ "Nota que no usamos comillas alrededor del nombre de la variable cuando se usa esta para acceder a la propiedad porque nosotros estamos usando el valor de la variable, no el nombre",
+ "Instrucciones
",
+ "Usa la variable playerNumber
para buscar player 16
en testObj
usando notación corchete."
+ ]
},
{
"id": "56bbb991ad1ed5201cd392d1",
@@ -3551,7 +4052,7 @@
],
"type": "waypoint",
"challengeType": 1,
- "nameEs": "Actualiza las propiedades de un objeto en JavaScript",
+ "nameEs": "Actualiza las propiedades de un objeto en javascript",
"descriptionEs": [
"Después de que hayas creado un objeto de JavaScript, puedes actualizar sus propiedades en cualquier momento, tal y como harías con cualquier otra variable.",
"Por ejemplo, echemos un vistazo a ourDog
:",
@@ -3564,6 +4065,7 @@
"Dado que es un perro particularmente feliz, vamos a cambiar su nombre a \"Happy Camper\". Así es como actualizamos la propiedad nombre del objeto: ",
"ourDog.name = \"Happy Camper\";
",
"Ahora, cuando ejecutemos return ourDog.name
, en lugar de obtener \"Camper\", vamos a recibir su nuevo nombre, \"Happy Camper\".",
+ "Instrucciones
",
"Vamos a actualizar la propiedad del objeto mydog
. Cambiemos su nombre de \"Coder\" a \"Happy Coder\"."
]
},
@@ -3614,12 +4116,13 @@
],
"type": "waypoint",
"challengeType": 1,
- "nameEs": "Añade nuevas propiedades a un objeto JavaScript",
+ "nameEs": "Añade nuevas propiedades a un objeto javascript",
"descriptionEs": [
"Puedes añadir nuevas propiedades a objetos existente de la misma forma que usarías para modificarlos.",
"Así es como añadimos una propiedad \"bark\"
(ladra) a nuestro objeto ourDog
:",
"ourDog.bark = \"bow-wow\";
",
"Ahora, cuando ejecutemos return ourDog.bark
, vamos a recbir su ladrido, \" bow-wow \".",
+ "Instrucciones
",
"Vamos a añadir una propiedad ladra
a myDog
y a ponerle un sonido de perro, tal como \"woof\"."
]
},
@@ -3669,10 +4172,11 @@
],
"type": "waypoint",
"challengeType": 1,
- "nameEs": "Elimina propiedades de un objeto JavaScript",
+ "nameEs": "Elimina propiedades de un objeto javascript",
"descriptionEs": [
"También podemos eliminar propiedades de los objetos de esta manera:",
"delete ourDog.bark;
",
+ "Instrucciones
",
"Borremos la propiedad \"tails\"
de myDog
."
]
},
@@ -3734,7 +4238,15 @@
"assert(!/case|switch|if/g.test(code), 'message: You should not use case
, switch
, or if
statements'); "
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Usar objetos para búsquedas",
+ "descriptionEs": [
+ "Los objetos pueden ser considerados como un almacenamiento de clave/valor, como un diccionario. Si tienes datos tabulados, tu puedes usar un objeto para \"buscar\" valores en lugar de una sentencia switch
o una cadena if/else
. Esto es más útil cuando sabes que tus datos de entrada son limitados a un cierto rango.",
+ "Aquí esta un ejemplo de una simple búsqueda inversa de alfabeto:",
+ "var alpha = {
1:\"Z\",
2:\"Y\",
3:\"X\",
4:\"W\",
...
24:\"C\",
25:\"B\",
26:\"A\"
};
alpha[2]; // \"Y\"
alpha[24]; // \"C\"
var value = 2;
alpha[value]; // \"Y\"
",
+ "Instrucciones
",
+ "Convierte la sentencia switch en una tabla de búsqueda llamada lookup
. Usala para buscar val
y asigna la cadena asociada a la variable result
."
+ ]
},
{
"id": "567af2437cbaa8c51670a16c",
@@ -3776,7 +4288,15 @@
"assert(checkObj(\"house\") === \"Not Found\", 'message: checkObj(\"house\")
should return \"Not Found\"
.');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Probar objetos para propiedades",
+ "descriptionEs": [
+ "A veces es útil revisar si la propiedad de un objeto dado existe o no. Podemos usar el método de objetos .hasOwnProperty(propname)
para determinar si ese objeto tiene el nombre de propiedad dado. .hasOwnProperty()
retorna true
o false
si la propiedad es encontrada o no.",
+ "Ejemplo",
+ "var myObj = {
top: \"hat\",
bottom: \"pants\"
};
myObj.hasOwnProperty(\"top\"); // true
myObj.hasOwnProperty(\"middle\"); // false
",
+ "Instrucciones
",
+ "Modifica la función checkObj
para probar myObj
para checkProp
. Si la propiedad es encontrada, retorna ese valor de propiedad. Si no, retorna \"Not Found\"
."
+ ]
},
{
"id": "56533eb9ac21ba0edf2244cb",
@@ -3825,7 +4345,17 @@
"assert(myMusic[1].formats.every(function(item) { return (typeof item === \"string\")}) && myMusic[1].formats.length > 1, 'message: formats
should be an array of strings with at least two elements');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Introducción a la notación objeto de javascript (JSON)",
+ "descriptionEs": [
+ "Notación de Objetos de JavaScript o JSON
usa el formato de Objetos de JavaScript para almacenar datos. JSON es flexible porque permite Estructuras de Datos con combinaciones arbitrarias de cadenas, números, booleanos, vectores y objectos.",
+ "Aquí esta un ejemplo de un objeto JSON:",
+ "var ourMusic = [
{
\"artist\": \"Daft Punk\",
\"title\": \"Homework\",
\"release_year\": 1997,
\"formats\": [
\"CD\",
\"Cassette\",
\"LP\" ],
\"gold\": true
}
];
",
+ "Este es un vector de objetos y el objeto tiene varias piezas de metadata acerca de un album. Este además tiene un vector formats
anidado. Registros de albums adicionales podrán añadirse al nivel superior de la matriz.",
+ "Nota
Necesitarás una coma entre objetos en Objetos JSON con mas de un objeto en el vector.",
+ "Instrucciones
",
+ "Agrega un nuevo album al objeto JSON myMusic
. Agrega las cadenas artist
y title
, el número release_year
y un vector de cadenas formats
."
+ ]
},
{
"id": "56533eb9ac21ba0edf2244cc",
@@ -3873,7 +4403,15 @@
"assert(/=\\s*myStorage\\.car\\.inside\\[(\"|')glove box\\1\\]/g.test(code), 'message: Use dot and bracket notation to access myStorage
');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Acceder a objetos anidados en JSON",
+ "descriptionEs": [
+ "Las propiedades y sub-propiedades de los objetos JSON pueden ser accesadas por el encadenamiento de la notación punto o corchete.",
+ "Aquí esta un objeto JSON anidado:",
+ "var ourStorage = {
\"desk\": {
\"drawer\": \"stapler\"
},
\"cabinet\": {
\"top drawer\": {
\"folder1\": \"a file\",
\"folder2\": \"secrets\"
},
\"bottom drawer\": \"soda\"
}
}
ourStorage.cabinet[\"top drawer\"].folder2; // \"secrets\"
ourStorage.desk.drawer; // \"stapler\"
",
+ "Instrucciones
",
+ "Accesa al objeto JSON myStorage
para recuperar el contenido de glove box
. Usa notación corchete para las propiedades con un espacio en su nombre."
+ ]
},
{
"id": "56533eb9ac21ba0edf2244cd",
@@ -3928,7 +4466,15 @@
"assert(/=\\s*myPlants\\[1\\].list\\[1\\]/.test(code), 'message: Use dot and bracket notation to access myPlants
');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Accesar a vectores anidados en JSON",
+ "descriptionEs": [
+ "Como hemos visto en ejemplos anteriores, los objetos JSON pueden contener objetos anidados y vectores anidados. Similar a acceder a objetos anidados, notación corchete en vectores puede ser encadenada para acceder a vectores anidados.",
+ "Aquí esta un ejemplo de como acceder a un vector anidado:",
+ "var ourPets = {
\"cats\": [
\"Meowzer\",
\"Fluffy\",
\"Kit-Cat\"
],
\"dogs\": [
\"Spot\",
\"Bowser\",
\"Frankie\"
]
};
ourPets.cats[1]; // \"Fluffy\"
ourPets.dogs[0]; // \"Spot\"
",
+ "Instrucciones
",
+ "Recupera el segundo arbol de la variable myPlants
usando notación objeto punto y notación vector corchete."
+ ]
},
{
"id": "56533eb9ac21ba0edf2244cf",
@@ -3998,7 +4544,18 @@
"update(2548, \"tracks\", \"\"); assert(!collection[2548].hasOwnProperty(\"tracks\"), 'message: After update(2548, \"tracks\", \"\")
, tracks
should not be set');"
],
"type": "checkpoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Colección de registros",
+ "descriptionEs": [
+ "Se te da un objeto JSON que representa (una pequeña parte de) tu colección de grabaciones. Cada album es identificado por un número id único y tiene varias propiedades. No todos los albums tienen una la información completa.",
+ "Escribe una función la cual toma un id
, una propiedad (prop
) y un value
.",
+ "Para el id
dado, en collection
:",
+ "Si value
no esta en blanco (value !== \"\"
) y prop
no es \"tracks\"
entonces actualiza o establece el value
para el prop
.",
+ "Si la prop
es \"tracks\"
y value
no esta en blanco, empuja el value
hasta el final del vector tracks
.",
+ "Si value
esta en blanco, elimina esa prop
.",
+ "Siempre retorna el objeto collection enterio.",
+ "Nota
No olvides usar notación corchete
cuando accedes a propiedades de objetos con variables."
+ ]
},
{
"id": "cf1111c1c11feddfaeb5bdef",
@@ -4044,7 +4601,7 @@
],
"type": "waypoint",
"challengeType": 1,
- "nameEs": "Iterar con JavaScript en ciclos",
+ "nameEs": "Iterar con javascript en ciclos",
"descriptionEs": [
"Puede ejecutar el mismo código varias veces mediante el uso de un ciclo.",
"El tipo más común de bucle de JavaScript se llama \"ciclo for\"porque se ejecuta \"por\" (for) un número específico de veces.",
@@ -4059,6 +4616,7 @@
" ourArray.push(i);
",
"}
",
"ourArray
ahora contendrá [0,1,2,3,4]
.",
+ "Instrucciones
",
"Vamos a utilizar un ciclo for
para empujar los valores del 1 al 5 en myArray
."
]
},
@@ -4111,6 +4669,7 @@
"}
",
"ourArray
ahora contendrá [0,2,4,6,8]
.",
"Vamos a cambiar nuestra inicialización
y expresión final
para que podamos contar los números impares.",
+ "Instrucciones
",
"Empuja los números impares del 1 al 9 en myArray
utilizando un ciclo for
."
]
},
@@ -4164,6 +4723,7 @@
"}
",
"ourArray
ahora contendrá [10,8,6,4,2]
.",
"Vamos a cambiar nuestra inicialización
y la expresión final
para que podamos contar hacia atrás de dos en dos pero números impares.",
+ "Instrucciones
",
"Empuja los números impares del 9 a 1 en myArray
utilizando un ciclo for
."
]
},
@@ -4207,7 +4767,15 @@
"assert(!code.match(/total[\\s\\+\\-]*=\\s*(\\d(?!\\s*;)|[1-9])/g), 'message: Do not set total
to 20 directly');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Iterar a través de un vector con un ciclo for",
+ "descriptionEs": [
+ "Una tarea común en Javascript es iterar a traves del contenido de un vector. Una manera de hacer esto es con un ciclo for
. Este código imprimirá cada elemento del vector arr
en la consola:",
+ "var arr = [10,9,8,7,6];
for (var i=0; i < arr.length; i++) {
console.log(arr[i]);
}
",
+ "Recuerda que los Vectores tienen numeración de base cero, la cual significa que el último índice del vector es de longitud - 1. Nuestra condición para este ciclo es i < arr.length
, la cual para cuando i
esta en longitud - 1.",
+ "Instrucciones
",
+ "Declara e inicializa una variable total
a 0
. Usa un ciclo for
para añadir el valor de cada elemento del vector myArr
a total
."
+ ]
},
{
"id": "56533eb9ac21ba0edf2244e1",
@@ -4245,7 +4813,15 @@
"assert(multiplyAll([[5,1],[0.2, 4, 0.5],[3, 9]]) === 54, 'message: multiplyAll([[5,1],[0.2, 4, 0.5],[3, 9]]);)
should return 54
');"
],
"type": "waypoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Anidar ciclos for",
+ "descriptionEs": [
+ "Si tu tienes una matriz multi-dimensional, puedes usar la misma lógica que el punto de referencia anterior para iterar a través de un vector y cualquier sub-vector. Aquí esta un ejemplo:",
+ "var arr = [
[1,2], [3,4], [5,6]
];
for (var i=0; i < arr.length; i++) {
for (var j=0; j < arr[i].length; j++) {
console.log(arr[i][j]);
}
}
",
+ "Esto imprime cada sub-elemento en arr
uno a la vez. Nota que para el ciclo interior, estamos comprobando la longitud .length
de arr[i]
, ya que arr[i]
es por si mismo un vector.",
+ "Instrucciones
",
+ "Modifica la función multiplyAll
de manera que esta multiplique la variable product
por cada número en los sub-vectores de arr
"
+ ]
},
{
"id": "cf1111c1c11feddfaeb1bdef",
@@ -4278,7 +4854,7 @@
],
"type": "waypoint",
"challengeType": 1,
- "nameEs": "Iterar con JavaScript con ciclos while",
+ "nameEs": "Iterar con javascript con ciclos while",
"descriptionEs": [
"Puede ejecutar el mismo código varias veces mediante el uso de un ciclo.",
"Otro tipo de ciclo de JavaScript se llama un ciclo \"while\", ya que se ejecuta, \"mientras que\" algo sea cierto y se detiene una vez que ya no sea así.",
@@ -4289,6 +4865,7 @@
" i++;
",
"}
",
"Intentemos que un ciclo while
empuje valores en un vector.",
+ "Instrucciones
",
"Empuja los números de 0 a 4 para myArray
utilizando un ciclo while
."
]
},
@@ -4355,7 +4932,17 @@
"assert(lookUp(\"Akira\", \"address\") === \"No such property\", 'message: \"Akira\", \"address\"
should return \"No such property\"');"
],
"type": "checkpoint",
- "challengeType": 1
+ "challengeType": 1,
+ "nameEs": "Búsqueda de perfiles",
+ "descriptionEs": [
+ "Tenemos un vector de objetos representando diferentes personas en nuestras listas de contactos.",
+ "Una función lookUp
que toma firstName
y una propiedad (prop
) como argumentos ha sido pre-escrita para ti.",
+ "La función debe comprobar si firstName
es un firstName
(primerNombre) de contacto actual y la propiedad dada (prop
) es una propiedad de ese contacto.",
+ "Si ambos son true(verdaderos), entonces retorna el \"value\" de esa propiedad.",
+ "Si firstName
no corresponde a ningun contacto entonces retorna \"No such contact\"
",
+ "Si prop
no corresponde a ninguna propiedad válida entonces retorna \"No such property\"
",
+ ""
+ ]
},
{
"id": "cf1111c1c11feddfaeb9bdef",
@@ -4390,10 +4977,11 @@
],
"type": "waypoint",
"challengeType": 1,
- "nameEs": "Generar fracciones al azar con JavaScript",
+ "nameEs": "Generar fracciones al azar con javascript",
"descriptionEs": [
"Los números aleatorios son útiles para crear un comportamiento aleatorio.",
"JavaScript tiene una función Math.random()
que genera un número decimal aleatorio.",
+ "Instrucciones
",
"Cambia myFunction
para que devuelva un número al azar en lugar de devolver 0
.",
"Ten en cuenta que puedes retornar lo retornado por una función, igual que harías para devolver una variable o valor."
]
@@ -4435,7 +5023,7 @@
],
"type": "waypoint",
"challengeType": 1,
- "nameEs": "Genera números aleatorios enteros con JavaScript",
+ "nameEs": "Genera números aleatorios enteros con javascript",
"descriptionEs": [
"Es muy bueno que podamos generar números decimales al azar, pero es aún más útil si lo utilizamos para generar números enteros aleatorios.",
"En primer lugar, vamos a usar Math.random()
para generar un decimal aleatorio.",
@@ -4446,7 +5034,8 @@
"Poniendo todo junto, así es como se ve nuestro código:",
"Math.floor(Math.random() * 20);
",
"¿Ves como Math.floor
toma (Math.random() * 20)
como su argumento? Así es - puedes pasar el resultado de un función como argumento de otra función.",
- "usemos esta técnica para generar y devolver un número entero aleatorio entre 0 y 9."
+ "Instrucciones
",
+ "Usa esta técnica para generar y devolver un número entero aleatorio entre 0 y 9."
]
},
{
@@ -4514,6 +5103,7 @@
"He aquí la fórmula que utilizaremos. Tómate un momento para leer y tratar de entender lo que el código está haciendo: ",
"Math.floor(Math.random() * (max - min + 1)) + min
",
"Definir dos variables: myMin
y myMax
, y asignales valores enteros.",
+ "Instrucciones
",
"A continuación, crea una función llamada myFunction
que devuelva un número aleatorio mayor o igual a myMin
, y menor o igual a myMax
. "
]
},
@@ -4576,6 +5166,7 @@
"g
significa que queremos buscar el patrón en toda la cadena y no sólo la primera ocurrencia.",
"i
significa que queremos ignorar la capitalización (en mayúsculas o minúsculas) cuando se busque el patrón.",
"Las expresiones regulares
se escriben rodeando el patrón con símbolos de barra /
.",
+ "Instrucciones
",
"Vamos a tratar de seleccionar todas las apariciones de la palabra and
en la cadena Ada Lovelace and Charles Babbage designed the first computer and the software that would have run on it
.",
"Podemos hacer esto sustituyendo la parte .
de nuestra expresión regular por la palabra and
."
]
@@ -4626,6 +5217,7 @@
"Uno de estos selectores es el de dígitos \\d
que se utiliza para hacer coincidir números en una cadena.",
"Se usa así para hacer coincidir un dígito: /\\d/g
.",
"Para hacer coincidir números de varios dígtios a menudo se escribe /\\d+/ g
, donde el +
que sigue al selector de dígito le permite a la expresión regular coincidir con uno o más dígito es decir coincide con números de varios dígitos.",
+ "Instrucciones
",
"Usa el selector \\d
para hacer coincidir todos los números de la cadena, permitiendo la posibilidad de hacer coincidir números de varios dígitos."
]
},
@@ -4674,6 +5266,7 @@
"Los espacios en blanco son \" \"
(espacio), \\r
(el retorno de carro), \\n
(nueva línea), \\t
(tabulador), y \\f
(el avance de página). ",
"Una expresión regular con el selector de espacios en blanco puede ser:",
"/\\s+/g
",
+ "Instrucciones
",
"Se usa para hacer coincidir todos los espacios en blanco en una cadena."
]
},
@@ -4718,6 +5311,7 @@
"descriptionEs": [
"Puedes invertir las coincidencias de un selector usando su versión en mayúsculas.",
"Por ejemplo, \\s
coincidirá con cualquier espacio en blanco, mientras que \\S
coincidirá con todo lo que no sea espacio en blanco.",
+ "Instrucciones
",
"Usa /\\S/g
para contar el número de caracteres que no están en blanco en testString
."
]
},
@@ -5049,7 +5643,7 @@
"type": "waypoint",
"challengeType": 0,
"isBeta": true,
- "nameEs": "Añade casillas a tu tragamonedas JavaScript",
+ "nameEs": "Añade casillas a tu tragamonedas javascript",
"descriptionEs": [
"Ahora que cada una de nuestras casillas genera números aleatorios, tenemos que comprobar si todos quedan con el mismo número.",
"Si es así, debemos notificar a nuestros usuarios que han ganado y debemos retornar null
.",
@@ -5230,7 +5824,7 @@
"type": "waypoint",
"challengeType": 0,
"isBeta": true,
- "nameEs": "Da vida a tu máquina tragamonedas en JavaScript",
+ "nameEs": "Da vida a tu máquina tragamonedas en javascript",
"descriptionEs": [
"Ahora podemos detectar una victoria. Logremos que la máquina tragamonedas funcione. ",
"Usemos un selector
de jQuery $(\".slot\")
para seleccionar todas las casillas.",
@@ -5416,7 +6010,7 @@
"type": "waypoint",
"challengeType": 0,
"isBeta": true,
- "nameEs": "Dale a tu máquina tragamonedas JavaScript algunas imágenes con estilo",
+ "nameEs": "Dale a tu máquina tragamonedas javascript algunas imágenes con estilo",
"descriptionEs": [
"Ahora añadamos algunas imágenes en nuestras casillas.",
"Ya hemos creado las imágenes por ti en una matriz llamada images
. Podemos utilizar diferentes índices para tomara cada una de estas. ",