<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Maryori S. Boneu - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Descubre miles de cursos de programación escritos por expertos. Aprende Desarrollo Web, Ciencia de Datos, DevOps, Seguridad y obtén asesoramiento profesional para desarrolladores. ]]>
        </description>
        <link>https://www.freecodecamp.org/espanol/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Maryori S. Boneu - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/espanol/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Tue, 02 Jun 2026 10:52:55 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/espanol/news/author/maryori/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Tutorial de claves de objetos en JavaScript – Cómo usar un par clave-valor en JS ]]>
                </title>
                <description>
                    <![CDATA[ Se puede agrupar datos relacionados en una sola estructura de datos al usar un objeto de JavaScript, de la siguiente manera: const escritorio = {    altura: "1 metro",    peso: "30 libras",    color: "marrón",    material: "madera",  }; Un ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/tutorial-de-claves-de-objectos-en-javascript-como-usar-un-par-clave-valor-en-js/</link>
                <guid isPermaLink="false">60022661a4e0700982a9da13</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Maryori S. Boneu ]]>
                </dc:creator>
                <pubDate>Sat, 24 Apr 2021 05:45:20 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/01/objects.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Se puede agrupar datos relacionados en una sola estructura de datos al usar un objeto de JavaScript, de la siguiente manera:</p><pre><code class="language-javascript">const escritorio = {
   altura: "1 metro",
   peso: "30 libras",
   color: "marrón",
   material: "madera",
 };
</code></pre><p>Un objeto contiene propiedades, o pares de clave-valor. El objeto <code>escritorio</code> tiene cuatro propiedades. Cada propiedad tiene un nombre, que también se le llama clave y, además, tiene su valor correspondiente. </p><p>Por ejemplo, la clave <code>altura</code><strong><strong> </strong></strong>tiene un valor de <code>"1 metro"</code>. Juntos, la clave y el valor conforman una propiedad.</p><pre><code class="language-javascript">altura: "1 metro",
</code></pre><p>El objeto <code>escritorio</code> contiene datos sobre un escritorio. De hecho, esta es la razón por la cual usarías un objeto de JavaScript: para guardar datos. También es simple obtener los datos que se guardan en los objetos. Estos aspectos hacen que los objetos sean bastante útiles.</p><p>Este artículo te pondrá al día con los objetos en JavaScript:</p><ul><li>Cómo crear un objeto</li><li>Cómo guardar datos en un objeto</li><li>Y cómo obtener datos de dicho objeto</li></ul><p>Empecemos por crear un objeto.</p><h1 id="c-mo-crear-un-objeto-en-javascript">Cómo crear un objeto e<strong><strong>n JavaScript</strong></strong></h1><p>Crearé un objeto llamado <code>pizza</code> &nbsp;y le agregaré pares de clave-valor:</p><pre><code class="language-javascript">const pizza = {
   ingrediente: "queso",
   salsa: "marinara",
   tamaño: "pequeña"
};
</code></pre><p>Las claves se encuentran a la izquierda de los dos puntos<strong><strong> <code>:</code></strong></strong> y los valores a su derecha. Cada par clave-valor es una <code>propiedad</code>. Hay tres propiedades en este ejemplo:</p><ul><li>La clave <strong>ingrediente</strong> tiene como valor <strong><strong>“</strong>queso<strong>”</strong></strong></li><li>La clave <strong>salsa </strong>tiene como valor <strong><strong>“</strong>marinara<strong>”</strong></strong></li><li>La clave <strong>tamaño </strong>tiene como valor <strong><strong>“</strong>pequeña<strong>”</strong></strong></li></ul><p>Cada propiedad se separa con una coma. Todas las propiedades se envuelven dentro de llaves <code>{}</code>.</p><p>Esta es la sintaxis básica de los objetos. Pero hay unas cuantas reglas que debes tener en cuenta al crear objetos en JavaScript.</p><h3 id="claves-de-los-objetos-en-javascript"><strong>Claves de los objetos<strong> </strong>e<strong>n JavaScript</strong></strong></h3><p>Cada clave en tu objeto de JavaScript debe ser una cadena de texto, símbolo o número.</p><p>Observa con detalle el ejemplo a continuación. Las claves nombradas <strong><strong><code>1</code></strong></strong> y <strong><strong><code>2</code> </strong></strong>generan coerción a cadenas de texto.</p><pre><code class="language-javascript">const carritoDeCompras = {
   1: "manzana",
   2: "naranjas"
};
</code></pre><p>Es una diferencia que se hace clara cuando imprimes el objeto:</p><pre><code class="language-javascript">console.log(carritoDeCompras);
// Resultado: { '1': 'manzana', '2': 'naranjas' }
</code></pre><p>Hay otra regla a tener en cuenta sobre los nombres de las claves: si tu clave tiene espacios, debes envolverla dentro de comillas.</p><p>Observa el objeto <code>programador</code> a continuación. Notarás el nombre de la última clave, <code>"nombre del proyecto actual"</code>. Esta clave tiene espacios, por lo que la envolví en comillas.</p><pre><code class="language-javascript">const programador = {
   primerNombre: "Phil",
   edad: 21,
   desarrolladorBackend: true,
   lenguajes: ["Python", "JavaScript", "Java", "C++"],
   "nombre del proyecto actual": "La aplicación asombrosa"
};
</code></pre><h3 id="valores-de-objetos-en-javascript"><strong>Valores de objetos en<strong> JavaScript</strong></strong></h3><p>Por otra parte, un valor puede ser cualquier tipo de dato, incluyendo un arreglo, número o un booleano. Los valores en el ejemplo anterior son de los siguientes tipos: cadena de texto, número entero, booleano y un arreglo.</p><p>Puedes incluso usar una función como valor, caso en el cuál se le conoce como un método. <code>sonidos()</code>, en el objeto a continuación, es un ejemplo.</p><pre><code class="language-javascript">const animal = {
   tipo: "gato",
   nombre: "gatito",
   sonidos() { console.log("miau miau") }
};
</code></pre><p>Ahora digamos que quieres agregar o eliminar un par clave-valor. O simplemente quieres obtener el valor de un objeto.</p><p>Puedes hacer esto al usar notación por punto o notación por corchetes, que abordaremos a continuación.</p><h1 id="notaci-n-por-punto-y-notaci-n-por-corchetes-en-javascript"><strong>Notación por punto y notación por corchetes en <strong>JavaScript</strong></strong></h1><p>Las notaciones por punto y por corchetes son dos maneras de acceder y usar las propiedades de un objeto. Es probable que uses la notación por punto más seguido, así que empezaremos con esta.</p><h3 id="c-mo-agregar-un-par-clave-valor-con-la-notaci-n-por-punto-en-javascript"><strong>Cómo agregar un par clave-valor con la notación por punto en<strong> JavaScript</strong></strong></h3><p>Crearé un objeto vacío <code>libro</code><strong><strong> </strong></strong>a continuación:</p><pre><code class="language-javascript">const libro = {};
</code></pre><p>Para agregar un par clave-valor usando la notación por punto, usa la siguiente sintaxis:</p><p><code>nombreDelObjeto.nombreDeLaClave = valor</code></p><p>Este sería el código para agregar la clave <code>autor</code> y el valor <code>"Jane Smith"</code> al objeto <code>libro</code>:</p><pre><code class="language-javascript">libro.autor = "Jane Smith";
</code></pre><p>Desglosando el código anterior, tenemos que:</p><ul><li><code>libro</code> es el nombre del objeto</li><li><code>.</code> (punto)</li><li><code>autor</code> es el nombre de la clave</li><li><code>=</code> (igual a)</li><li><code>"Jane Smith"</code> es el valor</li></ul><p>Al imprimir el objeto libro, veremos el par clave-valor recientemente agregado:</p><pre><code class="language-javascript">console.log(libro);
// Resultado: { autor: "Jane Smith" }
</code></pre><p>Agregaré otro par clave-valor al objeto <code>libro</code>.</p><pre><code class="language-javascript">libro.añoDePublicación = 2006;
</code></pre><p>El objeto <code>libro</code> ahora tiene 2 propiedades.</p><pre><code class="language-javascript">console.log(libro);
// Resultado: { autor: 'Jane Smith', añoDePublicación: 2006 }</code></pre><h3 id="c-mo-acceder-a-los-datos-usando-notaci-n-por-punto-en-un-objeto-de-javascript"><strong>Cómo acceder a los datos usando notación por punto en un objeto de <strong>JavaScript</strong></strong></h3><p>También puedes usar notación por punto en una clave para acceder a su valor asociado.</p><p>Considera el objeto <code>jugadorDeBaloncesto</code>.</p><pre><code class="language-javascript">const jugadorDeBaloncesto = {
   nombre: "James",
   promedioDePuntosPorJuego: 20,
   estatura: "1 metro, 89 centímetros",
   posición: "escolta"
};</code></pre><p>Digamos que quieres obtener el valor "escolta". La sintaxis a usar es la siguiente:</p><p><code>nombreDelObjeto.nombreDeLaClave</code></p><p>Hagamos uso de esta sintaxis para obtener e imprimir el valor "escolta".</p><pre><code class="language-javascript">console.log(jugadorDeBaloncesto.posición);
// Resultado: escolta
</code></pre><p>Desglosando el código anterior, tenemos que:</p><ul><li><code>jugadorDeBaloncesto</code> es el nombre del objeto</li><li><code>.</code> (punto)</li><li><code>posición</code> es el nombre de la clave</li></ul><p>Este es otro ejemplo:</p><pre><code class="language-javascript">console.log(jugadorDeBaloncesto.nombre);
// Resultado: James
</code></pre><h3 id="c-mo-eliminar-un-par-clave-valor-en-javascript"><strong>Cómo eliminar un par clave-valor en <strong>JavaScript</strong></strong></h3><p>Para eliminar en par clave-valor, usa el operador <code>delete</code>. Esta es la sintaxis:</p><p><code>delete nombreDelObjeto.nombreDeLaClave</code></p><p>Entonces, para eliminar la clave <code>estatura</code> y su valor del objeto <code>jugadorDeBaloncesto</code>, escribe el siguiente código:</p><pre><code class="language-javascript">delete jugadorDeBaloncesto.estatura;
</code></pre><p>Como resultado, el objeto <code>jugadorDeBaloncesto</code> ahora tiene 3 pares clave-valor.</p><pre><code class="language-javascript">console.log(jugadorDeBaloncesto);
// Resultado: { nombre: "James", promedioDePuntosPorJuego: 20, posición: "escolta" }
</code></pre><p>Lo más probable es que uses la notación por punto frecuentemente, pero existen ciertos requisitos que debes tener en cuenta.</p><p>Cuando usas la notación por punto, los nombres de las claves no pueden tener espacios, guiones o empezar con un número.</p><p>Por ejemplo, digamos que intentaré agregar una clave que contiene espacios usando la notación por punto. Obtendré un error.</p><pre><code class="language-javascript">jugadorDeBaloncesto.porcentaje de tiros = "75%";
// Resulta en un error
</code></pre><p>Esto quiere decir que la notación por punto no sirve en todas las situaciones. Por eso existe otra opción: notación por corchetes.</p><h3 id="c-mo-agregar-un-par-clave-valor-usando-notaci-n-por-corchetes-en-javascript"><strong>Cómo agregar un par clave-valor usando notación por corchetes en <strong>JavaScript</strong></strong></h3><p>Así como la notación por punto, puedes usar notación por corchetes para agregar un par clave-valor a un objeto.</p><p>La notación por corchetes ofrece más flexibilidad que la notación por punto. Esto es porque los nombres de las claves <em>pueden </em>incluir espacios y guiones, así como empezar con números.</p><p>Crearé un objeto <code>empleado</code><strong><strong> </strong></strong>a continuación.</p><pre><code class="language-javascript">const empleado = {};
</code></pre><p>Ahora quiero agregar un par clave-valor usando notación por corchetes. Esta es la sintaxis:</p><p><code>nombreDelObjeto[“nombreDeLaClave”] = valor</code></p><p><strong>[!] El párrafo a continuación tiene la clave y el valor invertidos en el original. Corregido:</strong></p><p>Entonces, de esta manera agregaría la clave <code>ocupación</code> y el valor <code>"ventas"</code> al objeto <code>empleado</code>.</p><pre><code class="language-javascript">empleado["ocupación"] = "ventas";
</code></pre><p>Desglosando el código anterior, tenemos que:</p><ul><li><code>empleado</code> es el nombre del objeto</li><li><code>"ocupación"</code> es el nombre de la clave</li><li><code>=</code> (igual a)</li><li><code>"ventas"</code> es el valor</li></ul><p>A continuación encontramos muchos más ejemplos que usan la flexibilidad de la notación por corchetes para agregar una variedad de pares clave-valor.</p><pre><code class="language-javascript">//Agrega clave con múltiples palabras
empleado["viaja frecuentemente"] = true;
 
//Agrega clave que empieza con un número y contiene un guión
empleado["1er-territorio"] = "Chicago";
 
//Aagrega clave que empieza con un número
empleado["25"] = "clientes totales";
</code></pre><p>Cuando imprimo el objeto <code>empleado</code>, se ve de la siguiente manera:</p><pre><code class="language-javascript">{
  '25': "clientes totales",
  ocupación: "ventas",
  "viaja frecuentemente": true,
  "1er-territorio": "Chicago"
}
</code></pre><p>Con esta información en mente, podemos agregar la clave <code>"porcentaje de tiros"</code> al objeto <code>jugadorDeBaloncesto</code> del ejemplo anterior.</p><pre><code class="language-javascript">const jugadorDeBaloncesto = {
   nombre: "James",
   promedioDePuntosPorJuego: 20,
   estatura: "1 metro, 89 centímetros",
   posición: "escolta"
};
</code></pre><p>Si lo recuerdas, la notación por punto nos arrojaba un error cuando intentamos agregar una clave que incluye espacios.</p><pre><code class="language-javascript">jugadorDeBaloncesto.porcentaje de tiros = "75%";
// Resulta en un error</code></pre><p>Pero la notación por corchetes nos libera de errores, como puedes ver aquí:</p><pre><code class="language-javascript">jugadorDeBaloncesto["porcentaje de tiros"] = "75%";
</code></pre><p>Este es el resultado que obtengo cuando imprimo el objeto:</p><pre><code class="language-javascript">{
  nombre: "James",
  promedioDePuntosPorJuego: 20,
  estatura: "1 metro, 89 centímetros",
  posición: "escolta"
  "porcentaje de tiros": "75%"
}
</code></pre><h3 id="como-acceder-a-los-datos-en-un-objeto-de-javascript-usando-notaci-n-por-corchetes"><strong>Como acceder a los datos en un objeto de <strong>JavaScript </strong>usando notación por corchetes</strong></h3><p>También puedes usar notación por corchetes en una llave para acceder al valor asociado.</p><p>Recuerda el objeto <code>animal</code> al comienzo del artículo.</p><pre><code class="language-javascript">const animal = {
   tipo: "gato",
   nombre: "gatito",
   sonidos() { console.log("miau miau") }
};</code></pre><p>Obtengamos el valor asociado con la clave <code>nombre</code>. Para hacer esto, envuelve dentro de corchetes la clave entre comillas. Esta es la sintaxis: </p><p><code>nombreDelObjeto[“nombreDeLaClave”]</code></p><p>Y este es el código que escribirías con notación por corchetes: <code>animal["nombre"];</code>.</p><p>Desglosando el código de arriba, tenemos que:</p><ul><li><code>animal</code> es el nombre del objeto</li><li><code>["nombre"]</code> es la clave entre comillas dentro de los corchetes</li></ul><p>A continuación otro ejemplo.</p><pre><code class="language-javascript">console.log(animal["sonidos"]());

// Resultado: 
miau miau
undefined
</code></pre><p>Ten en cuenta que <code>sonidos()</code> es un método, razón por la cual agregué los paréntesis al final para invocarlo.</p><p>Para invocar un método usando la notación por punto sería:</p><pre><code class="language-javascript">console.log(animal.sonidos());

// Resultado: 
miau miau
undefined</code></pre><h1 id="m-todos-de-objetos-en-javascript"><strong>Métodos de objetos en <strong>JavaScript</strong></strong></h1><p>Sabes como acceder propiedades específicas. Pero ¿qué pasaría si quieres <em>todas</em> las claves o <em>todos</em> los valores de un objeto?</p><p>Existen dos métodos que te darán la información que necesitas.</p><pre><code class="language-javascript">const corredora = {
   nombre: "Jessica",
   edad: 20,
   kilómetrosPorSemana: 64,
   carrera: "maratón"
};
</code></pre><p>Usa el método <code>Object.keys()</code> para obtener todos los nombres de las claves en un objeto.</p><p>Esta es la sintaxis:</p><p><code>Object.keys(nombreDelObjeto)</code></p><p>Podemos usar este método sobre el objeto <code>corredora</code>.</p><pre><code class="language-javascript">Object.keys(corredora);</code></pre><p>Si imprimes el resultado, obtendrás un arreglo con las claves del objeto.</p><pre><code class="language-javascript">console.log(Object.keys(corredora));
// Resultado: [ 'nombre', 'edad', 'kilometrosPorSemana', 'carrera' ]
</code></pre><p>De la misma forma, puedes usar el método <code>Object.values()</code> para obtener todos los valores de un objeto. Esta es la sintaxis:</p><p><code>Object.values(nombreDelObjeto)</code></p><p>Ahora obtendremos todos los valores del objeto <code>corredora</code>.</p><pre><code class="language-javascript">console.log(Object.values(corredora));
// Resultado: [ 'Jessica', 20, 64, 'maratón' ]</code></pre><p>Hemos cubierto bastante terreno. He aquí un resumen de las ideas clave:</p><p><strong>Objetos<strong>:</strong></strong></p><ul><li>Usa objetos para almacenar datos como propiedades (pares clave-valor).</li><li>Los nombres de las claves deben ser cadenas de texto, símbolos o números.</li><li>Los valores pueden ser de cualquier tipo.</li></ul><p><strong><strong>Acce</strong>der a las propiedades de los<strong> objet</strong>os:</strong></p><ul><li>Notación por punto: <code>objectName.nombreDeLaClave</code></li><li>Notación por corchetes: <code>objectName[“nombreDeLaClave”]</code></li></ul><p><strong>Eliminar una propiedad<strong>:</strong></strong></p><ul><li><code>delete objectName.nombreDeLaClave</code></li></ul><p>Es mucho lo que puedes hacer con los objetos. Ahora que tienes algunas bases, puedes sacar ventaja de este poderoso tipo de dato de JavaScript.</p><p><em>Escribo sobre aprender a programar y las mejores maneras de hacerlo en <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><a href="http://amymhaddad.com/" rel="noopener nofollow">amymhaddad.com</a>.</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em> También escribo en Twitter sobre programación, aprendizaje y productividad<em><em><em><em><em><em><em>:<em><em><em><em><em><em><em><em> <a href="https://twitter.com/amymhaddad" rel="noopener nofollow">@amymhaddad</a></em></em></em></em></em></em></em></em></em></em></em></em></em></em>.</em></em></p><p>Traducido del artículo de <a href="https://www.freecodecamp.org/news/author/amy/"><strong>Amy Haddad</strong></a> - <strong><a href="https://www.freecodecamp.org/news/javascript-object-keys-tutorial-how-to-use-a-js-key-value-pair/">JavaScript Object Keys Tutorial – How to Use a JS Key-Value Pair</a></strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Eventos de tiempo en JavaScript: setTimeout y setInterval ]]>
                </title>
                <description>
                    <![CDATA[ Los programadores usan eventos de tiempo para retrasar la ejecución de cierto código, o para repetir código a un intervalo de tiempo específico. Existen dos funciones nativas en la librería de JavaScript para lograr estas tareas: setTimeout() y setInterval(). setTimeout setTimeout() es usada para retrasar la ejecución de la función ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/eventos-de-tiempo-en-javascript-settimeout-y-setinterval/</link>
                <guid isPermaLink="false">5ffa28d58c7cd154bb98608f</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Maryori S. Boneu ]]>
                </dc:creator>
                <pubDate>Wed, 03 Mar 2021 06:15:02 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/03/photo-1495364141860-b0d03eccd065-1-.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Los programadores usan eventos de tiempo para retrasar la ejecución de cierto código, o para repetir código a un intervalo de tiempo específico.</p><p>Existen dos funciones nativas en la librería de JavaScript para lograr estas tareas: <code>setTimeout()</code> y <code>setInterval()</code>.</p><h3 id="settimeout"><strong><strong>setTimeout</strong></strong></h3><p><code>setTimeout()</code> es usada para retrasar la ejecución de la función pasada como argumento por un periodo de tiempo determinado.</p><p>Hay dos parámetros que se pasan a <code>setTimeout()</code>: la función que quieres llamar y el tiempo (expresado en milisegundos) a retrasar la ejecución de la función.</p><p>Recuerda que hay 1000 milisegundos (ms) en 1 segundo, entonces 5000 ms equivale a 5 segundos y así sucesivamente.</p><p><code>setTimeout()</code> ejecutará la función del primer argumento una vez, tan pronto como haya transcurrido el tiempo especificado.</p><p><strong><strong>E</strong>jemplo<strong>:</strong></strong></p><pre><code class="language-javascript">let identificadorTiempoDeEspera;

function temporizadorDeRetraso() {
  identificadorTiempoDeEspera = setTimeout(funcionConRetraso, 3000);
}

function funcionConRetraso() {
  alert("Han pasado 3 segundos.");
}</code></pre><p>Cuando la función <code>temporizadorDeRetraso</code> es llamada, ejecutará <code>setTimeout</code>. Luego que pasen 3 segundos (3000 ms), ejecutará <code>funcionConRetraso</code> que mostrará una alerta.</p><p><strong><strong>setInterval</strong></strong></p><p>Usa <code>setInterval()</code> para hacer que una función se repita con un tiempo de retraso entre cada ejecución.</p><p>Una vez más, se pasan dos parámetros a <code>setInterval()</code>: la función que quieres llamar y el tiempo en milisegundos a retrasar cada ejecución de la función.</p><p><code>setInterval()</code> continuará ejecutándose hasta que sea borrada.</p><p><strong><strong>E</strong>jemplo<strong>:</strong></strong></p><pre><code class="language-javascript">let identificadorIntervaloDeTiempo;

function repetirCadaSegundo() {
  identificadorIntervaloDeTiempo = setInterval(mandarMensaje, 1000);
}

function mandarMensaje() {
  console.log("Ha pasado 1 segundo.");
}</code></pre><p>Cuando tu código llama a la función <code>repetirCadaSegundo</code>, ejecutará <code>setInterval</code>. <code>setInterval</code> correrá la función <code>mandarMensaje</code> cada segundo (1000 ms).</p><h3 id="cleartimeout-y-clearinterval"><strong><strong>clearTimeout </strong>y<strong> clearInterval</strong></strong></h3><p>También existen funciones nativas correspondientes para detener los eventos de tiempo: <code>clearTimeout()</code> y <code>clearInterval()</code>.</p><p>Como has podido observar, cada función de temporizador <code>setTimeout()</code> y <code>setInterval()</code>, en los ejemplos anteriores, han sido guardadas en una variable. Cuando alguna de estas funciones se ejecuta, le es asignada un número (identificador), el cual es guardado en dicha variable. Ten en cuenta que JavaScript hace todo esto en segundo plano.</p><p>El número generado es único para cada instancia de los temporizadores. Este número también es la manera como los temporizadores son identificados cuando quieres detenerlos. Por esta razón, deberás siempre asignar el temporizador a una variable.</p><p>Para que tu código sea entendible, deberías siempre emparejar: </p><ul><li><code>clearTimeout()</code> con <code>setTimeout()</code> y </li><li><code>clearInterval()</code> con <code>setInterval()</code>.</li></ul><p>Para detener un temporizador, llama a la correspondiente función para borrarlo y pásale la variable identificadora que corresponde al temporizador que quieres detener. La sintaxis para <code>clearInterval()</code> y <code>clearTimeout()</code> son la misma.</p><p><strong>Ejemplo<strong>:</strong></strong></p><pre><code class="language-javascript">let identificadorDeTemporizador;

function temporizadorDeRetraso() {
  identificadorDeTemporizador = setTimeout(funcionConRetraso, 3000);
}

function funcionConRetraso() {
  alert("Three seconds have elapsed.");
}

function borrarAlerta() {
  clearTimeout(identificadorDeTemporizador);
}</code></pre><p>Traducido del artículo <strong><a href="https://www.freecodecamp.org/news/javascript-timing-events-settimeout-and-setinterval/">JavaScript Timing Events: setTimeout and setInterval</a></strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cuatro maneras diferentes de buscar dentro de un arreglo en JavaScript ]]>
                </title>
                <description>
                    <![CDATA[ Existen diferentes métodos que se pueden usar en JavaScript para buscar elementos dentro de un arreglo. El método a elegir depende del caso de uso particular. Por ejemplo,   * Si quieres obtener todos los elementos del arreglo que cumplen una condición    específica, o   ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/cuatro-maneras-diferentes-de-buscar/</link>
                <guid isPermaLink="false">5ff72e0d8c7cd154bb9855c3</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Maryori S. Boneu ]]>
                </dc:creator>
                <pubDate>Tue, 02 Mar 2021 06:09:45 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/02/photo-1586769852836-bc069f19e1b6-1-.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Existen diferentes métodos que se pueden usar en JavaScript para buscar elementos dentro de un arreglo. El método a elegir depende del caso de uso particular.</p><p>Por ejemplo, </p><ul><li>Si quieres obtener todos los elementos del arreglo que cumplen una condición específica, o </li><li>Simplemente quieres saber si al menos uno de los elementos cumple dicha condición. </li><li>Si quieres saber si un valor específico hace parte del arreglo, o </li><li>Quieres obtener el índice de tal valor. </li></ul><p>Para todos estos casos de uso, los métodos de JavaScript Array.prototype te ayudarán. En este artículo, discutiremos cuatro métodos que podemos usar para buscar un elemento dentro de un arreglo. Estos métodos son:</p><ol><li>Filter (<em>filtro</em>)</li><li>Find (<em>encuentra</em>)</li><li>Includes (<em>incluye</em>)</li><li>IndexOf (<em>índice de</em>)</li></ol><p>Veamos cada uno de ellos.</p><h3 id="array-filter-"><strong><strong>Array.filter()</strong></strong></h3><p>Podemos usar el método Array.filter() para encontrar los elementos dentro de un arreglo que cumplan con cierta condición. Por ejemplo, si queremos obtener todos los elementos de un arreglo de números que sean mayores a 10, podemos hacer lo siguiente:</p><pre><code class="language-js">let arreglo = [10, 11, 3, 20, 5];

let mayorQueDiez = arreglo.filter(element =&gt; element &gt; 10);

console.log(mayorQueDiez) // [11, 20]</code></pre><p>La sintaxis para usar el método array.filter() es la siguiente:</p><pre><code class="language-text">let nuevoArreglo = arreglo.filter(callback);</code></pre><p>Donde:</p><ul><li><code>nuevoArreglo</code> es el nuevo arreglo devuelto</li><li><code>arreglo</code> es el arreglo sobre el cual se llama el método <code>filter</code></li><li><code>callback</code> es la función Callback que se aplica a cada uno de los elementos del arreglo</li></ul><p>Si ninguno de los elementos del arreglo cumple con la condición, se devuelve un arreglo vacío. Puedes leer más sobre este método <a href="https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/Array/filter">aquí</a>.</p><p>Hay ocasiones en las que no necesitamos todos los elementos que cumplen una condición. Solo queremos saber si hay al menos un elemento que la cumpla. En ese caso, necesitas el método find().</p><h3 id="array-find-"><strong><strong>Array.find()</strong></strong></h3><p>Usamos el método Array.find() para encontrar el primer elemento que cumple cierta condición. Tal como el método anterior, toma un Callback como argumento y devuelve el primer elemento que cumpla la condición establecida.</p><p>Usemos el método <code>find</code> en el arreglo de nuestro ejemplo anterior.</p><pre><code class="language-js">let arreglo = [10, 11, 3, 20, 5];

let existeElementoMayorQueDiez = arreglo.find(element =&gt; element &gt; 10);

console.log(existeElementoMayorQueDiez) // 11</code></pre><p>La sintaxis de array.find() es:</p><pre><code class="language-js">let primerElementoEncontrado = arreglo.find(callback);</code></pre><p>Callback es la función que se ejecuta sobre cada uno de los valores del arreglo y recibe tres argumentos:</p><ul><li><code>element</code> el elemento sobre el cual se está iterando (requerido)</li><li><code>index</code> - el índice/posición del elemento actual (opcional)</li><li><code>array</code> - el arreglo sobre el que se llamó <code>find</code> (opcional)</li></ul><p>Toma nota que si ninguno de los elementos del arreglo cumple con la condición, devuelve <code>undefined</code>.</p><p>Ahora, ¿qué pasaría si quieres comprobar que un elemento específico existe dentro del arreglo? ¿cómo haríamos esto?</p><h3 id="array-includes-"><strong><strong>Array.includes()</strong></strong></h3><p>El método includes() determina si un arreglo incluye un valor específico y devuelve verdadero o falso según corresponda.</p><p>En el ejemplo anterior, si queremos revisar si 20 es uno de los elementos del arreglo, podemos hacer lo siguiente:</p><pre><code class="language-js">let arreglo = [10, 11, 3, 20, 5];

let incluyeVeinte = arreglo.includes(20);

console.log(incluyeVeinte) // true</code></pre><p>Notarás la diferencia entre este y los anteriores métodos que hemos visto. Este método acepta como argumento un valor en vez de un Callback. </p><p>La sintaxis de array.includes() es:</p><pre><code class="language-js">let incluyeValor = arreglo.includes(valorAEncontrar, aPartirDelIndice)</code></pre><p>Donde</p><ul><li><code>valorAEncontrar</code> es el valor que estás buscando dentro del arreglo (requerido)</li><li><code>aPartirDelIndice</code> es el índice o la posición en el arreglo desde la que deseas empezar tu búsqueda (opcional)</li></ul><p>Para entender mejor el concepto del índice, repasemos nuestro ejemplo una vez más. Si queremos verificar que el arreglo contenga 10 partiendo desde la segunda posición, podemos hacer lo siguiente:</p><pre><code class="language-js">let arreglo = [10, 11, 3, 20, 5];

let incluyeDiezDosVeces = arreglo.includes(10, 1);

console.log(incluyeDiezDosVeces) //falso</code></pre><p>Nota: recuerda que los índices de los elementos se cuentan desde cero, por lo que debes restar 1 a la posición con la que quieras empezar.</p><h3 id="array-indexof-"><strong><strong>Array.indexOf()</strong></strong></h3><p>El método indexOf() devuelve el primer índice encontrado de un elemento específico. Devuelve -1 si el elemento no existe en el arreglo.</p><p>Volvamos a nuestro ejemplo. Encontremos el índice de 3 en el arreglo.</p><pre><code class="language-js">let arreglo = [10, 11, 3, 20, 5];

let indiceDeTres = arreglo.indexOf(3);

console.log(indiceDeTres) // 2</code></pre><p>Su sintaxis es similar al médoto <code>includes</code>:</p><pre><code class="language-js">let indiceDeElemento = arreglo.indexOf(elemento, aPartirDelIndice)</code></pre><p>Donde:</p><ul><li><code>elemento</code> es el elemento que estás buscando dentro del arreglo (requerido)</li><li><code>aPartirDelIndice</code> es el índice o la posición en el arreglo desde la que deseas empezar tu búsqueda (opcional)</li></ul><p>Es importante mencionar que los métodos <code>includes</code> e <code>indexOf</code> usan igualdad estricta ( '===' ) para buscar dentro de un arreglo. Si los valores son de distinto tipo (por ejemplo '4' y 4), devolverán <code>false</code> y <code>-1</code> respectivamente.</p><h2 id="resumen"><strong>Resumen</strong></h2><p>Con estos métodos para arreglos, no necesitas usar un bucle para buscar dentro de estos. Dependiendo de lo que necesites, puedes decidir cuál de todos estos métodos es el mejor de acuerdo a tu caso de uso.</p><p>A continuación un resumen de cuándo usar cada método:</p><ul><li>Usa <code>filter</code> si quieres encontrar todos los elementos que cumplan con una condición específica.</li><li>Usa <code>find</code> si quieres saber si al menos uno de los elementos cumple una condición específica.</li><li>Usa <code>includes</code> si quieres saber si tu arreglo contiene un valor específico.</li><li>Usa <code>indexOf</code> si quieres encontrar el índice de un elemento particular dentro del arreglo.</li></ul><p><em>¿Quieres recibir notificaciones cuando publique un artículo? <a href="https://mailchi.mp/69ea601a3f64/join-sarahs-mailing-list">Haz clic aquí</a><em><em><em>.</em></em></em></em></p><p>Traducido del artículo de <a href="https://www.freecodecamp.org/news/author/sarah/"><strong>Sarah Chima Atuonwu</strong></a><strong> - <a href="https://www.freecodecamp.org/news/4-methods-to-search-an-array/">Four Different Ways to Search an Array in JavaScript</a></strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Eventos JavaScript en el DOM: Onclick y Onload ]]>
                </title>
                <description>
                    <![CDATA[ En los orígenes del internet, las páginas web eran realmente estáticas – solo había texto e imágenes. Bueno, algunas veces las imágenes eran gifs animados, pero al fin y al cabo son simplemente imágenes. Con la llegada de JavaScript, se abrió un mundo de posibilidades para crear páginas interactivas que ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/javascript-dom-events-onclick-and-onload/</link>
                <guid isPermaLink="false">5ff9ee0a8c7cd154bb985ed8</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Maryori S. Boneu ]]>
                </dc:creator>
                <pubDate>Sun, 28 Feb 2021 06:22:27 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/02/photo-1513530534585-c7b1394c6d51-1-.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>En los orígenes del internet, las páginas web eran realmente estáticas – solo había texto e imágenes. Bueno, algunas veces las imágenes eran gifs animados, pero al fin y al cabo son simplemente imágenes.</p><p>Con la llegada de JavaScript, se abrió un mundo de posibilidades para crear páginas interactivas que respondiesen a acciones como dar clic en un botón o tener una animación de desplazamiento.</p><p>Existen múltiples eventos del DOM (Document Object Model) que se pueden "escuchar" en JavaScript, pero <code>onclick</code> y <code>onload</code> están dentro de los más populares.</p><h2 id="evento-onclick"><strong><strong>Evento onclick</strong></strong></h2><p>El evento <code>onclick</code> en JavaScript te permite ejecutar una función cuando se hace clic en un elemento.</p><h3 id="ejemplo"><strong><strong><strong><strong>E</strong></strong>jemplo</strong></strong></h3><pre><code class="language-javascript">&lt;button onclick="miFuncion()"&gt;Dame clic&lt;/button&gt;

&lt;script&gt;
  function miFuncion() {
    alert('¡El botón fue presionado!');
  }
&lt;/script&gt;</code></pre><p>En el ejemplo anterior, cuando un usuario da clic en el botón, aparece una alerta en el navegador que muestra <code>¡El botón fue presionado!</code>.</p><h3 id="agregar-onclick-din-micamente"><strong>Agregar <strong><strong><strong><code>onclick</code> d</strong></strong></strong>inámicamente</strong></h3><p>El ejemplo anterior funciona, pero generalmente se considera una mala práctica. En vez de hacer eso, es mejor separar el contenido de la página (HTML) de la lógica (JS).</p><p>Para lograrlo, el evento <code>onclick</code> puede ser agregado programáticamente a cualquier elemento usando el siguiente código:</p><pre><code class="language-javascript">&lt;p id="foo"&gt;Da clic en este elemento&lt;/p&gt;

&lt;script&gt;
  const p = document.getElementById("foo"); // Encuentra el elemento de párrafo en la página a través de su id "foo"
  p.onclick = mostrarAlerta; // Agrega la función onclick al elemento
    
  function mostrarAlerta(evento) {
    alert("¡Evento onclick activado!");
  }
&lt;/script&gt;</code></pre><h3 id="nota"><strong><strong><strong><strong>Not</strong></strong></strong>a</strong></h3><p>Es importante mencionar que al usar <code>onclick</code>, solo podemos agregar una función Listener. Si quieres agregar más, usa <code>addEventListener()</code>. Esta es la manera preferible de agregar eventos.</p><p>En el ejemplo anterior, cuando un usuario da clic en el elemento <code>p</code> en el <code>html</code>, verán una alerta que muestra <code>¡Evento onclick activado!</code>.</p><h3 id="prevenir-acciones-por-defecto"><strong><strong><strong><strong>Preven</strong></strong></strong>ir acciones por defecto</strong></h3><p>Si agregamos <code>onclick</code> a enlaces (Es decir, el tag <code>a</code> en HTML), es posible que queramos prevenir que ocurran acciones por defecto:</p><pre><code class="language-javascript">&lt;a id="bar" href="https://www.freecodecamp.org/espanol/news/"&gt;Guías&lt;/a&gt;

&lt;script&gt;
  const enlace = document.getElementById("bar"); //  Encuentra el elemento de enlace con id "bar"
  enlace.onclick = miAlerta; // Agrega la función onclick al elemento

  function miAlerta(evento) {
    evento.preventDefault();
    alert("Se dio clic al enlace pero no se abrió la página");
  }
&lt;/script&gt;</code></pre><p>En el anterior ejemplo, impedimos el comportamiento por defecto del elemento &nbsp;<code>a</code> (abrir un enlace) al usar <code>evento.preventDefault()</code> dentro de nuestra función Callbak <code>onclick</code>.</p><h2 id="evento-onload"><strong><strong><strong><strong>Event</strong></strong></strong>o onload</strong></h2><p>El evento <code>onload</code> se usa para ejecutar una función de JavaScript tan pronto como una página haya cargado.</p><h3 id="ejemplo-"><strong><strong><strong><strong>E</strong></strong></strong>jemplo<strong><strong><strong>:</strong></strong></strong></strong></h3><pre><code class="language-javascript">const cuerpoDelDocumento = document.body;
cuerpoDelDocumento.onload = miFuncion;

function miFuncion() {
  alert('La página terminó de cargar');
}
</code></pre><p>Que puede ser abreviado a:</p><pre><code class="language-js">document.body.onload = function() {
  alert('La página terminó de cargar');
}</code></pre><p>En el ejemplo anterior, tan pronto como la página es cargada, la función <code>miFuncion</code> será llamada, y mostrará la alerta <code>La página terminó de cargar</code> al usuario.</p><p>El evento <code>onload</code> es usualmente añadido al elemento <code>&lt;body&gt;</code>. Entonces, tan pronto el cuerpo (<code>&lt;body&gt;</code>) del documento haya cargado — incluyendo imágenes, archivos de CSS y JavaScript, tu script se ejecutará.</p><h4 id="m-s-informaci-n-"><strong><strong><strong><strong>M</strong></strong></strong>ás<strong><strong><strong> </strong></strong></strong>i<strong><strong><strong>nforma</strong></strong></strong>c<strong><strong><strong>i</strong></strong></strong>ó<strong><strong><strong>n:</strong></strong></strong></strong></h4><p>Estos son solo dos de los muchos eventos del DOM que puedes manipular con JavaScript, aunque son de los más usados.</p><p>Sin embargo, algunas veces no necesitarás "escuchar" eventos del DOM y querrás usar un evento de tiempo como lo es un conteo regresivo. Si te interesa un tutorial rápido sobre este tema, visita este <a href="https://www.freecodecamp.org/espanol/news/eventos-de-tiempo-en-javascript-settimeout-y-setinterval/">artículo</a>.</p><p>Traducido del artículo <strong><a href="https://www.freecodecamp.org/news/javascript-dom-events-onclick-and-onload/">JavaScript DOM Events: Onclick and Onload</a></strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Explicación de booleanos en JavaScript - Cómo usarlos ]]>
                </title>
                <description>
                    <![CDATA[  Booleanos Los booleanos son un tipo de dato primitivo comúnmente usado en lenguajes de programación. Por definición, un booleano tiene 2 posibles valores: true  (verdadero) o false (falso). En JavaScript, frecuentemente se genera de manera implícita la coerción de tipos a booleano. Si, por ejemplo, tienes una sentencia ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/booleanos-en-javascript-como-usarlos/</link>
                <guid isPermaLink="false">5ff2a0458c7cd154bb983f49</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Maryori S. Boneu ]]>
                </dc:creator>
                <pubDate>Fri, 19 Feb 2021 06:26:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/04/photo-1515524738708-327f6b0037a7.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p></p><h2 id="booleanos"><strong><strong><strong><strong>Boolean</strong></strong>os</strong></strong></h2><p>Los booleanos son un tipo de dato primitivo comúnmente usado en lenguajes de programación. Por definición, un booleano tiene 2 posibles valores: <code>true</code> (verdadero) o <code>false</code> (falso).</p><p>En JavaScript, frecuentemente se genera de manera implícita la coerción de tipos a booleano. Si, por ejemplo, tienes una sentencia <em>if</em> que evalúa cierta expresión, esa expresión genera coerción a booleano:</p><pre><code class="language-javascript">const a = 'una cadena';
if (a) {
  console.log(a); // arroja 'una cadena'
}</code></pre><p>En el ejemplo anterior, la sentencia <em>if</em> evalúa a la constante <code>a</code>. Dado que el valor de <code>a</code> no es de tipo booleano, JavaScript genera coerción de tipo para poder evaluar la sentencia y concluir si se trata de un valor <em>Truthy</em> (verdadero) o <em>Falsy</em> (falso). Obtenemos como resultado 'una cadena' debido a que las cadenas de texto en JavaScript son un valor verdadero<em>.</em></p><p>Solo hay unos cuantos valores que generan coerción a falso:</p><ul><li>false (en realidad no genera coerción porque ya es falso)</li><li>null</li><li>undefined</li><li>NaN</li><li>0</li><li>-0</li><li>0n, -0n (BigInt)</li><li>" ", ' ', ` ` (cadena de texto vacía)</li><li>document.all</li></ul><p>Cualquier otro valor diferente de los anteriores generan coerción a verdadero.</p><p>Una manera en que se usa la coerción de tipos es con el uso del operador <strong><em>o</em></strong> (<code>||</code>) y del operador <em><strong>y</strong></em> (<code>&amp;&amp;</code>):</p><pre><code class="language-javascript">const a = 'palabra';
const b = false;
const c = true;
const d = 0
const e = 1
const f = 2
const g = null

console.log(a || b); // 'palabra'
console.log(c || a); // true
console.log(b || a); // 'palabra'
console.log(e || f); // 1
console.log(f || e); // 2
console.log(d || g); // null
console.log(g || d); // 0
console.log(a &amp;&amp; c); // true
console.log(c &amp;&amp; a); // 'palabra'</code></pre><p>En el ejemplo anterior, el operador <em><strong>o </strong></em>(<code>||</code>) verifica el primer operando. Si dicho operando es el valor booleano verdadero (<code>true</code>) o pertenece a lista de los evaluados como verdaderos, JavaScript arroja el resultado inmediatamente sin necesidad de verificar el segundo operando. A esto se le llama una <strong>evaluación cortocircuito</strong>. Por tal razón, obtenemos 'palabra' en el primer caso y <code>true</code> en el segundo caso. Sin embargo, cuando el primer operando <strong>no es</strong> verdadero, devuelve el segundo operando. Entonces obtenemos 'palabra' en el tercer caso. </p><p>El operador &nbsp;<em><strong>y</strong></em> (<code>&amp;&amp;</code>) funciona de manera similar. Sin embargo, para que la operación sea verdadera, ambos operandos deben ser verdaderos. Devolverá siempre el segundo operando si ambos son verdaderos. De lo contrario, devolverá falso. Por tal razón, obtenemos <code>true</code> en el penúltimo caso y 'palabra' en el último caso.</p><h2 id="el-objeto-boolean"><strong>El objeto Boolean</strong></h2><p>También existe un objeto nativo de JavaScript. El valor pasado como primer parámetro es convertido a un valor booleano si es necesario. Si el valor es omitido, 0, -0, <strong>0n, -0n (BigInt)</strong>, null, false, NaN, undefined, document.all, o una cadena vacía (" ", ' '. ` `), el objeto tiene valor inicial de falso. Cualquier otro valor, incluidos cualquier objeto o la cadena de texto "false", crean un objeto de valor inicial verdadero.</p><p>No confundas los valores booleanos primitivos verdadero y falso con los valores verdaderos y falsos del objeto Boolean.</p><h2 id="m-s-detalles"><strong>Más detalles</strong></h2><p>Cualquier objeto que no tenga como valor <code>undefined</code> o <code>null</code>, incluyendo cualquier objeto Boolean que tenga como valor falso, será evaluado como verdadero cuando se pase por una sentencia condicional. Al ser verdadero, ejecutará la función. Por ejemplo, la condición en la siguiente sentencia <em>if</em> es evaluada como verdadera:</p><pre><code class="language-javascript">const x = new Boolean(false);
if (x) {
  // este código se ejecuta
}</code></pre><p>Este comportamiento no aplica a los valores booleanos primitivos. Por ejemplo, la condición en la siguiente sentencia <em>if</em> es evaluada como falsa:</p><pre><code class="language-javascript">const x = false;
if (x) {
  // este código no se ejecuta
}</code></pre><p>No uses un objeto Boolean para convertir un valor no booleano a uno booleano. En cambio, usa Boolean como función para realizar esta tarea:</p><pre><code class="language-javascript">const x = Boolean(expresión);     // preferido
const x = new Boolean(expresión); // no lo uses</code></pre><p>Si especificas un objeto (incluyendo un objeto Boolean que tenga valor falso) como valor inicial de un objeto Boolean, este nuevo objeto tendrá valor verdadero. </p><pre><code class="language-javascript">const myFalse = new Boolean(false);   // valor inicial falso
const g = new Boolean(myFalse);       // valor inicial verdadero
const myString = new String('Hello'); // objeto de cadena
const s = new Boolean(myString);      // valor inicial verdadero</code></pre><p>No uses un objeto Boolean como si fuesen los valores booleanos primitivos. Estos no son lo mismo y, por lo tanto, no son intercambiables.</p><p>Traducido del artículo - <strong><a href="https://www.freecodecamp.org/news/booleans-in-javascript-explained-how-to-use-booleans-in-javascript/">JavaScript Booleans Explained – How to use Booleans in JavaScript</a></strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Triple igual VS Doble igual en JavaScript – Operadores de comparación explicados con ejemplos ]]>
                </title>
                <description>
                    <![CDATA[ Puede que hayas visto doble y triple signo igual en JavaScript. Pero, ¿qué significan? Bien, en resumen: == convierte el tipo inherentemente y === no convierte tipo. Doble igual (==) solo verifica igualdad de valores. Hace coerción de tipos inherentemente. Esto significa que antes de verificar los valores, convierte los ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/triple-igual-vs-doble-igual-en-javascript-comparison-operators-explained-with-examples/</link>
                <guid isPermaLink="false">5ff28d798c7cd154bb983e4e</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Maryori S. Boneu ]]>
                </dc:creator>
                <pubDate>Wed, 17 Feb 2021 06:50:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/02/photo-1551814360-3c38192c5688-1-.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Puede que hayas visto doble y triple signo igual en JavaScript. Pero, ¿qué significan?</p><p>Bien, en resumen: == convierte el tipo inherentemente y === no convierte tipo.</p><p>Doble igual (<code>==</code>) solo verifica igualdad de valores. Hace coerción de tipos inherentemente. Esto significa que antes de verificar los valores, convierte los tipos de las variables para que coincidan.</p><p>Por el otro lado, Triple igual (<code>===</code>) no hace coerción de tipos. Este verificará que las variables que estén siendo comparadas tengan el mismo valor <strong>Y</strong> el mismo tipo de variable.</p><p>Bien - te ayudaré a que entiendas mejor la diferencia a través de algunos ejemplos. Para cada uno, considera qué arrojaría cada sentencia.</p><h3 id="ejemplo-1-"><strong>Ejemplo <strong>1:</strong></strong></h3><pre><code class="language-js">const foo = "prueba" 
const bar = "prueba"  

console.log(foo == bar) //true
console.log(foo === bar) //true</code></pre><p>El valor y el tipo de <code>foo</code> y <code>bar</code> son los mismos. Por lo tanto, el resultado es <code>true</code> (verdadero) en ambos.</p><h3 id="ejemplo-2-"><strong>Ejemplo <strong>2:‌</strong></strong></h3><pre><code class="language-js">const numero = 1234 
const numeroComoCadenaDeTexto = '1234'  

console.log(numero == numeroComoCadenaDeTexto) //true
console.log(numero === numeroComoCadenaDeTexto)  //false</code></pre><p>El valor de <code>numero</code> y <code>numeroComoCadenaDeTexto</code> se ven similares aquí. Sin embargo, el tipo de <code>numero</code> es <code>Numero</code> y el tipo de <code>numeroComoCadenaDeTexto</code> es <code>Cadena</code>. Incluso si los valores son el mismo, el tipo no es el mismo. De ahí que una verificación con <code>==</code> devuelva <code>true</code>, pero cuando se comprueba tanto el valor <strong>y</strong> el tipo, arroja <code>false</code> (falso).</p><h3 id="ejemplo-3-"><strong>Ejemplo <strong>3:</strong></strong></h3><pre><code class="language-js">console.log(0 == false) //true
console.log(0 === false) //false                  </code></pre><p>Razón: mismo valor, diferente tipo. Coerción de tipos.</p><p>Este es un caso interesante. El valor de <code>0</code> cuando se verifica con <code>false</code> es el mismo. Lo es porque <code>0</code> y <code>false</code> tienen el mismo valor para JavaScript, pero cuando se verifica el tipo <strong>y</strong> el valor, arroja falso porque <code>0</code> es un <code>numero</code> y <code>false</code> es de tipo <code>Booleano</code>.</p><h3 id="ejemplo-4-"><strong>Ejemplo <strong>4:</strong></strong></h3><pre><code>const str = ""

console.log(str == false) //true
console.log(str === false) //false</code></pre><p>El valor de la cadena de texto vacía y <code>false</code> es el mismo en JavaScript. De ahí que <code>==</code> devuelva verdadero. Sin embargo, el tipo es diferente, por lo que <code>===</code> devuelve falso.</p><h2 id="-cu-ndo-debes-usar-y-cuando-"><strong>¿Cuándo debes usar <strong><code>==</code> </strong>y cuando<strong> <code>===</code>?</strong></strong></h2><p>Si tienes dudas, usa <code>===</code>. Esto te salvará de muchos errores potenciales.</p><p>Si estás trabajando en un caso de uso donde puedes ser un poco permisivo respecto al tipo de datos entrantes, entonces usa <code>==</code>. Por ejemplo, si una API le acepta ambos <code>"true"</code> y <code>true</code> al cliente, usa <code>==</code>. En resumen, no uses <code>==</code> a no ser que tengas un caso de uso bastante sólido.</p><p>Aquí te presento una útil tabla de verdad de JavaScript para tu referencia y también quiero mostrarte lo complicado que es la igualdad en JavaScript:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/01/image.png" class="kg-image" alt="image" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/01/image.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/01/image.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2021/01/image.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/2021/01/image.png 1620w" sizes="(min-width: 720px) 720px" width="1620" height="1546" loading="lazy"><figcaption>Fuente: https://dorey.github.io/JavaScript-Equality-Table/</figcaption></figure><p>Si disfrutaste este artículo, asegúrate de seguirme en mi Twitter.</p><figure class="kg-card kg-embed-card"><iframe id="twitter-widget-0" scrolling="no" frameborder="0" allowtransparency="true" allowfullscreen="true" class="" title="Twitter Tweet" src="https://platform.twitter.com/embed/Tweet.html?creatorScreenName=shrutikapoor08&amp;dnt=false&amp;embedId=twitter-widget-0&amp;frame=false&amp;hideCard=false&amp;hideThread=false&amp;id=1180173695643348992&amp;lang=en&amp;origin=https%3A%2F%2Fwww.freecodecamp.org%2Fnews%2Fjavascript-triple-equals-sign-vs-double-equals-sign-comparison-operators-explained-with-examples%2F&amp;siteScreenName=freecodecamp&amp;theme=light&amp;widgetsVersion=889aa01%3A1612811843556&amp;width=550px" data-tweet-id="1180173695643348992" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-weight: 400; font-stretch: inherit; line-height: inherit; font-family: Lato, sans-serif; font-size: 22px; vertical-align: middle; color: rgb(10, 10, 35); letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; position: static; visibility: visible; width: 550px; height: 362px; display: block; flex-grow: 1;" loading="lazy"></iframe></figure><p>Traducido del artículo - <strong><a href="https://www.freecodecamp.org/news/javascript-triple-equals-sign-vs-double-equals-sign-comparison-operators-explained-with-examples/">JavaScript Triple Equals Sign VS Double Equals Sign – Comparison Operators Explained with Examples</a> de </strong><a href="https://www.freecodecamp.org/news/author/shrutikapoor08/"><strong>Shruti Kapoor</strong></a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ ¿Qué significa JavaScript:Void(0)? ]]>
                </title>
                <description>
                    <![CDATA[ El operador void de JavaScript evalúa una expresión y devuelve undefined. Puedes usar la consola para verificar esto: Nota: void, independientemente del valor que se le pase, *siempre devuelve  undefined como se muestra arriba*. Pero, es preferible usar void con el operando 0. Hay dos maneras de usar el ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/que-significa-javascript-void-0/</link>
                <guid isPermaLink="false">5fe904d58c7cd154bb98052a</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Maryori S. Boneu ]]>
                </dc:creator>
                <pubDate>Thu, 21 Jan 2021 14:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/01/jeremy-thomas-rMmibFe4czY-unsplash-1-.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>El operador void de JavaScript evalúa una expresión y devuelve <code>undefined</code>.</p><p>Puedes usar la consola para verificar esto:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2020/12/Ejemplo-1-1.png" class="kg-image" alt="Ejemplo-1-1" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2020/12/Ejemplo-1-1.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2020/12/Ejemplo-1-1.png 735w" sizes="(min-width: 720px) 720px" width="735" height="124" loading="lazy"></figure><p><strong>Nota</strong>: <strong><strong><strong><strong>void</strong></strong>,</strong></strong> independientemente del valor que se le pase, *siempre devuelve <strong><strong><strong><strong>undefined</strong></strong></strong></strong> como se muestra arriba*. Pero, <strong>es preferible usar void con el operando 0</strong>.</p><p>Hay dos maneras de usar el operando 0: void(0) ó void 0. Cualquiera de las dos está bien.</p><h2 id="cuando-usar-javascript-void-0-"><strong>Cuando usar<strong> Java</strong>S<strong>cript</strong> <strong>void(0)</strong></strong></h2><p>Usa javaScript:void(0) si, al hacer clic en un enlace, no quieres que el navegador abra una nueva página o refresque la página actual (dependiendo de la URL especificada).</p><p>En cambio, solo ejecutará el JavaScript que esté adjunto a ese enlace.</p><h3 id="ejemplo-1-con-javascript-void-0-"><strong>Ejemplo <strong>1 </strong>con<strong> Java</strong>S<strong>cript void(0):</strong></strong></h3><pre><code class="language-html">&lt;html&gt;
&lt;body&gt;
&lt;a href="javascript:void(0);alert('¡Hola! Estoy aquí')"&gt;Aceptar&lt;/a&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><h4 id="resultado-"><strong>Resultado<strong><strong><strong>:</strong></strong></strong></strong></h4><p>Cuando alguien da clic en el enlace Dame clic, aparecerá una alerta como se muestra a continuación:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2020/12/Ejemplo-2.png" class="kg-image" alt="Ejemplo-2" width="451" height="134" loading="lazy"></figure><h3 id="ejemplo-2-con-javascript-void-0-"><strong><strong>E</strong>jemplo<strong> 2 </strong>con<strong> Java</strong>S<strong>cript void(0):</strong></strong></h3><pre><code class="language-html">&lt;html&gt;
&lt;body&gt;
    &lt;a href="javascript:void(0)" ondblclick="alert('Hola, no refresqué la página')" )&gt;Aceptar&lt;/a&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><h4 id="resultado--1"><strong>Resultado<strong><strong><strong>:</strong></strong></strong></strong></h4><p>Cuando le das doble clic al enlace, aparecerá una alerta sin actualizar la página.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2020/12/Ejemplo-3.png" class="kg-image" alt="Ejemplo-3" width="453" height="134" loading="lazy"></figure><h3 id="ejemplo-3-con-javascript-void-0-"><strong><strong>E</strong>jemplo<strong> 3 </strong>con<strong> Java</strong>S<strong>cript void(0):</strong></strong></h3><pre><code class="language-html">&lt;html&gt;
&lt;body&gt;
    &lt;a href="javascript:void(0);https://www.google.com/" 
    ondblclick="alert('¡Hola! Me verás y no te redirigiré a google.com')"&gt;Aceptar&lt;/a&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><h4 id="resultado--2"><strong>Resultado<strong><strong><strong>:</strong></strong></strong></strong></h4><p>Cuando le das doble clic al enlace, aparecerá una alerta. Cerrándola tampoco te redirigirá a google.com.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2020/12/Ejemplo-4.png" class="kg-image" alt="Ejemplo-4" width="453" height="135" loading="lazy"></figure><h3 id="ejemplo-4-sin-javascript-void-0-"><strong>Ejemplo 4 sin <strong>Java</strong>S<strong>cript void(0):</strong></strong></h3><pre><code class="language-html">&lt;html&gt;
&lt;body&gt;
    &lt;a href="https://www.google.com/" ondblclick="alert('¡Hola! Me verás y te redirigiré a google.com incluso si no lo necesitas')"&gt;Aceptar&lt;/a&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><h4 id="resultado--3"><strong>Resultado<strong><strong><strong>:</strong></strong></strong></strong></h4><p>Cuando le das doble clic al enlace, aparecerá una alerta, pero al cerrarla te redirigirá a google.com.</p><h2 id="conclusi-n">Conclusión</h2><p>El operador<strong><strong> <strong><strong>void</strong></strong></strong></strong> es útil cuando quieres evitar cualquier actualización o redirecciones de página no deseadas. En vez de eso, ejecuta alguna operación de JavaScript.</p><h4 id="m-s-informaci-n-"><strong><strong><strong><strong>M</strong></strong></strong>ás información<strong><strong><strong>:</strong></strong></strong></strong></h4><ol><li><a href="https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Operadores/void">Documento de Mozilla</a></li></ol><p>Traducido del artículo - <strong><a href="https://www.freecodecamp.org/news/what-does-javascript-void-operator-do/">What Does JavaScript:Void(0) Mean?</a></strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo construir un teclado de piano usando Vanilla JavaScript ]]>
                </title>
                <description>
                    <![CDATA[ Hacer un teclado de piano que se pueda tocar puede ser una gran manera de aprender un lenguaje de programación (además de bastante divertido). Este tutorial te muestra como programar uno usando Vanilla JavaScript sin la necesidad de librerías o frameworks externos. Aquí está el teclado de piano en JavaScript ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-construir-un-teclado-how-to-build-a-piano-keyboard-using-vanilla-javascript/</link>
                <guid isPermaLink="false">5fe786738c7cd154bb97ebce</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Maryori S. Boneu ]]>
                </dc:creator>
                <pubDate>Wed, 20 Jan 2021 14:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/01/twitterCard-piano-1-.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Hacer un teclado de piano que se pueda tocar puede ser una gran manera de aprender un lenguaje de programación (además de bastante divertido). Este tutorial te muestra como programar uno usando Vanilla JavaScript sin la necesidad de librerías o frameworks externos.</p><p>Aquí está el <a href="http://1000mileworld.com/Portfolio/Piano/keyboard.html">teclado de piano en JavaScript</a> que hice si quieres ver el producto terminado primero.</p><p>Este tutorial asume que tienes un entendimiento básico de JavaScript como lo son las funciones y manejadores de eventos, así como también familiaridad con HTML y CSS. De lo contrario, es totalmente amigable con principiantes y está dirigido a aquellos que quieren mejorar sus habilidades de JavaScript a través del aprendizaje basado en proyectos (¡o si quieres hacer un proyecto genial!).</p><p>El teclado de piano que haremos para este proyecto está basado en el <a href="https://keithwhor.com/music/">teclado sintético dinámicamente generado</a> hecho por Keith William Horwood. Extenderemos el número de teclas disponibles a 4 octavas y asignaremos nuevos atajos de teclado.</p><p>Si bien su teclado puede reproducir sonidos de otros instrumentos, nosotros mantendremos las cosas simples y usaremos solo sonidos de piano.</p><p>A continuación los pasos a seguir para abordar este proyecto:</p><p>1. &nbsp; &nbsp; &nbsp;<a href="https://www.freecodecamp.org/news/javascript-piano-keyboard/#step1">Obtén los archivos de trabajo</a></p><p>2. &nbsp; &nbsp; &nbsp;<a href="https://www.freecodecamp.org/news/javascript-piano-keyboard/#step2">Asigna atajos de teclado</a></p><p>3. &nbsp; &nbsp; &nbsp;<a href="https://www.freecodecamp.org/news/javascript-piano-keyboard/#step3">Genera el teclado</a></p><p>4. &nbsp; &nbsp; &nbsp;<a href="https://www.freecodecamp.org/news/javascript-piano-keyboard/#step4">Maneja presiones de teclas</a></p><p>¡Empecemos!</p><h2 id="1-obt-n-los-archivos-de-trabajo"><strong><strong>1. </strong>Obtén los archivos de trabajo</strong></h2><p>Este tutorial usará los siguientes archivos:</p><p>· &nbsp; &nbsp; &nbsp; &nbsp;<a href="https://keithwhor.github.io/audiosynth/">audiosynth.js</a></p><p>· &nbsp; &nbsp; &nbsp; &nbsp;<a href="https://github.com/1000mileworld/Piano-Keyboard/blob/master/playKeyboard.js">playKeyboard.js</a></p><p>Como mencioné, basaremos nuestro teclado de piano en el que fue hecho por Keith. Naturalmente, también usaremos parte de su código, que amablemente ha permitido usar con audiosynth.js.</p><p>Incorporamos audiosynth.js en playKeyboard.js (mi versión modificada del código de Keith), el cual maneja todo nuestro JavaScript. Este tutorial da una explicación detallada en las siguientes secciones sobre los puntos clave acerca de cómo el código en este archivo crea un teclado de piano que funcione completamente.</p><p>Dejamos el archivo audiosynth.js intacto debido a que es solamente responsable de la generación de sonido.</p><p>El código en este archivo distingue este teclado de piano de otros encontrados en línea porque usa JavaScript para generar el sonido apropiado dinámicamente cuando el usuario presiona una tecla. Por lo tanto, el código no tiene que cargar archivos externos de audio.</p><p>Keith ya nos proporciona una explicación de cómo funciona la generación de sonido en su sitio web, así que no entraremos en detalle aquí.</p><p>En pocas palabras, implica usar la función <code>Math.sin()</code> en JS para crear formas de onda sinusoidal y transformarlas para que suenen más como instrumentos reales a través de matemáticas elegantes.</p><p>Crea un archivo HTML index y enlaza los archivos JS en la cabecera:</p><pre><code class="language-html">&lt;script src="audiosynth.js"&gt;&lt;/script&gt;
&lt;script src="playKeyboard.js"&gt;&lt;/script&gt;
</code></pre><p>En el cuerpo, podemos crear un elemento <code>&lt;div&gt;</code> vacío para que sirva como "contenedor" del teclado:</p><pre><code class="language-html">&lt;div id="keyboard"&gt;&lt;/div&gt;</code></pre><p>Le damos un nombre de id para poder referenciarlo más adelante cuando creemos el teclado usando JS. Podemos ejecutar nuestro código JS llamándolo en el cuerpo del documento también:</p><pre><code class="language-html">&lt;script type="text/javascript"&gt;playKeyboard()&lt;/script&gt;</code></pre><p>Usamos playKeyboard.js como una función grande. Se ejecutará tan pronto como el navegador llegue a esa linea de código y genere un teclado que funcione completamente en el elemento <code>&lt;div&gt;</code> con <code>id = “keyboard”</code>.</p><p>Las primeras líneas de playKeyboard.js configuran la funcionalidad para dispositivos móviles (opcional) y crea un nuevo objeto <code>AudioSynth()</code>. Usamos este objeto para llamar los métodos de audiosynth.js que enlazamos anteriormente. Usamos uno de estos métodos en el inicio para ajustar el volumen del sonido.</p><p>En la línea 11, establecemos la posición de C central a la 4ta octava.</p><h2 id="2-asigna-atajos-de-teclado"><strong><strong>2. </strong>Asigna atajos de teclado</strong></h2><p>Antes que generemos el teclado, debemos asignar los atajos de teclado dado que estos determinan cuantas teclas deberán ser generadas.</p><p>Originalmente quería tocar las notas de apertura de ‘Für Elise’ así que escogí un rango de 4 octavas para un total de 48 teclas negras y blancas. Esto requirió casi que todas las teclas en mi teclado (de PC) y tú eres libre de incluir menos.</p><p>Nota de precaución: No tengo los mejores atajos de teclado así que podría sentirse poco intuitivo cuando realmente intentes tocar. Tal vez este sea el precio de intentar crear un teclado de 4 octavas.</p><p>Para asignar los atajos de teclado, primero crea un objeto que use los códigos de tecla como su clave y la nota a tocar como el valor de dicha clave (empezando en la línea 15):</p><pre><code class="language-js">var keyboard = {
	/* ~ */
	192: 'C,-2',
	/* 1 */
	49: 'C#,-2',
	/* 2 */
	50: 'D,-2',
	/* 3 */
	51: 'D#,-2',
    //...y el resto de las teclas
}
</code></pre><p>Los comentarios denotan las teclas que el usuario podría presionar en el teclado del computador. Si un usuario presiona la tecla virgulilla, el código de teclado correspondiente es 192. Puedes obtener los códigos de tecla usando herramientas como keycode.info.</p><p>El valor de la clave es la nota a tocar que está escrita en el formato 'nota, modificador de octava' donde el modificador de octava representa la posición de octava relativa en relación con la octava que contiene a C central. Por ejemplo, 'C, -2' es la nota C 2 octavas más abajo del C central.</p><p>Ten en cuenta que no hay teclas 'bemol'. Cada nota es representada por un 'sostenido'.</p><p>Para hacer nuestro teclado de piano funcional, tenemos que preparar una tabla de búsqueda en reversa donde cambiamos los pares <code>clave: valor</code> de tal manera que la nota a tocar se convierta la clave y el código de tecla se convierta en el valor.</p><p>Necesitamos dicha tabla porque queremos que itere sobre las notas musicales para generar el teclado fácilmente.</p><p>Aquí es donde las cosas podrían volverse complicadas: en realidad necesitamos 2 tablas de búsqueda en reversa.</p><p>Usamos una para buscar la etiqueta que queremos mostrar para la tecla del computador que presionamos al tocar una nota (declarada como <code>reverseLookupText</code> en la línea 164) y la segunda para buscar la tecla que fue presionada (declarada como <code>reverseLookup</code> en la línea 165).</p><p>Los astutos se darán cuenta de que ambas tablas de búsqueda tienen códigos de tecla como valores, entonces ¿cuál es la diferencia entre estas?</p><p>Resulta que (por razones que desconozco) cuando obtienes un código de tecla que corresponde a una tecla y tratas de usar el método <code>String.fromCharCode()</code> en ese código de tecla, no siempre te devuelve la misma cadena de texto que representa la tecla presionada.</p><p>Por ejemplo, presionar el corchete izquierdo abierto resulta en el código de tecla 219, pero cuando tratas de convertir el código a una cadena de texto usando <code>String.fromCharCode(219)</code> te devuelve "Û". Para obtener "[", debes usar el código de tecla 91. Reemplazamos los códigos incorrectos empezando desde la línea 168.</p><p>Inicialmente, obtener el código de tecla correcto implicó un poco de ensayo y error, pero luego me di cuenta de que simplemente se puede usar otra función (<code>getDispStr()</code> en la línea 318) para forzar que se muestre la cadena de texto correcta.</p><p>La mayoría de las teclas se comportan correctamente, pero puedes escoger empezar con un teclado más pequeño para que no tengas que lidiar con códigos de tecla incorrectos. </p><h2 id="3-genera-el-teclado"><strong><strong>3. </strong>Genera el teclado</strong></h2><p>Comenzamos el proceso de generación del teclado seleccionando nuestro elemento <code>&lt;div&gt;</code> contenedor del teclado con <code>document.getElementById('keyboard')</code> en la línea 209.</p><p>En la siguiente linea, declaramos el objeto <code>selectSound</code> y ponemos la propiedad <code>value</code> en cero para que audioSynth.js cargue el perfil de sonido para piano. Tu podrías querer ingresar un valor diferente (puede ser 0-3) si quieres probar otros instrumentos. Observa la línea 233 de audioSynth.js con <code>Synth.loadSoundProfile</code> para más detalles.</p><p>En la línea 216 con <code>var notes</code>, nos traemos las notas disponibles de una octava (C, C#, D...B) desde audioSynth.js.</p><p>Generamos nuestro teclado con el bucle que pasa por cada octava y luego por cada nota en dicha octava. Para cada nota, creamos un elemento <code>&lt;div&gt;</code> que represente la tecla adecuada usando <code>document.createElement('div')</code>.</p><p>Para distinguir si necesitamos crear una tecla negra o blanca, echamos un vistazo al largo del nombre de la nota. Agregar un signo de sostenido hace que el largo del nombre de la nota sea mayor que uno (ex. ‘C#’) lo que indica una tecla negra y viceversa para teclas blancas.</p><p>Para cada tecla podemos establecer un ancho, alto y un offset desde la izquierda basada en la posición de la tecla. También podemos crear clases apropiadas para usar con CSS más adelante.</p><p>Siguiente, usamos label para etiquetar la tecla con la tecla del computador que necesitamos presionar para tocar la nota y la guardamos en otro elemento <code>&lt;div&gt;</code>. Aquí es donde <code>reverseLookupText</code> es de ayuda. Dentro del mismo <code>&lt;div&gt;</code>, también mostramos el nombre de la nota. Logramos todo esto al colocar la propiedad de label, innerHTML y añadiendo el label a la tecla (líneas 240-242).</p><pre><code class="language-js">label.innerHTML = '&lt;b class="keyLabel"&gt;' + s + '&lt;/b&gt;' + '&lt;br /&gt;&lt;br /&gt;' + n.substr(0,1) + 
'&lt;span name="OCTAVE_LABEL" value="' + i + '"&gt;' + (__octave + parseInt(i)) + '&lt;/span&gt;' + 
(n.substr(1,1)?n.substr(1,1):'');
</code></pre><p>Similarmente, agregamos un listener de evento a la tecla para manejar los clicks del ratón (line 244):</p><pre><code class="language-js">thisKey.addEventListener(evtListener[0], (function(_temp) { return function() { fnPlayKeyboard({keyCode:_temp}); } })(reverseLookup[n + ',' + i]));</code></pre><p>El primer parámetro <code>evtListener[0]</code> es un evento <code>mousedown</code> declarado mucho más atrás en la línea 7. El segundo parámetro es una función que devuelve una función. Necesitamos <code>reverseLookup</code> para obtener el código de tecla correcto y pasar ese valor como parámetro <code>_temp</code> a la función de adentro. No necesitaremos <code>reverseLookup</code> para manejar los eventos <code>keydown</code>.</p><p>Este código es pre-ES2015 (o ES6) y el actualizado, que espero sea el equivalente más claro, es el siguiente:</p><pre><code class="language-js">const keyCode = reverseLookup[n + ',' + i];
thisKey.addEventListener('mousedown', () =&gt; {
  fnPlayKeyboard({ keyCode });
});
</code></pre><p>Después de crear y añadir todas las teclas necesarias a nuestro teclado, necesitaremos manejar el hecho de tocar una nota.</p><h2 id="4-maneja-presiones-de-teclas"><strong><strong>4. </strong>Maneja presiones de teclas</strong></h2><p>Manejamos el presionar de las teclas en la misma manera en que el usuario da click en la tecla o presiona la tecla correspondiente del computador a través de la función <code>fnPlayKeyboard</code> en la línea 260. La única diferencia es el tipo de evento que usamos en <code>addEventListener</code> para detectar el presionado de la tecla.</p><p>Creamos un arreglo llamado <code>keysPressed</code> en la línea 206 para detectar qué teclas se están presionando o se les está haciendo click. Para simplificar, asumiremos que el presionar de una tecla incluye también que a esta se le haga click.</p><p>Podemos dividir el proceso de manejar el presionado de las teclas en 3 pasos: agregar el código de tecla de la tecla presionada en <code>keysPressed</code>, tocar la nota apropiada y quitar el código de tecla de <code>keysPressed</code>.</p><p>El primer paso de agregar un código de tecla es fácil:</p><pre><code class="language-js">keysPressed.push(e.keyCode);</code></pre><p>donde <code>e</code> es el evento detectado por <code>addEventListener</code>.</p><p>Si el código de tecla agregado es uno de los atajos de teclado que asignamos, entonces llamamos a <code>fnPlayNote()</code> en la línea 304 para tocar la nota asociada con esa clave.</p><p>En <code>fnPlayNote()</code>, primero creamos un nuevo elemento <code>container</code> de <code>Audio()</code> para nuestra nota usando el método <code>generate()</code> de audiosynth.js. Cuando el audio carga, entonces podremos tocar la nota.</p><p>Las líneas 308-313 son código heredado y al parecer pueden simplemente ser reemplazadas por <code>container.play()</code>, sin embargo no he hecho pruebas exhaustivas para ver cuál es la diferencia.</p><p>Quitar el presionado de una tecla también es simple, dado que puedes quitar la tecla del arreglo <code>keysPressed</code> con el método <code>splice</code> en la línea 298. Para más detalle, observa la función llamada <code>fnRemoveKeyBinding()</code>.</p><p>Lo único a lo que tenemos que estar atentos es cuando el usuario mantiene presionada la tecla o presiona varias. Tenemos que asegurarnos que la nota solo se toque una sola vez mientras se mantiene presionada (líneas 262-267):</p><pre><code class="language-js">var i = keysPressed.length;
while(i--) {
	if(keysPressed[i]==e.keyCode) {
		return false;	
    }
}
</code></pre><p>Devolver <code>false</code> evita que el resto de <code>fnPlayKeyboard()</code> se ejecute.</p><h2 id="resumen"><strong>Resumen</strong></h2><p>¡Hemos creado un teclado de piano completamente funcional usando Vanilla JavaScript!</p><p>Para recapitular, aquí están los pasos que tomamos:</p><ol><li>Configuramos nuestro archivo HTML para que cargue los archivos apropiados de JS y ejecute <code>playKeyboard()</code> en <code>&lt;body&gt;</code> para generar y hacer que el teclado sea funcional. Tenemos un elemento <code>&lt;div&gt;</code> con <code>id= "keyboard"</code> donde se mostrará el teclado en la página.</li><li>En nuestro archivo de JavaScript playKeyboard.js, asignamos nuestros atajos de teclado con códigos de tecla como clave y las notas musicales como valor. También creamos dos tablas de búsqueda en reversa en donde una es responsable de buscar el label de tecla apropiado basado en la nota y el otro de buscar el código de tecla correcto.</li><li>Generamos el teclado dinámicamente con un bucle que pasa por cada nota en el rango de cada octava. Cada tecla es creada como un propio elemento <code>&lt;div&gt;</code>. Usamos las tablas de búsqueda en reversa para generar el label y el código de tecla correcto de cada tecla. Luego un eventListener de <code>mousedown</code> lo usa para llamar a <code>fnPlayKeyboard()</code> para que toque la nota. El evento <code>keydown</code> llama a la misma función, pero no necesita una tabla de búsqueda en reversa para obtener el código de tecla.</li><li>Manejamos el presionado de las teclas resultantes de clics del ratón o presionando el teclado del computador en 3 pasos: agregamos el código de tecla a un arreglo, tocamos la nota apropiada y quitamos el código de tecla de dicho arreglo. Debemos tener cuidado de no tocar una nota repetidamente (desde el inicio) mientras el usuario mantiene alguna tecla presionada continuamente.</li></ol><p>El teclado ahora es completamente funcional, pero puede que se vea un poco aburrido. ¿Te dejo la parte de CSS a tí?</p><p>De nuevo, aquí está el <a href="http://1000mileworld.com/Portfolio/Piano/keyboard.html">teclado de piano de JavaScript</a> que hice para tu referencia.</p><p>Si quieres aprender más sobre Desarrollo Web y ver otros proyectos prolijos, visita mi blog en <a href="https://www.1000mileworld.com/">1000 Mile World</a>.</p><p>¡Gracias por leer y feliz programación!</p><p>Traducido del artículo <strong><strong><a href="https://www.freecodecamp.org/news/javascript-piano-keyboard/">How to Build a Piano Keyboard Using Vanilla JavaScript</a></strong></strong> de <a href="https://www.freecodecamp.org/news/author/joeliang/"><strong>Joe Liang</strong></a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Funciones Math en JavaScript explicadas ]]>
                </title>
                <description>
                    <![CDATA[ Math Math es uno de los objetos globales u objeto incorporado estándar de JavaScript y puede ser utilizado en cualquier lugar donde puedas usar JavaScript. Contiene constantes útiles como π y el número de Euler, además de funciones como floor(),  round() y ceil(). En este artículo, veremos ejemplos de ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/funciones-math-en-javascript-explicadas/</link>
                <guid isPermaLink="false">5fdbbf708c7cd154bb979335</guid>
                
                    <category>
                        <![CDATA[ Matemáticas ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Maryori S. Boneu ]]>
                </dc:creator>
                <pubDate>Fri, 08 Jan 2021 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/01/photo-1509228468518-180dd4864904-1-.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <h2 id="math"><strong><strong><strong><strong>Math</strong></strong></strong></strong></h2><p><code>Math</code> es uno de los objetos globales u objeto incorporado estándar de JavaScript y puede ser utilizado en cualquier lugar donde puedas usar JavaScript. Contiene constantes útiles como π y el número de Euler, además de funciones como <code>floor()</code>, <code>round()</code> y <code>ceil()</code>.</p><p>En este artículo, veremos ejemplos de muchas de esas funciones. Pero primero, aprendamos más sobre el objeto <code>Math</code>.</p><h3 id="ejemplo"><strong>Ejemplo</strong></h3><p>El siguiente ejemplo muestra como usar el objeto <code>Math</code> para escribir una función que calcula el área de un circulo:</p><pre><code class="language-javascript">function calcularAreaDeCirculo(radio) {
  return Math.PI * Math.pow(radio, 2);
}

calcularAreaDeCirculo(1); // 3.141592653589793</code></pre><h2 id="math-max"><strong><strong><strong><strong>Math Max</strong></strong></strong></strong></h2><p><code>Math.max()</code> es una función que devuelve el valor mayor de una lista de valores numéricos pasados como parámetros. Si se pasa un valor no numérico como parámetro, <code>Math.max()</code> devolverá <code>NaN</code>.</p><p>Un arreglo de valores numéricos puede ser pasado como un solo parámetro a <code>Math.max()</code> usando <code>spread (...)</code> o <code>apply</code>. Cualquiera de estos métodos puede, sin embargo, fallar cuando la cantidad de números en el arreglo es muy grande.</p><h3 id="sintaxis"><strong>Sintaxis</strong></h3><pre><code class="language-js">Math.max(valor1, valor2, valor3, ...);</code></pre><h3 id="par-metros">Parámetros</h3><p>Números, o una cantidad limitada de números en un arreglo.</p><h3 id="valor-de-retorno"><strong>Valor de retorno</strong></h3><p>El mayor valor numérico entre los números dados, o <code>NaN</code> si alguno de los valores no es numérico.</p><h3 id="ejemplos"><strong>Ejemplos</strong></h3><p><em><em>N</em>úmeros como parámetros</em></p><pre><code class="language-js">Math.max(4, 13, 27, 0, -5); // devuelve 27</code></pre><p><em>Parámetro inválido</em></p><pre><code class="language-js">Math.max(4, 13, 27, 'ocho', -5); // devuelve NaN</code></pre><p><em>Arreglo</em> <em>como p<em>ar</em>á<em>met</em>ro<em>, </em>usando <em>Spread</em> <em>(…)</em></em></p><pre><code class="language-js">let numeros = [4, 13, 27, 0, -5];

Math.max(...numeros); // devuelve 27</code></pre><p><em>Arreglo como p<em>ar</em>á<em>met</em>ro<em>, </em>usando<em> </em>.a<em>pply</em>()</em></p><pre><code class="language-js">let numeros = [4, 13, 27, 0, -5];

Math.max.apply(null, numeros); // devuelve 27</code></pre><h2 id="math-min"><strong><strong>Math Min</strong></strong></h2><p>La función Math.min() devuelve el menor valor de cero o más números.</p><p>Le puedes pasar cualquier cantidad de argumentos.</p><pre><code class="language-javascript">Math.min(7, 2, 9, -6);
// devuelve -6</code></pre><h2 id="math-pi"><strong><strong>Math PI</strong></strong></h2><p><code>Math.PI</code> es una propiedad estática del objeto Math y corresponde al número Pi, que se define como la relación entre la longitud de la circunferencia de un círculo respecto a su diámetro. El número Pi es aproximadamente 3.14149 y se representa comúnmente con la letra griega π.</p><h2 id="ejemplo-1"><strong>Ejemplo</strong></h2><pre><code class="language-js">Math.PI \\ 3.141592653589793</code></pre><h4 id="m-s-informaci-n-"><strong>Más información:</strong></h4><p><a href="https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/Math/PI">MDN</a></p><h2 id="math-pow"><strong><strong><strong><strong>Math Pow</strong></strong></strong></strong></h2><p><code>Math.pow()</code> devuelve el valor de un número elevado a otro número.</p><h4 id="sintaxis-1"><strong>Sintaxis</strong></h4><p><code>Math.pow(base, exponente)</code>, donde <code>base</code> es el número base y <code>exponente</code> es el número al que se eleva la <code>base</code>.</p><p><code>pow()</code> es un método estático de <code>Math</code>, por lo tanto, siempre es llamado como <code>Math.pow()</code> en vez de un método en otro objeto.</p><h4 id="ejemplos-1"><strong>Ejemplos</strong></h4><pre><code class="language-js">Math.pow(5, 2); // 25
Math.pow(7, 4); // 2401
Math.pow(9, 0.5); // 3
Math.pow(-8, 2); // 64
Math.pow(-4, 3); // -64</code></pre><h2 id="math-sqrt"><strong><strong><strong><strong>Math Sqrt</strong></strong></strong></strong></h2><p>La función <code>Math.sqrt()</code> devuelve la raíz cuadrada de un número.</p><p>Si se ingresa un número negativo, te devuelve <code>NaN</code>.</p><p><code>sqrt()</code> es un método estático de <code>Math</code>, por lo tanto, siempre es llamado como <code>Math.sqrt()</code> en vez de un método en otro objeto.</p><h4 id="sintaxis-2">Sintaxis</h4><p><code>Math.sqrt(x)</code>, donde <code>x</code> es un número.</p><h4 id="ejemplos-2"><strong>Ejemplos</strong></h4><pre><code class="language-js">Math.sqrt(25); // 5
Math.sqrt(169); // 13
Math.sqrt(3); // 1.732050807568
Math.sqrt(1); // 1
Math.sqrt(-5); // NaN</code></pre><h2 id="math-trunc"><strong><strong><strong><strong>Math Trunc</strong></strong></strong></strong></h2><p><code>Math.trunc()</code> es un método del objeto estándar Math que devuelve sólo la parte entera de un número dado, simplemente quitando las unidades fraccionarias. Esto resulta en hacer un redondeo de la parte decimal a 0. Cualquier valor ingresado que no sea un número devolverá como resultado NaN.</p><p>Cuidado: este método es una característica de ECMAScript 2015 (ES6) y no tiene soporte en los navegadores antiguos.</p><h3 id="ejemplos-3"><strong>Ejemplos</strong></h3><pre><code class="language-javascript">Math.trunc(0.1)   //  0
Math.trunc(1.3)   //  1
Math.trunc(-0.9)  // -0
Math.trunc(-1.5)  // -1
Math.trunc('foo') // NaN</code></pre><h2 id="math-ceil"><strong><strong>Math Ceil</strong></strong></h2><p><code>Math.ceil()</code> es un método del objeto estándar Math que redondea un número dado hacia el siguiente número entero. Toma nota que para los números negativos, esto significa que el número será redondeado "hacia 0" en vez de el número de mayor valor absoluto (ve los ejemplos a continuación). </p><h3 id="ejemplos-4"><strong>Ejemplos</strong></h3><pre><code class="language-javascript">Math.ceil(0.1)  //  1
Math.ceil(1.3)  //  2
Math.ceil(-0.9) // -0
Math.ceil(-1.5) // -1</code></pre><h2 id="math-floor"><strong><strong>Math Floor</strong></strong></h2><p><code>Math.floor()</code> es un método del objeto estándar Math que redondea un número dado hacia el número entero anterior. Toma nota que para los números negativos esto significa que el número será redondeado "lejos de 0" en vez de el número de menor valor absoluto debido a que <code>Math.floor()</code> devuelve el número entero que sea menor o igual al número dado.</p><h3 id="ejemplos-5"><strong>Ejemplos</strong></h3><pre><code class="language-javascript">Math.floor(0.9)  //  0
Math.floor(1.3)  //  1
Math.floor(0.5)  //  0
Math.floor(-0.9) // -1
Math.floor(-1.3) // -2</code></pre><h3 id="aplicando-math-floor-c-mo-crear-una-m-quina-tragamonedas-de-javascript"><strong>Aplicando <strong>math.floor: </strong>Cómo crear una Máquina Tragamonedas de JavaScript</strong></h3><p>Para este ejercicio, tenemos que generar tres números al azar usando una fórmula específica y no la fórmula general. <code>Math.floor(Math.random() * (3 - 1 + 1)) + 1;</code></p><pre><code class="language-text">puestoUno = Math.floor(Math.random() * (3 - 1 + 1)) + 1;
puestoDos = Math.floor(Math.random() * (3 - 1 + 1)) + 1;
puestoTres = Math.floor(Math.random() * (3 - 1 + 1)) + 1;</code></pre><h3 id="otro-ejemplo-encontrando-el-residuo"><strong>Otro ejemplo<strong>: </strong>Encontrando el residuo</strong></h3><pre><code class="language-text">5 % 2 = 1 porque
Math.floor(5 / 2) = 2 (Cociente)
2 * 2 = 4
5 - 4 = 1 (Residuo)</code></pre><h3 id="uso"><strong>Uso</strong></h3><p>En matemáticas, se puede verificar si un número es par o impar viendo el residuo de dividir dicho número entre 2.</p><pre><code class="language-text">17 % 2 = 1 (17 es impar)
48 % 2 = 0 (48 es par)</code></pre><p><strong>Nota </strong>No confundas que el operador <em>Resto</em> <code>%</code> no funciona bien con números negativos.</p><h2 id="m-s-art-culos-relacionados-con-math-"><strong><strong>M</strong>ás artículos relacionados con Math<strong>:</strong></strong></h2><ul><li><a href="https://www.freecodecamp.org/espanol/news/problemas-de-matematicas-con-las-horas-del-reloj/">Convertir un reloj de 12 horas a uno de 24 horas</a></li><li><a href="https://www.freecodecamp.org/espanol/news/la-regla-de-simpson-la-formula-y-como-funciona/">Regla de Simpson</a></li></ul><p>Traducido del artículo <strong><a href="https://www.freecodecamp.org/news/math-in-javascript/">JavaScript Math Functions Explained</a></strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Variables en JavaScript – Guía para principiantes sobre var, const y let ]]>
                </title>
                <description>
                    <![CDATA[ Las variables son un concepto fundamental en cualquier lenguaje de programación. En JavaScript, puedes declarar variables usando las palabras clave var, const o  let. En este artículo, aprenderás por qué usamos variables, cómo usarlas y las diferencias entre const, let y var. ¿Para qué se usan las variables en ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/javascript-variables-para-principiantes/</link>
                <guid isPermaLink="false">5fd965cf8c7cd154bb977357</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Maryori S. Boneu ]]>
                </dc:creator>
                <pubDate>Tue, 22 Dec 2020 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2020/12/Screen-Shot-2020-11-22-at-8.51.01-PM-1-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Las variables son un concepto fundamental en cualquier lenguaje de programación. En JavaScript, puedes declarar variables usando las palabras clave <code>var</code>, <code>const</code> o <code>let</code>.</p><p>En este artículo, aprenderás por qué usamos variables, cómo usarlas y las diferencias entre <code>const</code>, <code>let</code> y <code>var</code>.</p><h2 id="-para-qu-se-usan-las-variables-en-javascript"><strong>¿Para qué se usan las variables en JavaScript?</strong></h2><p>En el contexto de la programación, los datos son información que usamos en nuestros programas informáticos. Por ejemplo, tu nombre de usuario en Twitter es un dato.</p><p>Gran parte de la programación se trata de manipular o mostrar datos. Para hacer esto, los programadores necesitan alguna manera de guardar y registrar datos. Vamos a demostrar esto con un ejemplo.</p><p>Primero abriremos nuestra consola de JavaScript. Para abrir tu consola de JavaScript en Chrome, puedes usar el atajo Ctrl + Shift + J en Windows y Linux. Para Mac, usa Cmd + Option + J.</p><p>Una vez la consola esté abierta, piensa en la edad actual de tu perro o gato (o cualquier número similar si no tienes mascotas) y digítalo en la consola.</p><pre><code class="language-js">4</code></pre><p>Ahora, ¿qué pasa si queremos referirnos a ese número otra vez? Tendríamos que escribirlo por segunda vez. </p><p>Necesitamos una manera de referirnos a este dato en particular para que podamos reusarlo a lo largo de nuestro programa.</p><h2 id="introduciendo-variables-en-javascript"><strong>Introduciendo variables en<strong><strong><strong> JavaScript</strong></strong></strong></strong></h2><p>Una analogía útil es pensar en las variables como etiquetas para nuestros valores. Piensa en un contenedor de arándanos con una etiqueta que dice 'arándanos'. En este ejemplo, la variable <em>arándanos</em>, señala hacia un valor, que son los mismos arándanos.</p><p>Declaremos una variable, <code>edad</code>, y usemos el operador de asignación (signo igual) para asignar nuestro valor, 4, a esta variable. Usaremos la palabra clave <code>var</code>.</p><pre><code class="language-js">var edad = 4</code></pre><p>Las variables son la manera como los programadores le dan nombre a un valor para poder reusarlo, actualizarlo o simplemente registrarlo. Las variables se pueden usar para guardar cualquier tipo de dato en JavaScript.</p><p>Ahora que hemos asignado este valor a la variable edad, podremos referirnos a este más adelante. Si escribes ahora la variable edad en tu consola, esta te devolverá el valor de 4.</p><h2 id="c-mo-usar-la-palabra-clave-var-en-javascript"><strong>Cómo usar la palabra clave var en JavaScript</strong></h2><p>Las palabras clave en JavaScript son palabras reservadas. Cuando usas la palabra clave <code>var</code>, le estás diciendo a JavaScript que vas a declarar una variable.</p><p>Al usar <code>var</code>, las variables pueden ser reasignadas. Demostraremos esto primeramente declarando una nueva variable, nombre, y asignándole el valor de Madison.</p><pre><code>var nombre = 'Madison'</code></pre><p>Luego, reasignaremos esta variable para que apunte al valor de un nombre diferente, Ben.</p><pre><code>nombre = 'Ben'</code></pre><p>Ahora, si ejecutas <code>console.log(nombre)</code>, obtendrás el resultado Ben.</p><p>Al usar la palabra clave <code>var</code>, las variables también pueden ser declaradas sin valor inicial.</p><pre><code>var año</code></pre><p>Aquí hemos definido la variable <code>año</code>, pero esta no apunta hacia ningún valor. Más adelante, si queremos que apunte hacia algún valor, podemos usar el operador de asignación para lograrlo.</p><pre><code>año = 2020</code></pre><p>Ahora nuestra variable año apuntará al valor 2020.</p><p>Cuando JavaScript fue creado por primera vez, la única manera de declarar una variable era con la palabra clave <code>var</code>.</p><p>En las actualizaciones recientes a JavaScript (ECMAScript2015), <code>const</code> y <code>let</code> fueron creadas como otras palabras clave para declarar variables.</p><p>Para explicar por qué eran necesarias, veremos los problemas que tiene <code>var</code>. Con el objetivo de observar estos problemas, aprenderemos lo que es el Scope.</p><h2 id="-qu-es-el-scope"><strong>¿Qué es el Scope<strong>?</strong></strong></h2><p>El ámbito (Scope) se refiere a los lugares dentro de nuestro código en donde las variables están disponibles para su uso. Cuando una variable tiene un <em>ámbito global</em>, significa que está disponible en cualquier lugar de tu programa. Veamos un ejemplo.</p><p>Toma el siguiente bloque de código y pégalo en tu consola.</p><pre><code class="language-js">var nombre = 'Madison'
function imprimirNombre() {
    console.log(nombre)
}
imprimirNombre()</code></pre><p>Aquí hemos creado y llamado una función, <code>imprimirNombre</code>, que imprimirá el valor de la variable nombre, <code>Madison</code>. Verás eso impreso en tu consola.</p><p>Debido a que nuestra variable fue creada por fuera de la función, tiene alcance global. Esto significa que está disponible en cualquier parte de tu código, incluyendo dentro de cualquier función. Es por eso que la función, <code>imprimirNombre</code>, tiene acceso a la variable nombre.</p><p>Vamos ahora a crear una variable que tenga alcance de función. Esto significa que la variable solo se puede acceder dentro de la función en la que fue creada. Este siguiente ejemplo será muy similar al código anterior, pero con un posicionamiento diferente de la variable.</p><pre><code class="language-js">function imprimirAño() {
 var año = 2020
}
console.log(año)</code></pre><p>Ahora nos saldrá un error en la consola: <code>año is not defined</code> (año no está definida). Esto es porque la variable año tiene alcance de función. Es decir, solo existe dentro de la función dentro de la cuál fue creada. Al ejecutar <code>console.log</code>, hemos intentado acceder a la variable desde afuera de la función, donde no tenemos acceso.</p><p>Las variables con alcance de función son útiles a los programadores porque frecuentemente queremos crear variables que sólo sirvan o sean necesarias dentro de cierta función. Crear variables globales también nos puede generar errores o fallos.</p><p>Ahora que tenemos un entendimiento básico de lo que es el alcance, podemos volver a nuestra discusión acerca de los problemas que tiene la palabra clave <code>var</code>.</p><h2 id="problemas-con-la-palabra-clave-var-en-javascript"><strong><strong>Problem</strong>a<strong>s </strong>con la palabra clave<strong> var</strong> en <strong>JavaScript</strong></strong></h2><p>Veamos otro ejemplo.</p><p>Crearemos una variable, <code>edad</code>. Luego escribiremos una sentencia <em>if</em> que verifique si edad tiene algún valor y, si lo tiene, que devuelva un <code>console.log</code> del número que sea el doble de la edad.</p><p>Este es un ejemplo simplificado, pero primero revisaremos si edad tiene un valor porque queremos asegurarnos que estamos sumando valores válidos.</p><pre><code class="language-js">var edad = 27
if (edad) {
 var dobleDeEdad = edad + edad
 console.log(`El doble de tu edad actual es ${dobleDeEdad}`)
}</code></pre><p>Ahora en la consola verás <code>El doble de tu edad actual es 54</code>. </p><p>Nuestra variable, <code>dobleDeEdad</code>, es ahora una variable global. Si ingresas <code>dobleDeEdad</code> en tu consola, verás que tienes acceso a ella.</p><pre><code class="language-js">dobleDeEdad
54</code></pre><p>Como podemos observar, <code>dobleDeEdad</code> está ahora disponible en cualquier parte de nuestro código. La variable <code>dobleDeEdad</code> no fue declarada dentro de ninguna función. En consecuencia, ha sido creada con alcance global.</p><p>El problema es que <code>dobleDeEdad</code> solo es una variable que usamos una vez dentro de nuestra sentencia <em>if</em>, la cuál no necesitamos que esté disponible en todo nuestro código. Se ha 'filtrado' fuera de la sentencia en la que fue creada, incluso si no necesitábamos que eso sucediera.</p><pre><code class="language-js">var edad = 27
if (edad) {
 //Necesitamos que var dobleDeEdad exista solamente en este bloque de código dentro de las llaves 
    var dobleDeEdad = edad + edad
    console.log(`El doble de tu edad actual es ${dobleDeEdad}`)
}

dobleDeEdad
54
//Nuestra var dobleDeEdad está disponible por fuera de estas llaves, en el ámbito global</code></pre><p>Sería bueno que tuviésemos una manera de crear una variable que *solo* exista dentro de la sentencia <em>if</em> en donde fue creada. En otras palabras, el bloque de código que existe dentro de las llaves.</p><pre><code class="language-js">var edad = 27
if (edad) {
 //Queremos que nuestra variable solo exista aquí, donde la usaremos
 var dobleDeEdad = edad + edad
 console.log(`El doble de tu edad actual es ${dobleDeEdad}`)
}</code></pre><p>Para ayudar a resolver este problema, las palabras clave <code>const</code> y <code>let</code> fueron introducidas a JavaScript.</p><h2 id="c-mo-usar-la-palabra-clave-const-en-javascript"><strong>Cómo usar la palabra clave<strong> const </strong>en<strong> JavaScript</strong></strong></h2><p><code>const</code> funciona similar a <code>var</code>, pero con unas cuantas diferencias grandes.</p><p>Primero, <code>const</code> tiene alcance de bloque, mientras que <code>var</code> tiene alcance de función.</p><p>¿Qué es un <strong><strong>blo</strong>que</strong>?</p><p>Un <em><em>blo</em>que<em> </em></em>se refiere a cualquier espacio que esté entre llaves de apertura y cierre. Esto puede parecer confuso al principio. Escribamos nuestro ejemplo anterior, pero esta vez usando <code>const</code> en vez de <code>var</code> al declarar nuestra variable <code>dobleDeEdad</code>.</p><pre><code class="language-js">var edad = 27
if (edad) {
 const dobleDeEdad = edad + edad
 console.log(`El doble de tu edad actual es ${dobleDeEdad}`)
}</code></pre><p>Ahora escribe <code>dobleDeEdad</code> en tu consola y presiona Enter. Te debería arrojar un error, <code>dobleDeEdad is not defined</code> ( <code>dobleDeEdad</code> no está definida). Esto es porque <code>const</code> tiene alcance de bloque: <em>solo existe dentro del bloque donde fue definida<em>.</em></em></p><p>La variable <code>dobleDeEdad</code> está 'atrapada' dentro de las dos llaves de apertura y cierre. El código que está dentro de dichas llaves si puede acceder a <code>dobleDeEdad</code>, pero ningún código fuera de estas lo puede hacer.</p><p>Al usar <code>const</code> en vez de <code>var</code>, nuestro problema anterior es solucionado. Nuestra variable <code>dobleDeEdad</code> ya no se está 'filtrando' en nuestro ámbito global innecesariamente. En cambio, solo está disponible dentro del bloque de código donde fue creada.</p><p>¿Cómo funcionan las variables con ámbito de bloque dentro del contexto de las funciones? Para aprender sobre esto, vamos a crear y luego llamar a una función, <code>devuelveX</code>.</p><pre><code class="language-js">function devuelveX() {
 const x = 1
 return x
}
devuelveX()</code></pre><p>Al llamar a la función <code>devuelveX</code>, podemos ver que esta devuelve el valor de x, que es 1.</p><p>Si luego escribimos <code>x</code>, la consola arrojará <code>referenceError: x is not defined</code> (Error de referencia: x no está definida). Esto es porque las funciones también con consideradas como bloques, lo que quiere decir que nuestra const <code>x</code> solo existirá dentro de la función.</p><p>Lo siguiente que debes saber sobre <code>const</code> es que solo se puede declarar una sola vez. Escribe este código en la consola:</p><pre><code class="language-js">const y = 1
const y = 2</code></pre><p>Deberías ver un error, &nbsp;<code>Identifier 'y' has already been declared</code> (El identificador 'y' ya ha sido declarado).</p><p>Esta es la diferencia entre <code>va</code>r y <code>const</code>. Mientras que <code>const</code> arroja un error, haciéndote saber que ya has declarado esta variable, la palabra clave <code>var</code> no.</p><pre><code class="language-js">var x = 1
var x = 2</code></pre><p>La variable <code>x</code> señalará hacia el valor <code>2</code> sin errores. Esto puede causar errores para ti como programador, siendo que a lo mejor no quisiste asignarle un nuevo valor a tu variable. Entonces, usar <code>const</code> te puede ayudar, dado que recibirás un error si tratas de reasignar la variable accidentalmente.</p><p>Esta es una fortaleza de la palabra clave <code>const</code> que fue introducida como una mejor manera de crear variables en JavaScript. Sin embargo, ¿qué pasa en los casos cuando <em>sí </em>quieres actualizar el valor de tu variable?</p><p>Veamos un ejemplo en donde querríamos hacer eso.</p><p>Declaremos una variable <code>adulto</code>, con valor <code>false</code>. También crearemos una variable <code>edad</code> con valor &nbsp;<code>20</code>.</p><p><code>const adulto = false</code></p><p><code>const edad = 20</code></p><p>Digamos que queremos revisar la edad del usuario y cambiar el valor de nuestra variable adulto a verdadero si la edad está por encima de 18. Podemos escribir una sentencia para hacerlo.</p><pre><code class="language-js">if (edad &gt; 18) {
 adulto = true   
}</code></pre><p>¿Qué pasa cuando ejecutamos este código?</p><p>Aquí veremos <code>Error: Assignment to constant variable</code> (Error: asignación a variable constante).</p><p>Esto es porque, en concordancia con las reglas de <code>const</code>, no podemos volver a declarar esta variable. Debido a que nuestra variable <code>adulto</code> ya está apuntando al valor <code>false</code>, no podemos hacerle apuntar a algo más.</p><p>Si imprimimos <code>adulto</code> de nuevo, podemos ver que se mantuvo igual y contiene el mismo valor de <code>false</code>.</p><p>No podemos reasignar nuestra variable <code>adulto</code>, lo que significa que <code>const</code> está funcionando de la manera esperada. Sin embargo, ¿qué pasa si <em>queremos</em> reasignar esta variable?</p><p>Frecuentemente los programadores querrán poder volver a declarar sus variables.</p><p>Aquí es donde nuestra tercera palabra clave, <code>let</code>, surge.</p><h2 id="c-mo-usar-la-palabra-clave-let-en-javascript"><strong>Cómo usar la palabra clave<strong> let </strong>e<strong>n JavaScript</strong></strong></h2><p>Primero revisemos como <code>let</code> es similar a <code>const</code>.</p><p><code>Let</code>, como <code>const</code>, tiene alcance de bloque. Si reemplazas const por let en nuestro ejemplo previo de <code>dobleDeEdad</code>, funcionaría igual.</p><p>Sin embargo, <code>let</code> es diferente de <code>const</code> de un modo fundamental. Las variables declaradas con la palabra clave <code>let</code> pueden volver a ser declaradas, a diferencia de <code>const</code>. Repasemos un ejemplo.</p><p>Usando nuestro mismo ejemplo previo, reemplaza const por let. Mantendremos nuestra variable <code>edad</code> como una <code>const</code> con el valor de <code>20</code>.</p><pre><code class="language-js">let adulto = false
const edad = 20
if (edad &gt; 18) {
    adulto = true
}</code></pre><p>Ahora si escribimos <code>adulto</code>, en vez de recibir un error como se generó anteriormente, ahora veremos el resultado <code>true</code>.</p><p>Al usar la palabra clave <code>let</code>, hemos actualizado nuestra variable para que apunte al valor de <code>true</code> como queríamos. Algunas veces en programación, necesitaremos actualizar una variable dependiendo de ciertos datos que recibamos. Podemos usar <code>let</code> para lograr esto.</p><h2 id="conclusi-n">Conclusión</h2><p>En resumen, hemos aprendido que las variables son usadas para registrar y reusar datos en nuestros programas informáticos. El alcance (Scope) se refiere al lugar en nuestro código donde las variables están disponibles para su uso.</p><p>Las variables se pueden declarar usando <code>var</code>, <code>const</code>, o <code>let</code>. <code>var</code> tiene alcance de función, mientras que <code>const</code> y <code>let</code> tienen alcance de bloque. Las variables <code>const</code> no pueden ser reasignadas, mientras que las variables <code>let</code> si pueden serlo.</p><p><code>var</code>, <code>const</code>, y <code>let</code> pueden ser confusas al principio. Puede ayudar que leas varios tutoriales al respecto, así como también poner tu propio código a prueba de diferentes maneras para fortalecer tu entendimiento.</p><p>Tener una base sólida de <code>var</code>, <code>const</code> y <code>let</code> te ayudará no solo al principio de tu carrera de JavaScript, sino también a lo largo de esta.</p><h3 id="-gracias-por-leer-"><strong>¡Gracias por leer!</strong></h3><p>Si te gustó esta publicación, suscríbete a mi <a href="https://madisonkanna.us14.list-manage.com/subscribe/post?u=323fd92759e9e0b8d4083d008&amp;id=033dfeb98f">lista de correo</a> donde envió mis últimos artículos y anuncio meetups para mi club de libros de código.</p><p>Si tienes feedback o preguntas sobre este post, puedes twittearme a @<a href="https://twitter.com/Madisonkanna">madisonkanna.</a></p><p>Traducido del artículo <strong><a href="https://www.freecodecamp.org/news/javascript-variables-beginners-guide/">JavaScript Variables – A Beginner's Guide to var, const, and let</a><strong><strong><strong> </strong></strong></strong></strong>de <a href="https://www.freecodecamp.org/news/author/madisonkanna/"><strong>Madison Kanna</strong></a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Enlaza JavaScript a HTML con el Atributo script src ]]>
                </title>
                <description>
                    <![CDATA[ El atributo ‘src’ en una etiqueta es la ruta hacia un archivo externo o recurso que quieres enlazar a tu documento HTML. Por ejemplo, si tuvieses tu propio archivo personalizado de JavaScript llamado ‘script.js’ y quisieras agregar su funcionalidad a tu página HTML, lo agregarías de la siguiente manera: <!DOCTYPE ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-enlazar-a-un-documento-javascript-en-html/</link>
                <guid isPermaLink="false">5fd7e3c58c7cd154bb9768f4</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Maryori S. Boneu ]]>
                </dc:creator>
                <pubDate>Mon, 21 Dec 2020 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2020/12/photo-1504639725590-34d0984388bd-1-.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>El atributo ‘src’ en una etiqueta es la ruta hacia un archivo externo o recurso que quieres enlazar a tu documento HTML.</p><p>Por ejemplo, si tuvieses tu propio archivo personalizado de JavaScript llamado ‘script.js’ y quisieras agregar su funcionalidad a tu página HTML, lo agregarías de la siguiente manera:</p><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
  &lt;head&gt;
    &lt;title&gt;Ejemplo de atributo de script Src&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;

  &lt;script src="./script.js"&gt;&lt;/script&gt;
  &lt;/body&gt;
&lt;/html&gt;</code></pre><p>Esto apuntaría a un archivo llamado ‘script.js’ que está en el mismo directorio del archivo .html. También puedes enlazar otros directorios usando ’..’ en la ruta del archivo.</p><pre><code class="language-html">&lt;script src="../public/js/script.js"&gt;&lt;/script&gt;</code></pre><p>Esto salta un nivel arriba del directorio, luego a un directorio 'público', luego a un directorio llamado ‘js’ y luego al archivo ‘script.js’.</p><p>También puedes usar el atributo ‘src’ para enlazar archivos ".js" externos alojados por un tercero. Esto se usa si no quieres descargar una copia local del archivo. Solo ten en cuenta que si el enlace cambia o si el acceso de red está caído, el archivo externo que estás enlazando no funcionará.</p><p>Este ejemplo enlaza un archivo jQuery.</p><pre><code class="language-html">&lt;script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"&gt;&lt;/script&gt;</code></pre><p>Traducido del artículo <strong><a href="https://www.freecodecamp.org/news/link-javascript-to-html-with-the-src/">Link JavaScript to HTML with the script src Attribute</a></strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo crear un menú desplegable con CSS y JavaScript ]]>
                </title>
                <description>
                    <![CDATA[ En este tutorial aprenderás cómo crear un menú desplegable sencillo con Vanilla JavaScript, HTML y CSS. Vamos a recorrer el código HTML, CSS y JavaScript, pero prestando más atención a la programación, siendo que este es un tutorial de JS. Usaremos un JavaScript y CSS sencillo, sin Frameworks o preprocesadores. ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-crear-un-menu-despegable/</link>
                <guid isPermaLink="false">5fd7c0c18c7cd154bb97661a</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Maryori S. Boneu ]]>
                </dc:creator>
                <pubDate>Sat, 19 Dec 2020 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2020/12/photo-1558274849-f9fa5f16dee8-1-.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>En este tutorial aprenderás cómo crear un menú desplegable sencillo con Vanilla JavaScript, HTML y CSS. Vamos a recorrer el código HTML, CSS y JavaScript, pero prestando más atención a la programación, siendo que este es un tutorial de JS. Usaremos un JavaScript y CSS sencillo, sin Frameworks o preprocesadores. La única excepción será importar el archivo CSS de <a href="https://fontawesome.com/">Font Awesome</a> porque usaremos uno de sus iconos.</p><p>Este artículo está dirigido a desarrolladores que tienen un entendimiento promedio de HTML, CSS y JavaScript. Traté de hacerlo lo más limpio posible, pero no me enfocaré mucho en los detalles. Espero que lo disfruten.</p><h2 id="capturas"><strong><strong>Capturas</strong></strong></h2><p>Así es como se ve el resultado del código:</p><p>Pantalla inicial:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2020/12/closeDropdown-1.PNG" class="kg-image" alt="closeDropdown-1" width="525" height="248" loading="lazy"></figure><p>Menú desplegable abierto:</p><figure class="kg-card kg-image-card"><img src="https://i.imgur.com/gszPtRa.png" class="kg-image" alt="gszPtRa" width="402" height="404" loading="lazy"></figure><p>Menú desplegable con opción seleccionada:</p><figure class="kg-card kg-image-card"><img src="https://i.imgur.com/TKXxZGF.png" class="kg-image" alt="TKXxZGF" width="413" height="160" loading="lazy"></figure><h4 id="html-"><strong><strong><strong><strong>HTML:</strong></strong></strong></strong></h4><p>En esta sección, abordaremos la implementación del código HTML del demo de la página. Para empezar, veamos el código <code>&lt;head&gt;</code></p><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
	&lt;meta charset="UTF-8"&gt;
	&lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
	&lt;meta http-equiv="X-UA-Compatible" content="ie=edge"&gt;
	&lt;title&gt;Ejemplo Desplegable&lt;/title&gt;

	&lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/'-awesome/4.7.0/css/font-awesome.min.css"&gt;
	&lt;link rel="stylesheet" href="styles.css"&gt;
&lt;/head&gt;</code></pre><p>Esto es prácticamente HTML la sección repetitiva de "head", con la excepción de las etiquetas <code>link</code> &nbsp;que cargan los dos archivos CSS a usar en este tutorial: los estilos de Font Awesome y el archivo <code>styles.css</code>, donde definiremos los estilos de esta página. </p><p>Luego, tenemos el resto del archivo HTML, el body:</p><pre><code class="language-html">&lt;body&gt;
	&lt;div class='dropdown'&gt;
		&lt;div class='title pointerCursor'&gt;Seleccione una opción &lt;i class="fa fa-angle-right"&gt;&lt;/i&gt;&lt;/div&gt;
		
		&lt;div class='menu pointerCursor hide'&gt;
			&lt;div class='option' id='option1'&gt;Opcion 1&lt;/div&gt;
			&lt;div class='option' id='option2'&gt;Opcion 2&lt;/div&gt;
			&lt;div class='option' id='option3'&gt;Opcion 3&lt;/div&gt;
			&lt;div class='option' id='option4'&gt;Opcion 4&lt;/div&gt;
		&lt;/div&gt;

	&lt;/div&gt;
	&lt;span id='result'&gt;El resultado es: &lt;/span&gt;
	&lt;script&gt;
	  ...
	&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><p>Esta sección puede ser dividida en 3 partes principales:</p><ul><li>El div <code>.dropdown</code>, donde la estructura del elemento desplegable será definida.</li><li>El elemento <code>#result</code>, que contendrá la opción seleccionada por el usuario, obtenido del elemento desplegable.</li><li>El script escrito dentro del tag <code>&lt;script&gt;</code>. Su implementación está escondida porque los detalles serán explicados en la última sección de este tutorial.</li></ul><p>El menú desplegable es un <code>div</code> que contiene los elementos &nbsp;<code>title</code> y <code>menu</code>. El primero define el texto que se mostrará en el elemento antes que se elija una opción y el segundo definirá las opciones que podrán ser seleccionadas por el elemento.</p><p>El elemento <code>result</code> está allí solo para mostrarte cuál de las opciones está seleccionada actualmente.</p><h4 id="estilos-"><strong>Estilos<strong><strong><strong>:</strong></strong></strong></strong></h4><p>A continuación podrás revisar el código CSS completo. Como puedes ver, hace uso de las propiedades CSS3 <code>transition</code> y <code>transform</code>.</p><p>Por favor pon atención en las definiciones de clases de <code>.dropdown</code>. Estas son usadas para definir el diseño del componente contenedor del desplegable y también los elementos internos, como el <code>.title</code> (título) y sus <code>.option</code>‘s.</p><pre><code class="language-css">body{
	font-family: 'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif;
}

.hide {
    max-height: 0 !important;
}

.dropdown{
	border: 0.1em solid black;
	width: 10em;
	margin-bottom: 1em;
}

.dropdown .title{
	margin: .3em .3em .3em .3em;	
	width: 100%;
}

.dropdown .title .fa-angle-right{
	float: right;
	margin-right: .7em;
	transition: transform .3s;
}

.dropdown .menu{
	transition: max-height .5s ease-out;
	max-height: 20em;
	overflow: hidden;
}

.dropdown .menu .option{
	margin: .3em .3em .3em .3em;
	margin-top: 0.3em;
}

.dropdown .menu .option:hover{
	background: rgba(0,0,0,0.2);
}

.pointerCursor:hover{
	cursor: pointer;
}

.rotate-90{
	transform: rotate(90deg);
}</code></pre><h4 id="javascript-"><strong><strong><strong><strong>JavaScript:</strong></strong></strong></strong></h4><p>Ahora veremos como la parte de JavaScript es implementada. Primero recorreremos las definiciones de funciones y luego el código que llama a dichas funciones para hacer que las acciones desplegables sucedan.</p><p>En resumen, son 3 acciones que ocurren dependiendo de cual sea la interacción del usuario, dado que los "listeners" sean agregados a los elementos del DOM.</p><ol><li>Dar clic en el elemento desplegable</li><li>Seleccionar una de las opciones del desplegable</li><li>Cambiar la opción actualmente seleccionada</li></ol><p>Me gustaria aclarar que estamos usando funciones flecha (arrow functions) ( <code>() =&gt; {}</code> ) y la palabra clave <code>const</code>, que son características de ES6. Probablemente esté todo bien si estás usando una versión actualizada de tu navegador, pero ten esto en cuenta.</p><h4 id="1-dar-clic-en-el-elemento-desplegable"><strong><strong><strong><strong>1. </strong></strong></strong></strong>Dar clic en el elemento desplegable</h4><pre><code class="language-javascript">function toggleClass(elem,className){
	if (elem.className.indexOf(className) !== -1){
		elem.className = elem.className.replace(className,'');
	}
	else{
		elem.className = elem.className.replace(/\s+/g,' ') + 	' ' + className;
	}
	
	return elem;
}

function toggleDisplay(elem){
	const curDisplayStyle = elem.style.display;			
				
	if (curDisplayStyle === 'none' || curDisplayStyle === ''){
		elem.style.display = 'block';
	}
	else{
		elem.style.display = 'none';
	}
}


function toggleMenuDisplay(e){
	const dropdown = e.currentTarget.parentNode;
	const menu = dropdown.querySelector('.menu');
	const icon = dropdown.querySelector('.fa-angle-right');

	toggleClass(menu,'hide');
	toggleClass(icon,'rotate-90');
}</code></pre><p>Al dar clic en el menú desplegable, éste se abre (si está cerrado) o se cierra (si está abierto). Esto sucede vinculando <code>toggleMenuDisplay</code> al Listener del evento clic en el elemento desplegable. Esta función alterna la visibilidad de su elemento <code>menu</code> haciendo uso de las funciones <code>toggleDisplay</code> y <code>toggleClass</code>.</p><h4 id="2-seleccionar-una-de-las-opciones-del-desplegable"><strong><strong><strong><strong>2. </strong></strong></strong></strong>Seleccionar una de las opciones del desplegable</h4><pre><code class="language-javascript">function handleOptionSelected(e){
	toggleClass(e.target.parentNode, 'hide');			

	const id = e.target.id;
	const newValue = e.target.textContent + ' ';
	const titleElem = document.querySelector('.dropdown .title');
	const icon = document.querySelector('.dropdown .title .fa');


	titleElem.textContent = newValue;
	titleElem.appendChild(icon);
	
	//Activa evento personalizado
	document.querySelector('.dropdown .title').dispatchEvent(new Event('change'));
	//setTimeout se usa para que la transición se muestre correctamente
	setTimeout(() =&gt; toggleClass(icon,'rotate-90',0));
}</code></pre><h4 id="3-cambiar-la-opci-n-actualmente-seleccionada"><strong><strong><strong><strong>3. </strong></strong></strong></strong>Cambiar la opción actualmente seleccionada</h4><pre><code class="language-javascript">function handleTitleChange(e){
	const result = document.getElementById('result');

	result.innerHTML = 'The result is: ' + e.target.textContent;
}</code></pre><p>La función <code>handleTitleChange</code> está sujeta al evento personalizado <code>change</code> en el elemento <code>.title</code>, para cambiar el contenido del elemento <code>#result</code> cada vez que el elemento del título cambie. La activación del evento se da en la sección anterior.</p><h4 id="c-digo-principal">Código principal</h4><pre><code class="language-javascript">//obtiene elementos
const dropdownTitle = document.querySelector('.dropdown .title');
const dropdownOptions = document.querySelectorAll('.dropdown .option');

//vincula listeners a estos elementos
dropdownTitle.addEventListener('click', toggleMenuDisplay);
dropdownOptions.forEach(option =&gt; option.addEventListener('click',handleOptionSelected));
document.querySelector('.dropdown .title').addEventListener('change',handleTitleChange);</code></pre><p>En la sección principal solo hay código simple para obtener el título de la sección desplegable y para vincular cada opción a los eventos discutidos en la última sección.</p><h2 id="demo"><strong><strong><strong><strong>Demo</strong></strong></strong></strong></h2><p>El código completo y el demo de esta aplicación puede ser encontrados <a href="https://codepen.io/GCrispino/pen/EEXmYd">aquí</a>.</p><p>Traducido del artículo <strong><a href="https://www.freecodecamp.org/news/how-to-create-a-dropdown-menu-with-css-and-javascript/">How to Create a Dropdown Menu with CSS and JavaScript</a></strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Diseño Web Responsive — Cómo hacer que un sitio Web se vea bien en Teléfonos y Tabletas ]]>
                </title>
                <description>
                    <![CDATA[ En el panorama de rápida evolución de dispositivos conectados, el diseño web responsive continúa siendo crucial en el desarrollo web. Hasta hace poco, el término “desarrollo web responsive” era inexistente. Actualmente la mayoría de nosotros hemos tenido que adoptarlo de alguna manera. De acuerdo a Statista, desde el 2019, 61% ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/diseno-web-responsive-como-hacer-que-un-sitio-web-se-vea-bien-en-telefonos-y-tabletas/</link>
                <guid isPermaLink="false">5fd40a188c7cd154bb9738c6</guid>
                
                    <category>
                        <![CDATA[ Diseño Web Responsive ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Maryori S. Boneu ]]>
                </dc:creator>
                <pubDate>Tue, 15 Dec 2020 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/04/photo-1482053450283-3e0b78b09a70.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>En el panorama de rápida evolución de dispositivos conectados, el diseño web responsive continúa siendo crucial en el desarrollo web.</p><p>Hasta hace poco, el término “desarrollo web responsive” era inexistente. Actualmente la mayoría de nosotros hemos tenido que adoptarlo de alguna manera.</p><p>De acuerdo a Statista, desde el 2019, 61% de todas las visitas a la búsqueda de Google se realizan desde un dispositivo móvil. En septiembre de 2020, <a href="https://webmasters.googleblog.com/2020/03/announcing-mobile-first-indexing-for.html">Google cambió su algoritmo de búsqueda</a> para priorizar sitios web que sean amigables con la navegación desde dispositivos móviles.</p><p><strong>En este post abordaré lo siguiente:</strong></p><ul><li>¿Qué es el diseño web responsive?</li><li>El meta tag viewport y lo que hace</li><li>Técnicas efectivas usadas en el diseño web responsive para adaptarse a dispositivos móviles y tabletas</li><li>Herramientas que ayudan a simular y monitorear la experiencia del usuario en dispositivos móviles y tabletas</li></ul><h2 id="-qu-es-el-dise-o-web-responsive-rwd-"><strong>¿Qué es el Diseño Web Responsive? (RWD)</strong></h2><p>El diseño web responsive es un enfoque que se centra en el entorno del usuario dentro de un sitio web. El entorno del usuario dependerá del dispositivo que tenga conectado a internet.</p><p>Existen múltiples características de un dispositivo que brindan oportunidades para hacer un enfoque centrado en el usuario. Algunas de estas incluyen:</p><ul><li>Conexión de red</li><li>Tamaño de la pantalla</li><li>Tipos de interacción (pantallas táctiles, track pads)</li><li>Resolución gráfica.</li></ul><p>Antes que el diseño web responsive fuese popular, muchas compañías manejaban un sitio web completamente separado, el cual recibía tráfico reenviado basándose en el agente de usuario (user-agent).</p><p>Pero en el diseño web responsive, el servidor siempre manda el mismo código HTML a todos los dispositivos y se hace uso de CSS para alterar la renderización de la página en el dispositivo.</p><p>Independientemente de las dos estrategias previas, el primer paso en la creación un sitio web para teléfonos o tabletas, es asegurarse que el navegador conozca la intención. Aquí es donde el meta tag viewport entra en juego.</p><h2 id="el-meta-tag-viewport-para-identificar-un-sitio-web-m-vil"><strong>El Meta Tag Viewport para identificar un sitio web móvil</strong></h2><p>El meta tag viewport le indica al navegador cómo ajustar la página al ancho de cada dispositivo.</p><p>Cuando el elemento meta viewport está ausente, los navegadores móviles mostrarán las páginas con su configuración de escritorio por defecto. Esto resulta en una experiencia que parece ser no responsive y de vista reducida.</p><p>A continuación una implementación estándar:</p><figure class="kg-card kg-code-card"><pre><code class="language-html">&lt;meta name="viewport" content="width=device-width,initial-scale=1"/&gt;</code></pre><figcaption>Ejemplo de meta tag viewport</figcaption></figure><p>Ahora que el navegador sabe lo que está pasando, podemos utilizar técnicas populares para hacer que nuestro sitio web sea responsive.</p><h2 id="media-queries-de-css-para-tama-os-de-pantalla-y-orientaciones-diferentes"><strong><strong>Media Queries </strong>de CSS para Tamaños de Pantalla y Orientaciones Diferentes</strong></h2><p>Si eres nuevo al diseño web responsive, las Media Queries son la primera y más importante característica de CSS por aprender. Las Media Queries te permiten estilizar elementos basado en el ancho del viewport (área visible de un navegador). Una estrategia popular de CSS consiste en escribir los estilos móviles primero y construir sobre estos los estilos más complejos, específicos de escritorio.</p><p>Las Media Queries son una parte importante del diseño web responsive comúnmente usadas para grid layouts, tamaños de texto, márgenes y padding que difieren según el tamaño de pantalla y la orientación.</p><p>A continuación un ejemplo de un caso de uso común en estilización Mobile First, en donde una columna tiene 100% de ancho para dispositivos pequeños, pero en viewports más amplios tiene un 50% de ancho.</p><figure class="kg-card kg-code-card"><pre><code class="language-css">.column {
  width: 100%;
}

@media (min-width: 600px) {
  .column {
    width: 50%;
  }
}</code></pre><figcaption>Ejemplo CSS Mobile First</figcaption></figure><p>El código anterior es un ejemplo simple, pero lo que realmente hace es bastante interesante.</p><ol><li>Considerando Mobile First, el elemento "column" se le definió un ancho de 100%;</li><li>Usando una Media Query <code>min-width</code>, definimos reglas específicamente para viewports con un ancho mínimo de <code>600px</code> (área visible más anchas que <code>600px</code>). De esta manera, para viewports más anchos que <code>600px</code>, nuestro elemento "column" tendrá un ancho correspondiente al 50% de su elemento padre.</li></ol><p>Si bien, las Media Queries son esenciales para el diseño web responsive, muchas otras características de CSS también están siendo adoptadas a gran escala y reciben soporte en los navegadores. Caja Flexible (Flexbox) es una de esas nuevas e importantes características de CSS cuando de diseño web responsive se trata.</p><h2 id="-qu-es-flexbox"><strong>¿Qué es<strong> Flexbox?</strong></strong></h2><p>Te estarás preguntando — "¿Qué hace Flexbox?" La mejor pregunta sería — "¿Hay algo que Flexbox no pueda hacer?" ¿Cuál es la manera más fácil de centrar verticalmente con CSS? La respuesta: Flexbox. ¿Cómo se crea un diseño de cuadrícula (grid layout) responsive? Flexbox.</p><p>El módulo Diseño de Caja Flexible (Flexible Box Layout) proporciona una manera más eficiente de diseñar, alinear y distribuir espacio entre los ítems en un contenedor, incluso cuando su tamaño es dinámico — De ahí la palabra "flex".</p><p>En el ejemplo a continuación, combinamos Media Queries como se explica arriba para crear un Grid responsive. </p><figure class="kg-card kg-code-card"><pre><code class="language-html">&lt;style&gt;
  main {
    background: #d9d7d5;
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
  }

  div {
    background: #767775;
    flex-basis: 100%;
    height: 100px;
    margin-bottom: 0.5rem;
  }

  @media (min-width: 600px) {
    main {
      flex-wrap: nowrap;
    }

    div {
      flex-basis: 33%;
    }
  }
&lt;/style&gt;
&lt;main&gt;
  &lt;div&gt;&lt;/div&gt;
  &lt;div&gt;&lt;/div&gt;
  &lt;div&gt;&lt;/div&gt;
&lt;/main&gt;</code></pre><figcaption>Ejemplo CSS de Flexbox</figcaption></figure><p>Con este código logramos lo siguiente:</p><ol><li>Establecer un diseño Flexbox con <code>display: flex</code> en nuestro elemento contenedor llamado <code>main</code>.</li><li>Estilizar para Mobile First. Definimos &nbsp;<code>flex-wrap: wrap</code> al elemento <code>main</code> que permite a los elementos hijo acomodarse dentro de nuestro diseño Flexbox como se ilustra en la Figura 1. Definimos <code>flex-basis: 100%</code> en nuestro elemento <code>div</code> para asegurarnos que ocupe el 100% del ancho del elemento padre en el diseño Flexbox (Figura 1).</li><li>Estilizar para dispositivos más grandes como las tabletas y computadores de escritorio. Utilizamos una Media Query similar a nuestro ejemplo en la sección anterior para establecerle <code>flex-wrap: nowrap</code> a nuestro elemento contenedor &nbsp;<code>main</code>. Esto asegura que los elementos hijo no fluyan y el diseño se mantenga como columnas dentro de una sola fila. Al definir &nbsp;<code>flex-basis: 33%</code> a <code>div</code> dentro de la Media Query — establecemos columnas que corresponden al 33% de ancho del elemento padre.</li><li>En este ejemplo, la magia se vería en dispositivos más grandes con reglas combinadas de las Media Query y de Flexbox. Debido a que definimos &nbsp;<code>display: flex</code> y, además, no anulamos la regla dentro de la Media Query, tenemos un diseño Flexbox para móviles, tabletas y escritorio. La Media Query <code>flex-basis: 33%</code> y la regla heredada <code>display: flex</code> nos da un diseño Flexbox reconocible como se puede observar en la Figura 2. En el pasado, hacer este tipo de diseño de columna era trabajo duro, siendo necesario escribir muchos enredos en CSS para lograrlo.</li></ol><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/07/grid-mobile-1.png" class="kg-image" alt="grid-mobile-1" width="600" height="400" loading="lazy"><figcaption>Figura 1: Ejemplo de diseño flexbox grid para móviles</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/07/grid-desktop.png" class="kg-image" alt="grid-desktop" width="600" height="400" loading="lazy"><figcaption>Figura 2: Ejemplo de diseño flexbox grid para escritorio</figcaption></figure><p>Flexbox proporciona una buena manera de lograr diseños variados y fluidos. En algunos casos, puede que no tengamos este tipo de libertad en espacios verticales. Es posible que sea necesario adaptar un elemento a un valor de alto fijo. En dicha situación, existe otra técnica a nuestra disposición — desplazamiento horizontal.</p><h2 id="desplazamiento-horizontal-con-overflow-scroll"><strong>Desplazamiento h<strong>orizontal </strong>con Overflow Scroll</strong></h2><p>Podría llegar el momento en donde haya contenido se desborda del viewport sin una manera atractiva de resolverlo. He aquí... ¡Overflow Scroll al rescate!</p><p>Los usos comunes de esta técnica incluyen menús desplegables y tablas. A continuación un ejemplo de un menú desplazable.</p><!--kg-card-begin: html--><menu style="margin: auto; max-width: 826px; background: #d9d7d5; padding: 0.25rem; overflow-y: scroll; white-space: nowrap;">
  <span style="background: #767775; color: #ffffff; display: inline-block; margin: 0.25rem; padding: 0.5rem;">Responsive Web Design</span>
  <span style="background: #767775; color: #ffffff; display: inline-block; margin: 0.25rem; padding: 0.5rem;">RWD</span>
  <span style="background: #767775; color: #ffffff; display: inline-block; margin: 0.25rem; padding: 0.5rem;">Responsive menu</span>
  <span style="background: #767775; color: #ffffff; display: inline-block; margin: 0.25rem; padding: 0.5rem;">Overflow scroll example</span>
  <span style="background: #767775; color: #ffffff; display: inline-block; margin: 0.25rem; padding: 0.5rem;">This is a lot of content!</span>
  <span style="background: #767775; color: #ffffff; display: inline-block; margin: 0.25rem; padding: 0.5rem;">Yes</span>
  <span style="background: #767775; color: #ffffff; display: inline-block; margin: 0.25rem; padding: 0.5rem;">we</span>
  <span style="background: #767775; color: #ffffff; display: inline-block; margin: 0.25rem; padding: 0.5rem;">have</span>
  <span style="background: #767775; color: #ffffff; display: inline-block; margin: 0.25rem; padding: 0.5rem;">another</span>
  <span style="background: #767775; color: #ffffff; display: inline-block; margin: 0.25rem; padding: 0.5rem;">item</span>
</menu><!--kg-card-end: html--><figure class="kg-card kg-code-card"><pre><code class="language-html">&lt;style&gt;
  menu {
    background: #d9d7d5;
    padding: 0.25rem;
    overflow-y: scroll;
    white-space: nowrap;
  }

  span {
    background: #767775;
    color: #ffffff;
    display: inline-block;
    margin: 0.25rem;
    padding: 0.5rem;
  }
&lt;/style&gt;
&lt;menu&gt;
  &lt;span&gt;Deseño Responsive Web&lt;/span&gt;
  &lt;span&gt;RWD&lt;/span&gt;
  &lt;span&gt;menú Responsive&lt;/span&gt;
  &lt;span&gt;Ejemplo Overflow scroll&lt;/span&gt;
  &lt;span&gt;¡Esto es mucho contenido!&lt;/span&gt;
  &lt;span&gt;Si&lt;/span&gt;
  &lt;span&gt;Nosotros&lt;/span&gt;
  &lt;span&gt;tenemos&lt;/span&gt;
  &lt;span&gt;otro&lt;/span&gt;
  &lt;span&gt;elemento&lt;/span&gt;
&lt;/menu&gt;</code></pre><figcaption>Ejemplo de menú con desplazamiento horizontal&nbsp;</figcaption></figure><p>¿¡Pero cómo hiciste eso!? Profundicemos:</p><ul><li><code>overflow-y: scroll</code> es el ingrediente clave de esta receta. Al definirlo, los elementos hijo se desbordarán sobre el eje horizontal con comportamiento de desplazamiento.</li><li>¡No tan rápido! Aunque pienses que &nbsp;<code><code>overflow-y</code></code> es suficiente, también debemos hacerle saber al navegador que no envuelva a los elementos hijos con &nbsp;<code>white-space: nowrap</code>.</li></ul><p>Ahora que tenemos unas cuantas técnicas de RWD bajo nuestra manga, veamos elementos que suponen retos específicos por su naturaleza visual — imágenes y videos.</p><h2 id="im-genes-responsive"><strong>Imágenes <strong>Responsive</strong></strong></h2><p>Al usar atributos de tag modernos para imágenes, podemos acomodar un rango de dispositivos y resoluciones. A continuación, un ejemplo de una imagen responsive.</p><pre><code class="language-html">&lt;style&gt;
  img {
    max-width: 100%;
  }
&lt;/style&gt;

&lt;picture&gt;
  &lt;source type="image/webp" srcset="https://my-image.com/my-image-100.webp 1x, https://my-image.com/my-image-200.webp 2x"&gt;
  &lt;source type="image/png" srcset="https://my-image.com/my-image-100.png 1x, https://my-image.com/my-image-200.png 2x"&gt;
  &lt;img alt="my image" src="https://my-image.com/my-image-200.png" loading="lazy" width="100" height="100"&gt;
&lt;/picture&gt;</code></pre><p>Esto hace bastantes cosas. Vamos a desglosarlo:</p><ol><li>Al definir <code>max-width: 100%</code> la imagen se va a ampliar o reducir basada en el ancho de su contenedor.</li><li>Al usar la combinación de los tags &nbsp;<code>picture</code>, <code>source</code> e <code>img</code>, en realidad estamos renderizando solo una imagen y cargando la que mejor se adapte al dispositivo del usuario.</li><li><strong><strong>WebP</strong></strong> es un formato de imagen moderno que brinda compresión superior para imágenes en la web. Al utilizar &nbsp;<code>source</code> podemos hacer referencia a una imagen WebP para usar en navegadores que cuenten con el soporte y agregar otro tag &nbsp;<code>source</code> para referenciar una versión PNG de las imágenes que no tienen soporte WebP.</li><li><code>srcset</code> es usado para decirle al navegador qué imagen utilizar basada en la resolución del dispositivo.</li><li>Establecemos <a href="https://web.dev/native-lazy-loading/">native lazy loading</a> (carga diferida nativa) mediante el uso del par atributo / valor (attribute / value) &nbsp;<code>loading="lazy"</code>.</li></ol><h2 id="videos-responsive"><strong><strong>Video</strong>s <strong>Responsive</strong></strong></h2><p>El video Responsive es otro tema que ha inspirado un gran número de artículos y documentación.</p><p>Una estrategia clave para establecer imágenes, videos, iframes responsive y otros elementos implica el uso de relación de aspecto (aspect-ratio). La caja de relación de aspecto no es una técnica nueva y además es muy útil de tener bajo la manga para los Desarrolladores Web.</p><p>Este artículo brinda una demostración sólida acerca de cómo lograr vídeos de ancho "fluido". Veamos el código y desglosemos:</p><pre><code class="language-html">&lt;style&gt;
  .videoWrapper {
    position: relative;
    padding-bottom: 56.25%; /* 16:9 */
    height: 0;
  }

  .videoWrapper iframe {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
  }
&lt;/style&gt;

&lt;div class="videoWrapper"&gt;
  &lt;!-- Copy &amp; Pasted from YouTube --&gt;
  &lt;iframe width="560" height="349" src="http://www.youtube.com/embed/n_dZNLr2cME?rel=0&amp;hd=1" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;</code></pre><p>En este ejemplo tenemos un video embebido de YouTube cómo iframe y un contenedor <code>div</code> con la clase <code>videoWrapper</code>. Este código está haciendo bastante... profundicemos:</p><ul><li><code>position: relative</code> en el elemento contenedor le permite a los elementos hijos utilizar la posición absoluta, que es relativa a dicho elemento contenedor.</li><li><code>height: 0</code> combinado con <code>padding-bottom: 56.25%</code> es el ingrediente clave aquí, el cual establece un comportamiento dinámico, aplicando la relación de aspecto &nbsp;<code>16:9</code>.</li><li><code>position: absolute</code>, <code>top: 0</code> y <code>left: 0</code> definidos en el iframe, crean un comportamiento en el que los elementos se posicionan absolutamente relativos a su padre... fijándose en la parte superior izquierda.</li><li>Finalmente, <code>width: 100%</code> y <code>height: 100%</code> &nbsp;hace que el elemento hijo iframe sea el 100% de su padre. El padre &nbsp;<code>.videoWrapper</code> toma control completo de establecer la relación de aspecto.</li></ul><p>Lo sé... es bastante. Hay más que podemos hacer para lograr que videos e imágenes se vean lo mejor posible en teléfonos y tabletas. Les animo a que investiguen estos temas por su cuenta en adición a esto.</p><p>Bien, ahora que somos los amos del diseño web responsive, ¿cómo podemos poner a prueba lo que hemos hecho? Afortunadamente, tenemos un número de herramientas para simular y monitorear la experiencia de usuario en una variedad de dispositivos.</p><h2 id="herramientas-para-simular-y-monitorear-sitios-web-responsive"><strong>Herramientas para simular y monitorear sitios web responsive</strong></h2><p>Existe una variedad de herramientas útiles para ayudarnos a crear sitios web con diseño responsive. A continuación encontramos un par de estas que me parecen especialmente útiles.</p><h3 id="emulaci-n-m-vil-en-chrome-devtools"><strong>Emulación móvil en <strong>Chrome DevTools</strong></strong></h3><p>Las Chrome DevTools (Herramientas para Desarrolladores de Chrome) proporcionan emulación móvil para un rango de tabletas y dispositivos móviles. También ofrece una opción "Responsive" que te permite definir un tamaño personalizado del viewport.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/07/Screen-Shot-2020-07-12-at-6.19.18-PM.png" class="kg-image" alt="Screen-Shot-2020-07-12-at-6.19.18-PM" width="600" height="400" loading="lazy"><figcaption>Figura 3: Emulación móvil y de tableta de Chrome DevTools</figcaption></figure><h3 id="monitoreando-el-desempe-o-de-un-sitio-web-m-vil-con-foo"><strong>Monitoreando el desempeño de un Sitio Web Móvil con Foo</strong></h3><p>Lighthouse es una herramienta de código abierto (open-source) que brinda una manera de analizar el desempeño de un sitio específico a cada dispositivo.</p><p>Foo usa Lighthouse detrás de escena para monitorear el desempeño de un sitio web y brindar feedback para su análisis. Se puede configurar el monitoreo para ambos escritorio y dispositivos móviles y obtener feedback continuo acerca de qué tan responsive es tu sitio web.</p><p>Por ejemplo, un reporte de Lighthouse mostrará las imágenes que son cargadas inapropiadamente basada en el dispositivo.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/07/Screen-Shot-2020-07-12-at-6.31.09-PM.png" class="kg-image" alt="Screen-Shot-2020-07-12-at-6.31.09-PM" width="600" height="400" loading="lazy"><figcaption>Figura 4: Reporte de Lighthouse emulando un sitio web móvil</figcaption></figure><h2 id="conclusi-n"><strong>Conclusión</strong></h2><p>El diseño web responsive continuará evolucionando rápidamente, pero si nos mantenemos al tanto de las tendencias actuales, podremos brindar la mejor experiencia para nuestros usuarios. ¡Espero que estas herramientas y técnicas sean de gran utilidad!</p><p>No solo nuestros usuarios se beneficiarán de un diseño versátil, también los motores de búsqueda le darán a nuestra página una clasificación superior.</p><p>Traducido del artículo <strong><a href="https://www.freecodecamp.org/news/responsive-web-design-how-to-make-a-website-look-good-on-phones-and-tablets/">Responsive Web Design – How to Make a Website Look Good on Phones and Tablets</a><strong> </strong></strong>de<strong><strong> </strong></strong><a href="https://www.freecodecamp.org/news/author/adam/"><strong>Adam Henson</strong></a></p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
