<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Fernando Barrios - jfergt</title>
    <description>The latest articles on DEV Community by Fernando Barrios - jfergt (@jfernandogt).</description>
    <link>https://dev.to/jfernandogt</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F817195%2F3cb656da-3b0b-450f-9cd3-507b34facfae.jpeg</url>
      <title>DEV Community: Fernando Barrios - jfergt</title>
      <link>https://dev.to/jfernandogt</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jfernandogt"/>
    <language>en</language>
    <item>
      <title>Usar Docker sin instalar Docker Desktop en Mac</title>
      <dc:creator>Fernando Barrios - jfergt</dc:creator>
      <pubDate>Fri, 18 Oct 2024 05:00:43 +0000</pubDate>
      <link>https://dev.to/jfernandogt/usar-docker-sin-instalar-docker-desktop-en-mac-5ae7</link>
      <guid>https://dev.to/jfernandogt/usar-docker-sin-instalar-docker-desktop-en-mac-5ae7</guid>
      <description>&lt;p&gt;Preámbulo&lt;/p&gt;

&lt;p&gt;Con los recientes cambios en las &lt;a href="https://www.docker.com/blog/updating-product-subscriptions/" rel="noopener noreferrer"&gt;licencias de Docker Desktop&lt;/a&gt;, muchos desarrolladores y empresas han comenzado a buscar alternativas para manejar contenedores sin incurrir en costos adicionales o restricciones de licencia. Aunque herramientas como Podman o Rancher ofrecen soluciones robustas, a menudo presentan una curva de aprendizaje más pronunciada para quienes están acostumbrados a Docker, o bien requieren de muchas configuraciones para que logren funcionar de la misma manera en la que Docker lo hace. Afortunadamente, es posible utilizar Docker sin depender de Docker Desktop. En este artículo, exploraremos cómo hacerlo de manera efectiva.&lt;/p&gt;

&lt;p&gt;Decidí escribir este artículo tras haber pasado seis meses probando Podman y Rancher. Aunque ambas herramientas son poderosas, encontré que trabajar con Docker sin Docker Desktop ofrecía una experiencia más directa para mis necesidades. Sin embargo, me encontré con ciertas limitaciones que quiero abordar a lo largo del artículo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalación
&lt;/h2&gt;

&lt;p&gt;El único requisito previo es Homebrew, que si no lo tienes instalado, puedes encontrar instrucciones en su página &lt;a href="https://brew.sh/" rel="noopener noreferrer"&gt;aquí&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Para empezar, debemos instalar Docker y el asistente de gestión de credenciales. Este asistente nos permitirá usar el llavero de macOS como almacén de credenciales para repositorios de contenedores remotos en lugar de Docker Desktop.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;brew install docker docker-credential-helper
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego tendremos que actualizar las configuraciones de Docker. Para esto, editaremos el archivo en &lt;code&gt;~/.docker/config.json&lt;/code&gt; con cualquier editor de archivos, por ejemplo, &lt;code&gt;nano&lt;/code&gt;. Las claves importantes que debemos actualizar son &lt;code&gt;credsStore&lt;/code&gt; y &lt;code&gt;currentContext&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nano ~/.docker/config.json{ "auths": {}, "credsStore": "osxkeychain", "currentContext": "colima"}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora debemos instalar un container runtime, en mi caso opt por Colima&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;brew install colima
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por último para levantar o detener el servicio, bastar con ejecutar sus respectivos comandos&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;colima start # Para iniciar el servicio colima stop # Para detener el servicio
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para todos aquellos que les gustan las interfaces gráficas, pueden usar la extensión de &lt;a href="https://code.visualstudio.com/docs/containers/overview" rel="noopener noreferrer"&gt;Docker para VS Code&lt;/a&gt;, la cual lee el &lt;code&gt;currentContext&lt;/code&gt; de la configuración que actualizamos y automáticamente se conecta y nos muestra la misma información que tengamos en el Docker Desktop.&lt;/p&gt;

&lt;p&gt;Una segunda alternativa, si no quisiéramos usar la extensión de VS Code y tenemos &lt;a href="https://raycast.com/?via=fernando" rel="noopener noreferrer"&gt;Raycast&lt;/a&gt; instalado, es usar su &lt;a href="https://www.raycast.com/priithaamer/docker" rel="noopener noreferrer"&gt;extensión de Docker&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuración del socket
&lt;/h2&gt;

&lt;p&gt;Algunas aplicaciones se conectan directamente al socket de Docker, el cual usualmente se encuentra en &lt;code&gt;/var/run/docker.sock&lt;/code&gt;. Para estas aplicaciones, lo mejor es crear un enlace simbólico de Colima hacia esa ruta, ejecutando este comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo ln -s /Users/TU_USUARIO/.colima/default/docker.sock /var/run/docker.sock
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusiones
&lt;/h2&gt;

&lt;p&gt;Con estas instrucciones, puedes seguir utilizando Docker sin la necesidad de Docker Desktop, manteniendo as la flexibilidad de tus proyectos y asegurando el cumplimiento de las nuevas polticas de licencias. Al final si lo que buscamos es tener la experiencia ms cercana a Docker, no hay nada ms cercano a eso que usar el mismo CLI de Docker.&lt;/p&gt;

</description>
      <category>alternativas</category>
      <category>docker</category>
    </item>
    <item>
      <title>Top 10 de certificaciones que todo Developer debería de considerar</title>
      <dc:creator>Fernando Barrios - jfergt</dc:creator>
      <pubDate>Fri, 09 Feb 2024 03:25:34 +0000</pubDate>
      <link>https://dev.to/jfernandogt/top-10-de-certificaciones-que-todo-developer-deberia-de-considerar-11cn</link>
      <guid>https://dev.to/jfernandogt/top-10-de-certificaciones-que-todo-developer-deberia-de-considerar-11cn</guid>
      <description>&lt;p&gt;El año pasado, me enfrenté al desafío de obtener la certificación "Certified Kubernetes Developer CKAD". En mi equipo de trabajo, la demanda de conocimientos en Kubernetes estaba en aumento, y aunque nunca antes había trabajado con esta tecnología, me lancé a la aventura. Hasta ese momento, mi experiencia más compleja se limitaba a dockerizar aplicaciones.&lt;/p&gt;

&lt;p&gt;Opté por tomar esta certificación como una oportunidad para sumergirme profundamente en el mundo de Kubernetes. Después de 4 meses de intenso trabajo, completando cursos, realizando simulaciones y sacrificando horas de sueño (lo que generó algunos regaños de mi esposa), logré obtener la certificación en mi primer intento!&lt;/p&gt;

&lt;p&gt;Esta entrada en el blog pretende compartir mi experiencia y reflexionar sobre las certificaciones que considero valiosas para los desarrolladores de software. Si bien algunas pueden no ser relevantes para todos los perfiles, estas son las que, en mi opinión, pueden agregar un gran valor a nuestra carrera profesional.&lt;/p&gt;

&lt;p&gt;Es importante destacar que las certificaciones no son un indicador absoluto de los conocimientos de una persona, pero desde mi experiencia, han aportado numerosos beneficios:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Validación de conocimientos&lt;/strong&gt;: Las certificaciones sirven como un respaldo tangible de que poseo un cierto nivel de conocimientos en la materia. Es una forma de demostrar mis habilidades y competencias en un área específica.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Claridad para no expertos&lt;/strong&gt;: Para aquellos que no están familiarizados con el mundo de la tecnología, las certificaciones proporcionan una comprensión clara de mi experiencia y habilidades como desarrollador. Facilitan la comunicación sobre mi formación y trayectoria profesional.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Diferenciación en el mercado laboral&lt;/strong&gt;: Tener certificaciones destacadas en mi currículum puede hacer que resalte entre otros candidatos en el mercado laboral. Demuestra un compromiso con el aprendizaje continuo y la mejora profesional.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Profundización en temas específicos&lt;/strong&gt;: A través de la preparación para las certificaciones, he tenido la oportunidad de profundizar en temas específicos que de otro modo podrían haber quedado fuera de mi radar. Esto me ha permitido adquirir un entendimiento más completo y detallado de ciertos aspectos de la tecnología.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Acceso a nuevos conocimientos&lt;/strong&gt;: Las certificaciones también han abierto puertas a áreas de conocimiento a las que, por mi carrera profesional, no habría estado expuesto de otra manera. Me han permitido explorar nuevos temas y expandir mi conjunto de habilidades de manera significativa.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  10 certificaciones que considero que todo desarrollador debería de considerar
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Cloud&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Certificación AWS Certified Developer - Associate&lt;/strong&gt;: Esta certificación valida las habilidades en el desarrollo de aplicaciones en la nube utilizando servicios de Amazon Web Services (AWS).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Certificación Microsoft Certified: Azure Developer Associate&lt;/strong&gt;: Similar a la certificación de AWS, pero enfocada en el desarrollo de aplicaciones en la nube utilizando la plataforma de Microsoft Azure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Certificación Google: Professional Cloud Developer&lt;/strong&gt;: Similar a la certificación de AWS o Azure, pero enfocada en el desarrollo de aplicaciones en la nube utilizando la plataforma de Google Developer Cloud.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CKAD (Certified Kubernetes Application Developer)&lt;/strong&gt;: Esta certificación valida las habilidades en el desarrollo de aplicaciones en contenedores utilizando Kubernetes, un componente fundamental en entornos de nube y despliegue de aplicaciones modernas.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Desarrollo&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;JSNAD (JavaScript Developer - Professional Certification)&lt;/strong&gt;: Esta certificación se centra en validar habilidades avanzadas en JavaScript, abarcando tanto frontend como backend y cubriendo conceptos esenciales para el desarrollo de aplicaciones web modernas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;JSNSD (JavaScript Developer - Professional Certification)&lt;/strong&gt;: Similar a JSNAD, pero enfocada específicamente en el desarrollo frontend, esta certificación valida habilidades en HTML, CSS, JavaScript y frameworks frontend populares.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Gestión de proyectos&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CSM (Certified ScrumMaster)&lt;/strong&gt;: Esta certificación valida las habilidades en Scrum y la capacidad para servir como líder de equipo en un entorno ágil. Es una certificación fundamental para aquellos que desean trabajar en equipos Scrum y liderar iniciativas ágiles.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CSD (Certified Scrum Developer) y A-CSD&lt;/strong&gt;: La certificación CSD valida las habilidades técnicas de un desarrollador en un entorno Scrum. Se centra en prácticas de desarrollo ágil, colaboración efectiva en equipo y entrega continua de software de alta calidad dentro de un marco de trabajo Scrum. Respecto a la de A-CSD, esta certificación es una extensión del CSD y valida habilidades técnicas adicionales y más avanzadas en el contexto de Scrum. Se centra en técnicas de desarrollo avanzadas, diseño de software sólido, refactorización y entrega de software de alta calidad en equipos Scrum.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Team Kanban Practitioner (TKP)&lt;/strong&gt;: Valida la comprensión y aplicación práctica de los principios y prácticas de Kanban en equipos de trabajo. Esta certificación se centra en cómo visualizar el trabajo, limitar el trabajo en curso (WIP), gestionar el flujo de trabajo y mejorar continuamente el proceso de entrega.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Control de calidad&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Certified Tester Foundation Level (CTFL)&lt;/strong&gt;: Esta certificación es fundamental en el campo de la prueba de software, cubriendo conceptos básicos de pruebas, técnicas de diseño de pruebas y gestión de pruebas, lo cual es esencial para garantizar la calidad de las aplicaciones web.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Como habrás notado, no he dejado ninguna que esté relacionada a la seguridad, cuento con poca información en ese tema, por lo que acepto sugerencias :)&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Comprendiendo "Syntactic Sugar" - Una guía simple</title>
      <dc:creator>Fernando Barrios - jfergt</dc:creator>
      <pubDate>Wed, 07 Jun 2023 18:24:14 +0000</pubDate>
      <link>https://dev.to/jfernandogt/comprendiendo-syntactic-sugar-una-guia-simple-1ged</link>
      <guid>https://dev.to/jfernandogt/comprendiendo-syntactic-sugar-una-guia-simple-1ged</guid>
      <description>&lt;h2&gt;
  
  
  TLDR
&lt;/h2&gt;

&lt;p&gt;Comprendiendo "Syntactic Sugar" es una guía simple que explica cómo ciertas características en JavaScript, como funciones de flecha y operadores de propagación, hacen que el código sea más legible y conciso sin agregar nuevas funcionalidades. Estas características mejoran la legibilidad y expresividad del código, lo que facilita el desarrollo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducción al "Syntactic Sugar"
&lt;/h2&gt;

&lt;p&gt;El "syntactic sugar" en JavaScript es como un dulce que hace que nuestro código sea más fácil de leer y entender. 🍬&lt;/p&gt;

&lt;p&gt;Cuando hablamos de syntactic sugar, nos referimos a características del lenguaje que no añaden nuevas funcionalidades, pero nos permiten escribir código de una manera más sencilla y concisa. Es como si le pusieran un poco de azúcar al lenguaje para hacerlo más agradable y legible. 🎉&lt;/p&gt;

&lt;h2&gt;
  
  
  Propósito y beneficios
&lt;/h2&gt;

&lt;p&gt;El propósito principal de este azúcar sintáctico es mejorar la legibilidad y la expresividad del código. Al utilizar una sintaxis más clara y concisa, nuestro código se vuelve más fácil de entender, lo que resulta en un desarrollo más eficiente y rápido. 💻&lt;/p&gt;

&lt;p&gt;Algunos ejemplos de syntactic sugar en JavaScript son las funciones de flecha (&lt;code&gt;=&amp;gt;&lt;/code&gt;), el operador de propagación (&lt;code&gt;...&lt;/code&gt;), el operador de desestructuración y muchos otros. Estas características nos permiten escribir código de forma más breve y elegante. 😍💻&lt;/p&gt;

&lt;h2&gt;
  
  
  Ejemplos comunes
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// 1. Arrow functions
const add = (a, b) =&amp;gt; a + b;

// 2. Template literals
const greeting = `Hello, ${name}!`;

// 3. Object property shorthand
const x = 10, y = 20;
const point = { x, y };

// 4. Destructuring assignment
const { firstName, lastName } = person;

// 5. Default parameters
function multiply(a, b = 1) {
  return a * b;
}

// 6. Spread syntax
const arr1 = [1, 2, 3];
const arr2 = [...arr1, 4, 5, 6];

// 7. Rest parameters
function sum(...numbers) {
  return numbers.reduce((a, b) =&amp;gt; a + b, 0);
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No es genial? 😄&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusiones
&lt;/h2&gt;

&lt;p&gt;Recuerda utilizar el syntactic sugar con moderación y mantener la consistencia en tu código para evitar confusiones. Además, documentar y comentar tu código siempre es una buena práctica para que otros desarrolladores puedan entenderlo fácilmente. 📝💡&lt;/p&gt;

&lt;p&gt;Ah, y no te olvides de mantener tu conocimiento actualizado sobre las novedades de JavaScript! Siempre hay nuevas formas de endulzar nuestro código. 🍭🚀&lt;/p&gt;

&lt;p&gt;¡Feliz programación! 💻💖&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Patrón de diseño Higher-Order Component (HOC) en React y JavaScript</title>
      <dc:creator>Fernando Barrios - jfergt</dc:creator>
      <pubDate>Thu, 16 Mar 2023 16:55:41 +0000</pubDate>
      <link>https://dev.to/jfernandogt/patron-de-diseno-higher-order-component-hoc-en-react-y-javascript-3925</link>
      <guid>https://dev.to/jfernandogt/patron-de-diseno-higher-order-component-hoc-en-react-y-javascript-3925</guid>
      <description>&lt;h2&gt;
  
  
  Introducción
&lt;/h2&gt;

&lt;p&gt;El patrón de diseño Higher-Order Component (HOC) es un patrón avanzado en React que se utiliza para reutilizar la lógica de los componentes. Un HOC es una función que toma un componente y devuelve otro componente con funcionalidades adicionales o modificadas. En este artículo, exploraremos el patrón de diseño HOC con ejemplos en React y JavaScript.&lt;/p&gt;

&lt;h2&gt;
  
  
  HOC en detalle
&lt;/h2&gt;

&lt;p&gt;La idea detrás de este patrón es aprovechar la composición en lugar de la herencia para extender la funcionalidad de los componentes de React. Entonces con la ayuda de la composición podemos tomar un componente, añadirle funcionalidades y luego devolver el componente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ejemplo básico de HOC en JavaScript
&lt;/h2&gt;

&lt;p&gt;Antes de adentrarnos en React, veamos un ejemplo básico de HOC en JavaScript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function withLogging(fn) {
  return function (...args) {
    console.log(`Llamando a la funcin: ${fn.name}`, args);
    const result = fn(...args);
    console.log(`Resultado: ${result}`);
    return result;
  };
}

function suma(a, b) {
  return a + b;
}

const sumaConLogging = withLogging(suma);
const resultado = sumaConLogging(3, 4); // Llamando a la funcin: suma [3, 4]
                                        // Resultado: 7

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este ejemplo, &lt;code&gt;withLogging&lt;/code&gt; es un HOC que toma una función &lt;code&gt;fn&lt;/code&gt; y devuelve una nueva función que registra el nombre de la función, sus argumentos y su resultado antes de llamarla.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ejemplo de HOC en React
&lt;/h2&gt;

&lt;p&gt;Ahora, veamos un ejemplo de HOC en React. Supongamos que tenemos dos componentes funcionales: &lt;code&gt;ComponenteA&lt;/code&gt; y &lt;code&gt;ComponenteB&lt;/code&gt;. Queremos agregar la funcionalidad de contar el número de veces que se hace clic en un botón en ambos componentes. En lugar de agregar la lógica de conteo en cada componente individualmente, podemos crear un HOC que envuelva ambos componentes y les proporcione la funcionalidad de conteo.&lt;/p&gt;

&lt;p&gt;Aquí está el código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useState } from 'react';

// HOC que agrega la funcionalidad de conteo
const withCounter = (WrappedComponent) =&amp;gt; {
  const WithCounter = () =&amp;gt; {
    const [count, setCount] = useState(0);

    const handleClick = () =&amp;gt; {
      setCount(count + 1);
    };

    return &amp;lt;WrappedComponent handleClick={handleClick} count={count} /&amp;gt;;
  };

  return WithCounter;
};

// ComponenteA sin la funcionalidad de conteo
const ComponenteA = ({ handleClick }) =&amp;gt; {
  return &amp;lt;button onClick={handleClick}&amp;gt;Componente A&amp;lt;/button&amp;gt;;
};

// ComponenteB sin la funcionalidad de conteo
const ComponenteB = ({ handleClick }) =&amp;gt; {
  return &amp;lt;button onClick={handleClick}&amp;gt;Componente B&amp;lt;/button&amp;gt;;
};

// Envolver ComponenteA y ComponenteB con el HOC
const ComponenteAConConteo = withCounter(ComponenteA);
const ComponenteBConConteo = withCounter(ComponenteB);

// Renderizar ComponenteA y ComponenteB con la funcionalidad de conteo agregada
const App = () =&amp;gt; {
  return (
    &amp;lt;&amp;gt;
      &amp;lt;ComponenteAConConteo /&amp;gt;
      &amp;lt;ComponenteBConConteo /&amp;gt;
    &amp;lt;/&amp;gt;
  );
};

export default App;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este ejemplo, creamos un HOC llamado &lt;code&gt;withCounter&lt;/code&gt; que acepta un componente como argumento y devuelve un nuevo componente llamado &lt;code&gt;WithCounter&lt;/code&gt;. &lt;code&gt;WithCounter&lt;/code&gt; tiene su propio estado para contar el número de clics y una función &lt;code&gt;handleClick&lt;/code&gt; que actualiza el estado cada vez que se hace clic en el botón.&lt;/p&gt;

&lt;p&gt;Luego, envolvemos los componentes &lt;code&gt;ComponenteA&lt;/code&gt; y &lt;code&gt;ComponenteB&lt;/code&gt; con el HOC &lt;code&gt;withCounter&lt;/code&gt; para agregarles la funcionalidad de conteo. Finalmente, renderizamos los componentes envueltos &lt;code&gt;ComponenteAConConteo&lt;/code&gt; y &lt;code&gt;ComponenteBConConteo&lt;/code&gt; en nuestra aplicación principal.&lt;/p&gt;

&lt;p&gt;De esta manera, logramos reutilizar la funcionalidad de conteo en múltiples componentes y mantener nuestro código más limpio y modular.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Juego de Tic Tac Toe en HTML con ChatGPT en 2 minutos</title>
      <dc:creator>Fernando Barrios - jfergt</dc:creator>
      <pubDate>Fri, 03 Mar 2023 17:10:13 +0000</pubDate>
      <link>https://dev.to/jfernandogt/juego-de-tic-tac-toe-en-html-con-chatgpt-en-2-minutos-1po0</link>
      <guid>https://dev.to/jfernandogt/juego-de-tic-tac-toe-en-html-con-chatgpt-en-2-minutos-1po0</guid>
      <description>&lt;p&gt;Considero que muchas personas en el mundo de la programación han aprendido bastante gracias a videos, blogs, libros, y stackoverflow etc... donde se pueden ver tutoriales o extractos de código que nos ayudan a completar algún software que estamos desarrollando para la Universidad o el trabajo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿pero y si existiera una herramienta a la que le pudieramos pedir específicamente un bloque de código, una función o inclusive un programa completo?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;En este artículo veremos como crear el juego de "Tic Tac Toe" en HTML, CSS y JavaScript utilizando ChatGPT. El propósito de este artículo es que conozcamos un poco más acerca de ChatGPT y entender como gracias a esta tecnología podemos apoyarnos para mejorar nuestras habilidades de programación.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué es ChatGPT?
&lt;/h2&gt;

&lt;p&gt;ChatGPT es un modelo de aprendizaje automático que ha sido entrenado en grandes cantidades de datos de texto de Internet, lo que le permite generar respuestas coherentes y contextualmente apropiadas a preguntas o declaraciones abiertas.&lt;/p&gt;

&lt;p&gt;Los datos de entrenamiento utilizados para entrenar ChatGPT pueden haber incluido texto de una amplia gama de fuentes, incluidos los repositorios de código abierto en Github u otras compañías.&lt;/p&gt;

&lt;p&gt;En general, ChatGPT es un modelo de lenguaje poderoso que está cambiando la forma en que interactuamos con las máquinas y haciendo que el procesamiento del lenguaje natural sea más accesible para los desarrolladores y las empresas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Escribiendo el juego
&lt;/h2&gt;

&lt;p&gt;Basta con acceder a la herramienta de &lt;a href="https://chat.openai.com/"&gt;ChatGPT&lt;/a&gt; y escribirle que necesitamos que nos genere el juego de Tic Tac Toe en Javascript, y este es el resultado:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---Glfj20Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1677862396998/e3765174-5daa-4223-a678-a0c8c38966c2.png%2520align%3D%2522center%2522" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---Glfj20Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1677862396998/e3765174-5daa-4223-a678-a0c8c38966c2.png%2520align%3D%2522center%2522" alt="" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Acá dejaré el cada sección de código según el nombre del archivo y comentado para que podamos entender que ha sido lo que generó:&lt;/p&gt;

&lt;h3&gt;
  
  
  HTML
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Tic Tac Toe&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- Importa el archivo de estilos de CSS --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text/css"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"style.css"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- Escribe una tabla con 3 filas y 3 columnas. Cada celda debe tener un id que vaya de 0 a 8.
        Por ejemplo, la celda de la esquina superior izquierda debe tener el id 0,
        la celda de la esquina superior derecha debe tener el id 2, y así sucesivamente. --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;table&amp;gt;&lt;/span&gt;
      &lt;span class="c"&gt;&amp;lt;!-- TR es de table row (fila de tabla) --&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;tr&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;td&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
        &lt;span class="c"&gt;&amp;lt;!-- TD es de table data (datos de tabla) --&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;td&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;td&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;tr&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;td&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;td&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"4"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;td&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"5"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;tr&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;td&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"6"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;td&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"7"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;td&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/table&amp;gt;&lt;/span&gt;

    &lt;span class="c"&gt;&amp;lt;!-- Importa el archivo de JavaScript --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"script.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  CSS
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* Usamos el identificador de la tabla para seleccionarla y aplicarle sus estilos. */&lt;/span&gt;
&lt;span class="nt"&gt;table&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;border-collapse&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;collapse&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/*  border-collapse nos permite que las celdas de la tabla se vean separadas. */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Usamos el identificador de td para seleccionarla y aplicarle sus estilos. */&lt;/span&gt;
&lt;span class="nt"&gt;td&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;50px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/*  width nos permite darle un ancho a las celdas de la tabla. */&lt;/span&gt;
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;50px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/*  height nos permite darle un alto a las celdas de la tabla. */&lt;/span&gt;
  &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/*  text-align nos permite centrar el texto de las celdas de la tabla. */&lt;/span&gt;
  &lt;span class="nl"&gt;vertical-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;middle&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/*  vertical-align nos permite centrar el texto de las celdas de la tabla. */&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="no"&gt;black&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/*  border nos permite darle un borde a las celdas de la tabla, el grosor es de 1px sólido y color negro. */&lt;/span&gt;
  &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;36px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/*  font-size nos permite darle un tamaño a la fuente de las celdas de la tabla. */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Usamos el identificador de la clase X para seleccionarla y aplicarle sus estilos. */&lt;/span&gt;
&lt;span class="nc"&gt;.X&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/*  color nos permite darle un color rojo. */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Usamos el identificador de la clase O para seleccionarla y aplicarle sus estilos. */&lt;/span&gt;
&lt;span class="nc"&gt;.O&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/*  color nos permite darle un color azul. */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  JavaScript
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;currentPlayer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;X&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// currentPlayer es inicializado como "X" para que el primer jugador sea "X"&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;cells&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;td&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Selecciona todos los elementos "td" y los almacena en la variable "cells"&lt;/span&gt;

&lt;span class="nx"&gt;cells&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Itera sobre cada elemento "td" y agrega un evento "click" a cada uno&lt;/span&gt;
  &lt;span class="nx"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Cuando se hace click en un elemento "td", se ejecuta la función anónima&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Si el elemento "td" no tiene texto, se agrega el texto del jugador actual&lt;/span&gt;
      &lt;span class="nx"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;currentPlayer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Agrega el texto del jugador actual al elemento "td"&lt;/span&gt;
      &lt;span class="nx"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;currentPlayer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Agrega la clase del jugador actual al elemento "td"&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;checkWin&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Si checkWin() retorna true, se muestra un mensaje de victoria y se reinicia el juego&lt;/span&gt;
        &lt;span class="nx"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;currentPlayer&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; wins!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Muestra un mensaje de victoria&lt;/span&gt;
        &lt;span class="nx"&gt;reset&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Reinicia el juego&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;checkDraw&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Si checkDraw() retorna true, se muestra un mensaje de empate y se reinicia el juego&lt;/span&gt;
        &lt;span class="nx"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;It's a draw!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Muestra un mensaje de empate&lt;/span&gt;
        &lt;span class="nx"&gt;reset&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Reinicia el juego&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Si no se cumple ninguna de las condiciones anteriores, se cambia el jugador actual&lt;/span&gt;
        &lt;span class="nx"&gt;currentPlayer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;currentPlayer&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;X&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;O&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;X&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Si el jugador actual es "X", se cambia a "O", de lo contrario, se cambia a "X"&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// checkWin() retorna true si el jugador actual tiene 3 celdas en línea&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;checkWin&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// win es inicializado como false&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;win&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="c1"&gt;// winningCombos contiene todas las combinaciones de celdas que pueden ganar&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;winningCombos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;];&lt;/span&gt;

  &lt;span class="c1"&gt;// Itera sobre cada combinación de celdas&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;combo&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;winningCombos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Si el contenido de la celda en la posición 0, 1 y 2 de la combinación actual es igual al jugador actual,&lt;/span&gt;
    &lt;span class="c1"&gt;// se retorna true&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;cells&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;combo&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]].&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;currentPlayer&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
      &lt;span class="nx"&gt;cells&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;combo&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]].&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;currentPlayer&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
      &lt;span class="nx"&gt;cells&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;combo&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]].&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;currentPlayer&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;win&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Retorna true si el jugador actual tiene 3 celdas en línea&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;win&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// checkDraw() retorna true si todas las celdas están llenas&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;checkDraw&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;draw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Itera sobre cada celda&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;cell&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;cells&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Si la celda actual está vacía, se retorna false&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;draw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// reset() reinicia el juego&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;reset&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Itera sobre cada celda&lt;/span&gt;
  &lt;span class="nx"&gt;cells&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Elimina el texto de la celda actual y elimina la clase "X" o "O"&lt;/span&gt;
    &lt;span class="nx"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;X&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;O&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="c1"&gt;// Reinicia el jugador actual&lt;/span&gt;
  &lt;span class="nx"&gt;currentPlayer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;X&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Y acá el juego en acción
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Q5vMUck0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1677863330572/7e08ced2-e680-49b4-b166-2d8f0fc858fd.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Q5vMUck0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1677863330572/7e08ced2-e680-49b4-b166-2d8f0fc858fd.gif" alt="Tic Tac Toe Game Javascript ChatGPT" width="500" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Scrum vs Kanban: Mi opinión como dev después de más de 8 años de trabajo.</title>
      <dc:creator>Fernando Barrios - jfergt</dc:creator>
      <pubDate>Thu, 09 Feb 2023 14:00:39 +0000</pubDate>
      <link>https://dev.to/jfernandogt/scrum-vs-kanban-mi-opinion-como-dev-despues-de-mas-de-8-anos-de-trabajo-5bnn</link>
      <guid>https://dev.to/jfernandogt/scrum-vs-kanban-mi-opinion-como-dev-despues-de-mas-de-8-anos-de-trabajo-5bnn</guid>
      <description>&lt;p&gt;Antes de adentrarnos en las principales diferencias, es conveniente platicar un poco sobre cada una.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scrum
&lt;/h2&gt;

&lt;p&gt;Scrum es un marco ágil para gestionar y completar proyectos complejos. Originalmente se desarrolló para el desarrollo de software, pero ahora se usa ampliamente en una variedad de industrias, que incluyen marketing, finanzas y atención médica.&lt;/p&gt;

&lt;p&gt;Scrum se basa en los principios de transparencia, inspección y adaptación. Proporciona un proceso estructurado y repetible para entregar el trabajo, con roles, eventos y artefactos definidos.&lt;/p&gt;

&lt;p&gt;Scrum enfatiza la entrega de un incremento de producto entregable al final de cada sprint, para que el equipo esté continuamente entregando valor al cliente. También fomenta la mejora continua, con retrospectivas periódicas y la capacidad de ajustar el objetivo del sprint a mitad del sprint, si es necesario.&lt;/p&gt;

&lt;p&gt;Scrum es ideal para proyectos complejos que requieren una estrecha colaboración, equipos multifuncionales y comentarios regulares de los clientes y las partes interesadas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kanban
&lt;/h2&gt;

&lt;p&gt;Kanban es un sistema visual para administrar y optimizar flujos de trabajo, desarrollado originalmente en la industria manufacturera. Ahora se usa ampliamente en el desarrollo de software y otros campos para ayudar a los equipos a entregar elementos de trabajo de manera más efectiva y eficiente.&lt;/p&gt;

&lt;p&gt;En Kanban, los elementos de trabajo se representan como tarjetas en un tablero visual y cada tarjeta se mueve de izquierda a derecha a través de una serie de columnas, que representan diferentes etapas del flujo de trabajo. Los equipos usan límites WIP (trabajo en curso) para administrar el flujo y garantizar que los elementos de trabajo se completen de la manera más rápida y eficiente posible.&lt;/p&gt;

&lt;p&gt;Kanban enfatiza la mejora continua y alienta a los equipos a realizar cambios en el proceso según sea necesario. No tiene time boxes, sprints o roles definidos, lo que lo convierte en un enfoque más flexible que se puede adaptar a las necesidades de diferentes equipos y proyectos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Principales diferencias
&lt;/h2&gt;

&lt;p&gt;Estas son las diferencias clave entre las metodologías Scrum y Kanban:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Proceso: Scrum es un proceso estructurado e iterativo con roles, ceremonias y cuadros de tiempo definidos. Kanban es un enfoque más flexible basado en el flujo sin cuadros de tiempo ni roles definidos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Elementos de trabajo: Scrum utiliza "backlogs" tanto para producto como para el sprint para administrar los elementos de trabajo, mientras que Kanban utiliza un tablero visual para realizar un seguimiento de los elementos de trabajo a través de diferentes etapas del proceso.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tiempo de entrega &lt;em&gt;(Lead time)&lt;/em&gt;: Scrum se enfoca en entregar un incremento completo del producto al final de cada sprint, mientras que Kanban se enfoca en brindar pequeñas mejoras incrementales tan pronto como estén listas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Límites de trabajo en progreso (WIP): Scrum establece límites estrictos sobre la cantidad de trabajo que puede estar en progreso en un momento dado, mientras que Kanban tiene límites WIP más relajados y se enfoca en administrar el flujo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Gestión de cambios &lt;em&gt;(Change management)&lt;/em&gt;: Scrum tiene procesos definidos para introducir cambios en el &lt;em&gt;product backlog&lt;/em&gt;, mientras que Kanban tiene un enfoque más flexible para cambiar y fomenta la mejora continua.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Planificación: Scrum tiene un proceso definido de planificación de sprint, mientras que Kanban no tiene eventos de planificación formales y se enfoca en entregar valor lo antes posible.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Estructura del equipo: Scrum requiere un equipo multifuncional con roles definidos, mientras que Kanban tiene una estructura de equipo más flexible y puede ser utilizado por equipos de cualquier tamaño y composición.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enfoque: Scrum se enfoca en entregar un incremento de producto entregable al final de cada sprint, mientras que Kanban se enfoca en la entrega continua y en mejorar el flujo de valor para los clientes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Releases en producción: Aunque ninguno define en qué momentos se debe desplegar nuevas funcionalidades a ambientes productivos, es común que en Scrum se haga al final de cada sprint, mientras que en Kanban se hace en cualquier momento siempre y cuando la tarea haya llegado al final de su proceso.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Beneficios de Kanban sobre scrum
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Flexibilidad: Kanban es una metodología más flexible, que permite a los equipos adaptarse a los cambios en los requisitos y priorizar las tareas según sea necesario.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Visualización: el tablero visual utilizado en Kanban proporciona una descripción general fácil de entender de los elementos de trabajo y su progreso, lo que facilita la identificación de cuellos de botella y la gestión del flujo de trabajo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mejora continua: Kanban pone un fuerte énfasis en la mejora continua, lo que facilita la identificación de áreas de mejora y la realización de cambios en el proceso según sea necesario.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sin casillas de tiempo &lt;em&gt;(No time boxes)&lt;/em&gt;: Kanban no tiene casillas de tiempo &lt;em&gt;(time boxes)&lt;/em&gt;, por lo que no hay presión para completar una cierta cantidad de trabajo dentro de un marco de tiempo específico.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sin planificación de Sprint: Kanban no tiene eventos formales de planificación de Sprint, lo que lo convierte en un enfoque más ligero que puede ser menos perjudicial para el trabajo del equipo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Menores gastos generales: Kanban tiene menos gastos generales en comparación con Scrum, con menos reuniones, ceremonias y requisitos de documentación.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Riesgo reducido: Kanban reduce el riesgo de desarrollar características que no son necesarias o que no satisfacen las necesidades del cliente, ya que permite una priorización más flexible de los elementos de trabajo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mejor visibilidad: el tablero visual utilizado en Kanban proporciona una mayor visibilidad del progreso de los elementos de trabajo y el estado general del proyecto, lo que facilita que las partes interesadas entiendan lo que está sucediendo y qué esperar.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Beneficios de Scrum sobre Kanban
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Proceso estructurado: Scrum proporciona un proceso estructurado y repetible para entregar valor, que puede ayudar a los equipos a ser más eficientes y consistentes en su trabajo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Roles claros: Scrum define roles claros para los miembros del equipo, lo que ayuda a garantizar que todos conozcan sus responsabilidades y cómo encajan en el proceso general.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cajas de tiempo &lt;em&gt;(Time boxes)&lt;/em&gt;: Scrum utiliza cajas de tiempo (sprints) para enfocar los esfuerzos del equipo y garantizar que el trabajo se complete de manera oportuna.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Planificación de Sprint: Scrum tiene un proceso de planificación de Sprint definido que ayuda al equipo a comprender qué trabajo se necesita y cómo priorizarlo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Revisiones periódicas: Scrum incluye retrospectivas periódicas de sprint que permiten al equipo reflexionar sobre lo que salió bien y lo que se puede mejorar.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Equipos multifuncionales: Scrum requiere equipos multifuncionales, lo que puede conducir a una mayor colaboración, intercambio de conocimientos y una mejor alineación en toda la organización.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Incrementos de productos potencialmente entregables: Scrum se enfoca en entregar un incremento de productos que se pueden entregar al final de cada sprint, lo que ayuda a garantizar que el equipo entregue valor al cliente de manera regular.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mejora continua: Scrum también hace hincapié en la mejora continua, lo que facilita la identificación de áreas de mejora y la realización de cambios en el proceso a lo largo del tiempo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mejor gestión de riesgos: Scrum ayuda a gestionar los riesgos al garantizar que el equipo esté trabajando primero en las tareas más importantes y al permitir que el equipo se adapte a los cambios en los requisitos y prioridades durante cada sprint.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Pensamientos finales
&lt;/h2&gt;

&lt;p&gt;Realmente no existe una metodología ganadora, es importante entender las principales diferencias y beneficios de una metodología sobre la otra, luego tomarse el tiempo necesario para evaluar nuestras necesidades e implementar la metodología que más nos conviene.&lt;/p&gt;

&lt;p&gt;En mi experiencia he trabajado en empresas que tienen ambas metodologías implementadas, y muchas veces utilizan Scrum cuando son proyectos completamente nuevos y Kanban en proyectos que están en modo "mantenimiento".&lt;/p&gt;

&lt;p&gt;Sin embargo, no es una regla que esa deba ser la implementación, como he mencionado, es importante entender las necesidades que tenemos en nuestra empresa, nuestros clientes (internos o externos), nuestras capacidades y recursos con los que contamos.&lt;/p&gt;

</description>
      <category>help</category>
      <category>mobile</category>
      <category>erp</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Los 10 selectores de CSS que debes conocer</title>
      <dc:creator>Fernando Barrios - jfergt</dc:creator>
      <pubDate>Wed, 01 Feb 2023 18:00:39 +0000</pubDate>
      <link>https://dev.to/jfernandogt/los-10-selectores-de-css-que-debes-conocer-39ob</link>
      <guid>https://dev.to/jfernandogt/los-10-selectores-de-css-que-debes-conocer-39ob</guid>
      <description>&lt;p&gt;Los selectores de CSS se utilizan para seleccionar y diseñar elementos HTML en una página web. Son la piedra angular de CSS y son esenciales para crear páginas web dinámicas y visualmente atractivas. Hay numerosos selectores de CSS disponibles, pero los siguientes 10 son los ms utilizados:&lt;/p&gt;

&lt;h2&gt;
  
  
  Selector de elementos
&lt;/h2&gt;

&lt;p&gt;El selector de elementos selecciona elementos en función de su nombre de etiqueta. Por ejemplo, para añadir estilos a todos los elementos h1, usara el siguiente código CSS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;h1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Selector de clase
&lt;/h2&gt;

&lt;p&gt;El selector de clase selecciona elementos en función de su atributo de clase. Las clases se indican con un punto &lt;code&gt;(.)&lt;/code&gt; en el código CSS, seguido del nombre de la clase. Por ejemplo, para añadir estilos a todos los elementos con la clase " &lt;strong&gt;highlight&lt;/strong&gt;", usara el siguiente código CSS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;yellow&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Selector de ID
&lt;/h2&gt;

&lt;p&gt;El selector de ID selecciona elementos en función de su atributo de ID. Los ID se indican con un hash &lt;code&gt;(#)&lt;/code&gt; en el código CSS, seguido del nombre del ID. Los ID son exclusivos de una página y solo se pueden usar una vez. Por ejemplo, para añadir estilos a el elemento con el ID " &lt;strong&gt;header&lt;/strong&gt;", usara el siguiente código CSS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nf"&gt;#header&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;gray&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Selector universal
&lt;/h2&gt;

&lt;p&gt;El selector universal selecciona todos los elementos de una página. Se indica con un asterisco &lt;code&gt;(*)&lt;/code&gt; en el código CSS. Por ejemplo, para añadir estilos a todos los elementos de una página con la fuente "Arial", usara el siguiente código CSS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Arial&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Selector de atributos
&lt;/h2&gt;

&lt;p&gt;El selector de atributos selecciona elementos en función de sus atributos y valores de atributos. Por ejemplo, para añadir estilos a todos los elementos "input" con un atributo " &lt;strong&gt;type&lt;/strong&gt;" igual a " &lt;strong&gt;send&lt;/strong&gt;", usara el siguiente código CSS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"send"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;green&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Selector de hermanos adyacentes
&lt;/h2&gt;

&lt;p&gt;El selector de hermanos adyacentes selecciona un elemento que está directamente después de otro elemento. El selector se indica con un signo ms &lt;code&gt;(+)&lt;/code&gt; en el código CSS. Por ejemplo, para añadir estilos a un elemento de tipo párrafo que esta inmediatamente después de un elemento h2, usara el siguiente código CSS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;h2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;18px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Selector de descendientes
&lt;/h2&gt;

&lt;p&gt;El selector de descendientes (sin importar el nivel de descendencia) selecciona elementos que son descendientes de un elemento especificado. Los descendientes son elementos que están anidados dentro de otro elemento. Por ejemplo, para añadir estilos a todos los elementos de "span" dentro de un párrafo, usara el siguiente código CSS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Selector de niños (child)
&lt;/h2&gt;

&lt;p&gt;El selector de niños (child) selecciona elementos que son descendientes directos de un elemento específico. Los elementos secundarios son elementos que están anidados directamente dentro de otro elemento. Por ejemplo, para añadir estilos solo a los elementos de la lista de primer nivel dentro de una lista desordenada, usara el siguiente código CSS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;ul&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;li&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;lightblue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Selector de pseudoclase
&lt;/h2&gt;

&lt;p&gt;El selector de pseudoclase selecciona elementos en función de su estado o ubicación. Por ejemplo, para añadir estilos a todos los enlaces que han sido visitados, usara el siguiente código CSS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="nd"&gt;:visited&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;purple&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Selector de pseudoelementos
&lt;/h2&gt;

&lt;p&gt;El selector de pseudoelementos selecciona una parte específica de un elemento. Por ejemplo, para aplicar estilo a la primera letra de un párrafo, usara el siguiente código CSS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="nd"&gt;::first-letter&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;36px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En conclusión, estos 10 selectores de CSS son los ms utilizados y forman la base para diseñar páginas web. Comprender y dominar estos selectores es un paso esencial para convertirse en un desarrollador web experto.&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>web3</category>
      <category>crypto</category>
      <category>offers</category>
    </item>
    <item>
      <title>Top 10 de las mejores características de ES6</title>
      <dc:creator>Fernando Barrios - jfergt</dc:creator>
      <pubDate>Sun, 29 Jan 2023 23:24:52 +0000</pubDate>
      <link>https://dev.to/jfernandogt/top-10-de-las-mejores-caracteristicas-de-es6-2kjg</link>
      <guid>https://dev.to/jfernandogt/top-10-de-las-mejores-caracteristicas-de-es6-2kjg</guid>
      <description>&lt;p&gt;ECMAScript 6, también conocido como ECMAScript 2015, fue una actualización importante del lenguaje JavaScript y trajo muchas funciones y mejoras nuevas. Estas diez características son algunas de las adiciones más utilizadas e importantes al lenguaje.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Let y Const: La introducción de variables de ámbito de bloque.
&lt;/h2&gt;

&lt;p&gt;En JavaScript, una variable &lt;code&gt;let&lt;/code&gt; es una variable de ámbito de bloque declarada con la palabra clave &lt;code&gt;let&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;La principal diferencia entre var y let es el ámbito en el que se declaran. Las variables declaradas con &lt;code&gt;var&lt;/code&gt; tienen un ámbito de función, lo que significa que son accesibles dentro de toda la función en la que se declaran. Por otro lado, las variables declaradas con &lt;code&gt;let&lt;/code&gt; tienen alcance de bloque, lo que significa que solo son accesibles dentro del bloque en el que se declaran.&lt;/p&gt;

&lt;p&gt;He aquí un ejemplo para demostrar la diferencia:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;example&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// ReferenceError: x is not defined&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Output: 20&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;example&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este ejemplo, la variable &lt;code&gt;let&lt;/code&gt; &lt;code&gt;x&lt;/code&gt; solo es accesible dentro del bloque en el que se declara (la declaración &lt;code&gt;if&lt;/code&gt;), mientras que la variable &lt;code&gt;var&lt;/code&gt; &lt;code&gt;y&lt;/code&gt; es accesible a lo largo de toda la función. Intentar acceder a &lt;code&gt;x&lt;/code&gt; fuera de su bloque dar como resultado un error de referencia &lt;code&gt;ReferenceError&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Funciones de flechas: sintaxis abreviada para crear funciones.
&lt;/h2&gt;

&lt;p&gt;Las funciones de flecha, también conocidas como &lt;code&gt;fat arrow functions&lt;/code&gt;, son una sintaxis abreviada para definir funciones en JavaScript.&lt;/p&gt;

&lt;p&gt;Las funciones de flecha tienen la siguiente sintaxis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Basic arrow function with one argument and one statement&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;square&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;square&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// Output: 9&lt;/span&gt;

&lt;span class="c1"&gt;// Arrow function with multiple arguments and multiple statements&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;multiply&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;multiply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// Output: 12&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Las funciones de flecha tienen una serie de beneficios, que incluyen:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Sintaxis más corta: las funciones de flecha son más cortas y fáciles de leer en comparación con las expresiones de funciones tradicionales.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Retorno implícito: si una función de flecha tiene una sola expresión, el valor de retorno se devuelve implícitamente. No es necesario incluir la palabra clave de retorno.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lexical &lt;code&gt;this&lt;/code&gt;: las funciones de flecha heredan el valor de &lt;code&gt;this&lt;/code&gt; del contexto que las rodea, lo que las hace ideales para usar en devoluciones de llamada y controladores de eventos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No se pueden usar como constructores: las funciones de flecha no se pueden usar con el operador &lt;code&gt;new&lt;/code&gt; para crear objetos, lo que ayuda a evitar algunos errores comunes.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;En general, las funciones de flecha son una característica poderosa y conveniente de JavaScript y se usan ampliamente en el código moderno.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Template literals: interpolación de cadenas y cadenas multilínea.
&lt;/h2&gt;

&lt;p&gt;Brindan una forma más conveniente de crear cadenas que incluyen contenido dinámico.&lt;/p&gt;

&lt;p&gt;Los literales de plantilla usan acentos graves () en lugar de comillas simples o dobles para definir literales de cadena. Las expresiones se pueden incluir dentro de un literal de plantilla utilizando la sintaxis &lt;strong&gt;${expresion}&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Aquí hay un ejemplo del uso de literales de plantilla:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`Hello, &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;!`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Output: Hello, John!&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;También admiten cadenas de varias líneas, lo que puede ser til para crear cadenas más complejas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;multiLine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`This is a
multiline string.`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;multiLine&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Salida:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;This&lt;/span&gt; &lt;span class="nx"&gt;is&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;
&lt;span class="nx"&gt;multiline&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Desestructuración: extracción de valores de matrices u objetos.
&lt;/h2&gt;

&lt;p&gt;La desestructuración en JavaScript es una función que le permite extraer valores de matrices u objetos y asignarlos a variables. Esto proporciona una forma conveniente y eficiente de desempaquetar valores de matrices y objetos, lo que facilita el trabajo con datos de manera estructurada.&lt;/p&gt;

&lt;p&gt;Aquí hay un ejemplo de desestructuración de una matriz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;first&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;second&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;third&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;first&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;second&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;third&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Output: 1 2 3&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aquí hay un ejemplo de desestructuración de un objeto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;person&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Output: John 30&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La desestructuración también se puede utilizar para extraer valores de matrices y objetos anidados:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;person&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;person&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="na"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;first&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;second&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;third&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;first&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;second&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;third&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Output: John 1 2 3&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Parámetros predeterminados: especificación de valores predeterminados para los parámetros de función.
&lt;/h2&gt;

&lt;p&gt;Los parámetros predeterminados son una característica de JavaScript que le permite especificar valores predeterminados para los parámetros de la función. Si se llama a una función sin un argumento para un parámetro dado, se usar el valor predeterminado en su lugar. Esto puede ser til para proporcionar un comportamiento predeterminado para parámetros opcionales y evitar errores causados por argumentos faltantes.&lt;/p&gt;

&lt;p&gt;Este es un ejemplo del uso de parámetro predeterminados:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Guest&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Hello, &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;!`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Output: Hello, Guest!&lt;/span&gt;
&lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Output: Hello, John!&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En el ejemplo anterior, si se llama a &lt;code&gt;saludar&lt;/code&gt; sin un argumento, se usar el valor predeterminado &lt;strong&gt;'Invitado'&lt;/strong&gt; para el parámetro de &lt;strong&gt;nombre&lt;/strong&gt;. Si se proporciona un argumento, se utilizar en lugar del valor predeterminado.&lt;/p&gt;

&lt;p&gt;Los parámetros predeterminados se pueden usar con cualquier tipo de valor, incluidos números, cadenas, matrices y objetos. También pueden ser expresiones o el resultado de una llamada de función.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;calculateSum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;calculateSum&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// Output: 3&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;calculateSum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// Output: 7&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Los parámetros predeterminados son una característica til en JavaScript, que le permite proporcionar un comportamiento predeterminado para parámetros opcionales y evitar errores causados por argumentos faltantes.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Operadores Rest y Spread: Combinando arrays o separándolos.
&lt;/h2&gt;

&lt;p&gt;El operador &lt;code&gt;rest&lt;/code&gt; y el operador de &lt;code&gt;spread&lt;/code&gt; son dos funciones que se usan para manejar argumentos de una función y manipulación de matrices/objetos.&lt;/p&gt;

&lt;p&gt;El operador &lt;code&gt;rest (...)&lt;/code&gt; le permite representar un número indefinido de argumentos como una matriz. Se usa en declaraciones de funciones para capturar todos los argumentos pasados a la función, excluyendo los parámetros con nombre.&lt;/p&gt;

&lt;p&gt;Aquí hay un ejemplo del uso del operador &lt;code&gt;rest&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;total&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// Output: 10&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En el ejemplo anterior, el operador rest &lt;code&gt;...numbers&lt;/code&gt; recopila todos los argumentos pasados a la función de suma y los asigna a una matriz de números.&lt;/p&gt;

&lt;p&gt;El operador de propagación &lt;code&gt;(...)&lt;/code&gt; le permite distribuir los elementos de una matriz o un objeto en una nueva matriz u objeto. También se puede usar para concatenar arreglos o pasar elementos individuales de un arreglo como argumentos separados a una función.&lt;/p&gt;

&lt;p&gt;Aquí hay un ejemplo del uso del operador de propagación para concatenar matrices:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;array1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;array2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;concatenated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;array1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;array2&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;concatenated&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Output: [1, 2, 3, 4, 5, 6]&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En el ejemplo anterior, el operador de propagación &lt;code&gt;...array1&lt;/code&gt; y &lt;code&gt;...array2&lt;/code&gt; distribuyen los elementos de &lt;code&gt;array1&lt;/code&gt; y &lt;code&gt;array2&lt;/code&gt; en una nueva matriz concatenada.&lt;/p&gt;

&lt;p&gt;Los operadores rest y spread brindan una manera conveniente y concisa de manejar argumentos de funciones y manipulación de matrices/objetos en JavaScript, y se usan ampliamente en el código moderno.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Clases: un azúcar sintáctico para la programación orientada a objetos.
&lt;/h2&gt;

&lt;p&gt;Las clases le permiten definir la estructura de un objeto, incluidas sus propiedades y métodos, y crear varias instancias del mismo objeto con un comportamiento similar.&lt;/p&gt;

&lt;p&gt;Aquí hay un ejemplo del uso de una clase en JavaScript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nf"&gt;sayHello&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Hello, my name is &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;john&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;john&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sayHello&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Output: Hello, my name is John&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;jane&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Jane&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;jane&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sayHello&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Output: Hello, my name is Jane&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En el ejemplo anterior, definimos una clase &lt;code&gt;User&lt;/code&gt; con un método &lt;code&gt;constructor&lt;/code&gt; que establece la propiedad de &lt;code&gt;name&lt;/code&gt; de una instancia y un método &lt;code&gt;sayHello&lt;/code&gt; que genera un mensaje de saludo. Luego creamos dos instancias de la clase &lt;code&gt;User&lt;/code&gt;, &lt;strong&gt;john&lt;/strong&gt; y &lt;strong&gt;jane&lt;/strong&gt; , y llamamos a sus respectivos métodos &lt;code&gt;sayHello&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Las clases en JavaScript también admiten la herencia, lo que le permite crear una nueva clase basada en una clase existente, con la capacidad de sobreescribir o ampliar sus propiedades y métodos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Admin&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nf"&gt;sayHello&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Hello, my name is &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; and I am an &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;admin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Admin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Admin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;administrator&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;admin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sayHello&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Output: Hello, my name is Admin and I am an administrator&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En el ejemplo anterior, definimos una clase &lt;code&gt;Admin&lt;/code&gt; que amplía la clase &lt;code&gt;User&lt;/code&gt; y agrega una propiedad de &lt;code&gt;rol&lt;/code&gt; y una nueva implementación del método &lt;code&gt;sayHello&lt;/code&gt;. Luego creamos una instancia de la clase &lt;code&gt;Admin&lt;/code&gt;, &lt;strong&gt;admin&lt;/strong&gt; , y llamamos a su método &lt;code&gt;sayHello&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Las clases son una función poderosa y flexible en JavaScript, que le permite definir la estructura y el comportamiento de los objetos y admitir la herencia y los patrones de programación orientados a objetos.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Módulos: forma estándar de organizar el código en unidades reutilizables.
&lt;/h2&gt;

&lt;p&gt;Los módulos en JavaScript son una forma de organizar y reutilizar el código encapsulándolo en unidades reutilizables que se pueden importar y usar en otras partes de una aplicación. Un módulo puede contener variables, funciones, clases y otro código, y puede exponer una interfaz al resto de la aplicación que especifica qué partes del módulo son públicas y accesibles para otro código.&lt;/p&gt;

&lt;p&gt;Hay dos formas principales de usar módulos en JavaScript:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Módulos CommonJS (utilizados en Node.js): un módulo en CommonJS se define como un archivo único que exporta uno o más valores y se puede importar a otros archivos en la aplicación. Las exportaciones son accesibles a otros archivos usando la función require. Aquí hay un ejemplo del uso de módulos CommonJS en Node.js:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Módulos ES6 (compatibles con navegadores modernos y con herramientas como Babel): un módulo en ES6 se define como un archivo único que exporta uno o más valores y se puede importar a otros archivos en la aplicación. Las exportaciones son accesibles a otros archivos utilizando las declaraciones de &lt;code&gt;import&lt;/code&gt; y &lt;code&gt;export&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  9. Map and Set: Estructuras de datos mejoradas para almacenar colecciones.
&lt;/h2&gt;

&lt;p&gt;Map: Es una colección de pares clave-valor. Las claves pueden tener cualquier valor (objetos, primitivas) y no tienen que ser únicas. Los valores en un Map se pueden acceder, agregar o modificar usando las claves.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;myMap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Añadiendo pares de clave-valor al mapa&lt;/span&gt;
&lt;span class="nx"&gt;myMap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;myMap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;age&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;myMap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;city&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;New York&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Obteniendo los valores del mapa&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;myMap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// Output: John&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;myMap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;age&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// Output: 30&lt;/span&gt;

&lt;span class="c1"&gt;// Revisando el tamaño del map&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;myMap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Output: 3&lt;/span&gt;

&lt;span class="c1"&gt;// Revisar si existe una clave dentro del mapa&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;myMap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// Output: true&lt;/span&gt;

&lt;span class="c1"&gt;// Eliminando una clave-valor del mapa&lt;/span&gt;
&lt;span class="nx"&gt;myMap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;city&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;myMap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;city&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// Output: false&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set: Es una colección de valores únicos. Los valores pueden ser de cualquier tipo y no tienen que ser del mismo tipo. Le permite almacenar valores únicos en una colección desordenada y proporciona métodos para manipular los valores.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;mySet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Añadiendo valores al Set&lt;/span&gt;
&lt;span class="nx"&gt;mySet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;mySet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;mySet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;mySet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Este valor no se aade debido a que Set no soporta duplicados&lt;/span&gt;

&lt;span class="c1"&gt;// Revisando el tamaño del Set&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mySet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Output: 3&lt;/span&gt;

&lt;span class="c1"&gt;// Revisando si un valor esta presente en el Set&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mySet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// Output: true&lt;/span&gt;

&lt;span class="c1"&gt;// Removiendo un valor del Set&lt;/span&gt;
&lt;span class="nx"&gt;mySet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mySet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// Output: false&lt;/span&gt;

&lt;span class="c1"&gt;// Iterando sobre los valores del Set&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;mySet&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// Output:&lt;/span&gt;
&lt;span class="c1"&gt;// 2&lt;/span&gt;
&lt;span class="c1"&gt;// 3&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  10. Promesas: una mejor manera de manejar el código asíncrono.
&lt;/h2&gt;

&lt;p&gt;Las promesas son objetos en JavaScript que representan la eventual finalización o falla de una operación asincrónica. Proporcionan una manera de manejar los resultados de las operaciones asincrónicas (como las solicitudes de red) de una manera más fácil de leer y mantener.&lt;/p&gt;

&lt;p&gt;Una Promesa puede estar en uno de tres estados:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Pendiente (&lt;em&gt;Pending&lt;/em&gt;): estado inicial, ni cumplida ni rechazada.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cumplido (&lt;em&gt;Fulfilled&lt;/em&gt;): lo que significa que la operación se completó con éxito.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rechazado (Rejected): significa que la operación fall.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Puede adjuntar funciones de devolución de llamada a una Promesa usando el método &lt;code&gt;then&lt;/code&gt; para manejar el cumplimiento y el método &lt;code&gt;catch&lt;/code&gt; para manejar el rechazo.&lt;/p&gt;

&lt;p&gt;Aquí hay un ejemplo del uso de una Promesa en JavaScript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;myPromise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;doSomethingAsynchronously&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Operation failed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;myPromise&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// handle success&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// handle error&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>javascript</category>
      <category>es6</category>
    </item>
    <item>
      <title>3 formas de obtener el Fibonacci de un número en JavaScript</title>
      <dc:creator>Fernando Barrios - jfergt</dc:creator>
      <pubDate>Fri, 08 Apr 2022 06:00:00 +0000</pubDate>
      <link>https://dev.to/jfernandogt/3-formas-de-obtener-el-fibonacci-de-un-numero-en-javascript-1lej</link>
      <guid>https://dev.to/jfernandogt/3-formas-de-obtener-el-fibonacci-de-un-numero-en-javascript-1lej</guid>
      <description>&lt;p&gt;Un número Fibonacci, usualmente con notación &lt;code&gt;f(n)&lt;/code&gt;, es la suma de los dos números fibonacci que le preceden. Esta sucesión empieza con &lt;code&gt;f(0) = 0&lt;/code&gt;, &lt;code&gt;f(1) = 1&lt;/code&gt;, &lt;code&gt;f(2) = f(1) + f(0)&lt;/code&gt; hasta &lt;code&gt;f(x) = f(x-1) + f(x-2)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;En este artículo veremos tres formas diferentes de encontrar un el resultado de aplicar la sucesión a un determinado número.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recursión
&lt;/h2&gt;

&lt;p&gt;Si usamos un sistema de recursión para calcular resultado de fibonacci para determinado número, por ejemplo 5, lo que obtendríamos es algo parecido a esto:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--D5PUWW03--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1649454539633/lgBfCuCOJ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--D5PUWW03--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1649454539633/lgBfCuCOJ.png" alt="Fibonacci Diagrams.drawio.png" width="880" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Algoritmo&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Debemos revisar que el número &lt;code&gt;n&lt;/code&gt; que le estamos pasando a la función es igual o menor que &lt;code&gt;1&lt;/code&gt;, si este es el caso tenemos que devolver &lt;code&gt;n&lt;/code&gt; como el resultado de la función.&lt;/li&gt;
&lt;li&gt;En caso contrario, la función se volverá a llamar a sí misma, pasándose como argumento el cálculo de &lt;code&gt;n-1&lt;/code&gt; y &lt;code&gt;n-2&lt;/code&gt; respectivamente, posteriormente devolverá como su resultado la suma de ambas invocaciones. ​ &lt;strong&gt;Implementación&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Complejidad (Time Complexity)&lt;/strong&gt; No entraré en detalle sobre cómo calcular la complejidad computacional, pero les dejo acá que es: &lt;code&gt;2^n&lt;/code&gt;, por lo que podemos ver que entre más grande sea el número, crece enormemente la cantidad de recurso computacional que necesitamos es enorme.&lt;/p&gt;

&lt;h2&gt;
  
  
  Programación Dinámica Top-Down con memorización
&lt;/h2&gt;

&lt;p&gt;El primer enfoque de programación dinámica que quiero que veamos es de &lt;code&gt;top-down&lt;/code&gt;. La idea aquí es similar al enfoque recursivo, pero la diferencia es que guardaremos las soluciones a los subproblemas que encontremos.&lt;/p&gt;

&lt;p&gt;De esta forma, si nos encontramos con el mismo subproblema más de una vez, podemos usar nuestra solución guardada en lugar de tener que volver a calcularla. Esto nos permite calcular cada subproblema exactamente una vez.&lt;/p&gt;

&lt;p&gt;Esta técnica de programación dinámica se llama memorización. Podemos ver cómo nuestro árbol de subproblemas se reduce cuando usamos la memorización:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RNR5Ic_2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1649454791812/eEso2vf6q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RNR5Ic_2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1649454791812/eEso2vf6q.png" alt="Fibonacci Diagrams.drawio memorización.png" width="613" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Algoritmo&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Debemos revisar que el número &lt;code&gt;n&lt;/code&gt; que le estamos pasando a la función es igual o menor que &lt;code&gt;1&lt;/code&gt;, si este es el caso tenemos que devolver &lt;code&gt;n&lt;/code&gt; como el resultado de la función.&lt;/li&gt;
&lt;li&gt;En caso contrario, revisaremos si el subproblema ya ha sido solucionado con anterioridad, de no ser así, entonces procederemos a realizar el mismo proceso que utilizamos en la recursividad y guardaremos el resultado&lt;/li&gt;
&lt;li&gt;Devolveremos el resultado que hemos guardado, ya sea porque se haya computado por primera vez o por que ya lo hayamos calculado previamente.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Implementación&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var fib = function(n) {
    const map = new Map(); // creamos un mapa para guardar los valores

    const dp = (x) =&amp;gt; {
        if (x &amp;lt;= 1) return x;

        if (!map.has(x)) { // si NO hemos calculado el resultado
            map.set(x, dp(x-1) + dp(x-2)) // lo calculamos y guardamos el valor
        }

        return map.get(x);
    }

    return dp(n);
};

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Complejidad&lt;/strong&gt; Para este escenario la complejidad será de &lt;code&gt;O(n)&lt;/code&gt;, una complejidad mucho menor comparada con la de recursividad.&lt;/p&gt;

&lt;h2&gt;
  
  
  Programación Dinámica Bottom-Up
&lt;/h2&gt;

&lt;p&gt;En el enfoque de programación dinámica Bottom-Up, lo que buscamos es solucionar los subproblemas en un orden diferente, es decir, primero resolvemos &lt;code&gt;f(2)&lt;/code&gt;, luego &lt;code&gt;f(3)&lt;/code&gt;, luego &lt;code&gt;f(4)&lt;/code&gt; y así hasta llegar a &lt;code&gt;f(n)&lt;/code&gt;. De esta forma no tenemos que memorizar nada, puesto que únicamente calcularemos aquellos subproblemas que son necesarios.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Algoritmo&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Tendremos un array donde iremos almacenando los valores de cada subproblema, este lo inicializaremos con los resultados base &lt;code&gt;0, 1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Recorreremos desde la posición 2 hasta llegar a &lt;code&gt;n&lt;/code&gt; (incluyéndola) para añadir la solución de cada subproblema.&lt;/li&gt;
&lt;li&gt;Devolveremos luego nuestro array en la última posición.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Implementación&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var fib = function(n) {
    const sol = [0, 1];

    for (let i = 2; i&amp;lt;= n; i++) {
        sol[i] = sol[i -1] + sol[i - 2];
    }

    return sol[n];
};

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Complejidad&lt;/strong&gt; En este caso la complejidad computacional sigue siendo de &lt;code&gt;O(n)&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus
&lt;/h2&gt;

&lt;p&gt;El cálculo de complejidad no solo se debe considerar a nivel computacional, también a nivel de uso de memoria, por lo que si vemos, por ejemplo, la solución &lt;code&gt;Bottom-Up&lt;/code&gt;, no es óptima puesto que hemos guardado en memoria datos predecesores que no son necesarios.&lt;/p&gt;

&lt;p&gt;Es más fácil visualizarlo si pensamos en que queremos el fibonacci de 10, tendríamos algo como &lt;code&gt;[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]&lt;/code&gt;, pero realmente para tener el fibonacci de &lt;code&gt;10&lt;/code&gt; solo es necesario tener en memoria los últimos 2 valores &lt;code&gt;21&lt;/code&gt; y &lt;code&gt;34&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implementación&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var fib = function(n) {

    if (n &amp;lt;= 1) return n;

    let prev2 = 0;
    let prev1 = 1;
    let c = 0;

    for (let i = 2; i&amp;lt;= n; i++) {
        c = prev1 + prev2;
        prev2 = prev1;
        prev1 = c;
    }

    return c;
};

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusiones
&lt;/h2&gt;

&lt;p&gt;Hemos llegado hasta el final del artículo, déjame saber qué te ha parecido las soluciones, ¿cambiarías algo?, ¿hay algo que no entiendes?&lt;/p&gt;

</description>
      <category>spanish</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>dynamicprogramming</category>
    </item>
    <item>
      <title>4 formas de medir el performance de tu código en JavaScript</title>
      <dc:creator>Fernando Barrios - jfergt</dc:creator>
      <pubDate>Mon, 14 Mar 2022 01:44:39 +0000</pubDate>
      <link>https://dev.to/jfernandogt/4-formas-de-medir-el-performance-de-tu-codigo-en-javascript-490n</link>
      <guid>https://dev.to/jfernandogt/4-formas-de-medir-el-performance-de-tu-codigo-en-javascript-490n</guid>
      <description>&lt;p&gt;Aprender a medir el performance de ciertos piezas de código resulta ser algo sumamente importante cuando hablamos de aplicaciones que empiezan a tener alto tráfico de uso, o son muy grandes. Sin dejar de lado el hecho de que siempre es importante que tengamos estos conceptos para qué nos ayude en nuestra carrera profesional.&lt;/p&gt;

&lt;h2&gt;
  
  
  Usando JSBen.ch
&lt;/h2&gt;

&lt;p&gt;Una de las formas más sencillas y simples es utilizar aplicaciones en línea que nos apoyen con esta tarea, particularmente me encanta &lt;a href="https://jsben.ch/"&gt;JSBen.ch&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;En este sitio podemos añadir &lt;code&gt;n&lt;/code&gt; cantidad de bloques de código, el sitio los ejecutará &lt;code&gt;n&lt;/code&gt; cantidad de veces y dará un resultado sobre qué bloque de código es más eficiente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--I2qIRmq7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1647219810045/szWpmPth5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--I2qIRmq7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1647219810045/szWpmPth5.png" alt="jsbench.png" width="880" height="230"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Acá te dejo un ejemplo de dos funciones que calculan si un número es palíndromo o no, en esta podrás ver cuál es más eficiente y en qué porcentaje, &lt;a href="https://jsben.ch/Ghiid"&gt;jsben.ch/Ghiid&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Utilizando &lt;code&gt;console.time&lt;/code&gt; y &lt;code&gt;console.timeEnd&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;En este caso, deberás de invocar la función &lt;code&gt;console.time&lt;/code&gt; pasándole cómo argumento un &lt;code&gt;string&lt;/code&gt; que es un identificador, el sistema empezará a llevar un tiempo hasta que llames a la función &lt;code&gt;console.timeEnd&lt;/code&gt; usando el mismo identificador.&lt;/p&gt;

&lt;p&gt;Ejemplo&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;isPalindrome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;performance&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;isPalindrome&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;111111111&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;isPalindrome&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;101&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;isPalindrome&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;121&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;timeEnd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;performance&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Salida: performance: 0.048095703125 ms&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Utilizando &lt;code&gt;performance.now&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;El método &lt;code&gt;performance.now()&lt;/code&gt; devuelve un &lt;code&gt;DOMHighResTimeStamp (en-US)&lt;/code&gt;, medido en &lt;strong&gt;milisegundos&lt;/strong&gt;, con una precisión de cinco milésimas de segundo (5 microsegundos).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;isPalindrome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;reverse&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;t0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;isPalindrome&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;111111111&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;isPalindrome&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;101&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;isPalindrome&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;121&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;t1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;La llamada a isPalindrome tardó &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;t0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; milisegundos.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Utilizando la librería de &lt;code&gt;benchmark&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Con esta librería podemos ejecutar pruebas parecidas a la de &lt;code&gt;JSBen.ch&lt;/code&gt; pero directamente en nuestra computadora, veamos un ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Importamos la librería&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Benchmark&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;benchmark&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Creamos una suite de pruebas&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;suite&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Benchmark&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Suite&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;suite&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bloque 1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;isPalindrome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// código de la función 1&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;isPalindrome&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;111111111&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;isPalindrome&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;101&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;isPalindrome&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;121&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bloque 2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;isPalindrome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// código de la función 2&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;isPalindrome&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;111111111&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;isPalindrome&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;101&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;isPalindrome&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;121&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cycle&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;complete&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;El más rápido es &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fastest&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;async&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusiones
&lt;/h2&gt;

&lt;p&gt;Todas las opciones son válidas, sin embargo, recomiendo utilizar más &lt;code&gt;JSBen.ch&lt;/code&gt; o &lt;code&gt;benchmark&lt;/code&gt; puesto que nos dan resultados más exactos ya que corren varias veces las pruebas y realizan estadísticas para dar datos más certeros.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>tips</category>
      <category>performance</category>
    </item>
    <item>
      <title>¿Todo en JavaScript es un objeto?</title>
      <dc:creator>Fernando Barrios - jfergt</dc:creator>
      <pubDate>Tue, 08 Mar 2022 13:54:42 +0000</pubDate>
      <link>https://dev.to/jfernandogt/todo-en-javascript-es-un-objeto-a9i</link>
      <guid>https://dev.to/jfernandogt/todo-en-javascript-es-un-objeto-a9i</guid>
      <description>&lt;p&gt;Hace unos días, un seguidor de &lt;a href="https://laserants.com"&gt;Laserants.com&lt;/a&gt;, hizo la pregunta de si una función era un objeto. Mi respuesta fue en torno a explicar cómo casi todo es un objeto en JavaScript. He acá una clasificación de los &lt;code&gt;types&lt;/code&gt; en JavaScript:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Primitivos (cadena, número, nulo, booleano, indefinido, símbolo)&lt;/strong&gt;: estos son tipos de datos inmutables. No son objetos, no tienen métodos y se almacenan en memoria por valor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No primitivos (funciones, matrices y objetos)&lt;/strong&gt;: estos son tipos de datos mutables. Son objetos y se almacenan en memoria por referencia.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ¿Qué es un objeto?
&lt;/h2&gt;

&lt;p&gt;La clase &lt;code&gt;Object&lt;/code&gt; representa uno de los &lt;strong&gt;tipos de datos&lt;/strong&gt; de JavaScript. Se utiliza para almacenar varias colecciones con clave y entidades más complejas. Podemos decir que en JavaScript, un objeto es un entidad independiente con propiedades y tipos. &lt;/p&gt;

&lt;p&gt;Para crear un objeto podemos hacer algo como esto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;propiedad1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Valor 1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;propiedad2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Valor2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora vamos a añadir una nueva propiedad al objeto&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;propiedad3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Valor 3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Arrays como objetos
&lt;/h2&gt;

&lt;p&gt;Un array es un objeto en JavaScript, y lo podemos demostrar de dos formas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Usando typeof:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Salida: 'object'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Añadiendo más propiedades o claves
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;saludar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hola&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Añadiendo la propiedad saludar al objeto arr.&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Salida: 3&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;saludar&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Salida: hola&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Salida: (3) [1, 2, 3, saludar: ƒ]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Funciones como Objeto
&lt;/h2&gt;

&lt;p&gt;Ahora veamos el caso de un &lt;code&gt;Array&lt;/code&gt; con este ejemplo, primero crearemos una función&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;saludar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hola!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora le añadiremos más propiedades&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;saludar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nombre&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Fernando&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="nx"&gt;saludar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;conNombre&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Hola, &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;!`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Imprimamos unos logs&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;saludar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// Salida: Hola!&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;saludar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Salida: Fernando&lt;/span&gt;
&lt;span class="nx"&gt;saludar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;conNombre&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// Salida: Hola, Fernando!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  String
&lt;/h2&gt;

&lt;p&gt;Existen tipos de datos no-primitivos, que son objetos, y que tienen su alternativa primitiva, entre estos tenemos el &lt;code&gt;String&lt;/code&gt; (nótese la mayúscula en la &lt;strong&gt;S&lt;/strong&gt;). Veamos un ejemplo de como un &lt;code&gt;String&lt;/code&gt; puede ser un objeto&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nombrePrimitivo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Carlos&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nombreNoPrimitivo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Fernando&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Intentando añadir propiedades a ambos objetos&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;nombrePrimitivo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;apellido&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Arias&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;nombreNoPrimitivo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;apellido&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Barrios&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Añadiendo logs&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nombrePrimitivo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Salida: Carlos&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nombrePrimitivo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;apellido&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Salida: undefined&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;nombrePrimitivo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Salida: string&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nombreNoPrimitivo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Salida: String {'Fernando', apellido: 'Barrios**'}&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nombreNoPrimitivo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;apellido&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Salida: 'Barrios'&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;nombreNoPrimitivo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Salida: object&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>spanish</category>
    </item>
    <item>
      <title>¿Qué son los empty-statement en javascript? ¿Existen casos de uso?</title>
      <dc:creator>Fernando Barrios - jfergt</dc:creator>
      <pubDate>Sun, 27 Feb 2022 01:46:38 +0000</pubDate>
      <link>https://dev.to/jfernandogt/que-son-los-empty-statement-en-javascript-existen-casos-de-uso-15df</link>
      <guid>https://dev.to/jfernandogt/que-son-los-empty-statement-en-javascript-existen-casos-de-uso-15df</guid>
      <description>&lt;p&gt;Javascript tiene ciertas peculiaridades que en ciertos momentos resultan ser importantes, o al menos interesantes, de conocer. Puede que los &lt;code&gt;empty-statement&lt;/code&gt; sean de esas peculiaridades de JavaScript que resultan no ser tan necesarias o al menos no con tantos casos de uso.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué es un statement?
&lt;/h2&gt;

&lt;p&gt;una sentencia (statement) es una unidad sintáctica de un lenguaje de programación imperativo que expresa alguna acción a realizar. Podemos decir que son las unidades ejecutable más pequeña de un programa.&lt;/p&gt;

&lt;p&gt;Si tiene una línea de código que dice &lt;code&gt;var x= 10; consola.log(x);&lt;/code&gt; eso es una línea y 2 sentencias.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué son los empty-statement en javascript?
&lt;/h2&gt;

&lt;p&gt;Un &lt;code&gt;empty-statement&lt;/code&gt; o sentencia vacía es usada para no proveer una sentencia, incluso si la sintaxis JavaScript esperase una. En pocas palabras un &lt;code&gt;empty-statement&lt;/code&gt; es un &lt;code&gt;;&lt;/code&gt; (punto y coma).&lt;/p&gt;

&lt;p&gt;Una sentencia vacía no proporciona ninguna declaración aunque JavaScript la espere. La declaración no tiene ningún efecto y no realiza ninguna acción.&lt;/p&gt;

&lt;p&gt;Un ejemplo típico sería crear un bucle for que no tenga cuerpo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var arr = [1, 2, 3];

// Asignar el valor 0 a todos los elementos del array
for (i = 0; i &amp;lt; arr.length; arr[i++] = 0) /* sentencia vacía */ ;

console.log(arr);
// [0, 0, 0]

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Siempre se recomienda añadir un comentario a nuestro código cuando estamos utilizando sentencias vacías de forma intencional.&lt;/p&gt;

&lt;p&gt;Un ejemplo de un uso no intencional (Mozilla Doc):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (condicion); // Esta condición no ejerce ningún control!
   borrarTodo() // Por lo cual esta sentencia será ejecutada siempre!!!

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Algunos ejemplos de uso
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Asigna a 'b' el valor cero si 'a' no es cero.
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var a = 1, b = 1;
if((a == 0) || (b = 0));
console.log(b); // 0

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Cadenas de &lt;code&gt;if-else&lt;/code&gt;, para excluír ciertas condiciones
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const name = "Fernando";

if (name === "Barrios")
    console.log(name);
else if (name === "Fernando")
    console.log(`Hola ${name}`); // Hola Fernando
else if (name === "Juan"); // No se realiza ninguna acción si el nombre pasado es "Juan"
else if (name === "Carlos")
    console.log(`Gusto en verte ${name}`);
else
    console.log("Adiós");

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Para evitar un comportamiento no deseado en &lt;a href="https://developer.mozilla.org/es/docs/Glossary/IIFE"&gt;IIFE&lt;/a&gt;, en algún momento querrá anteponerlo con una declaración vacía
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;;(()=&amp;gt;console.log('hola'))()

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Esperar a que una condición se cumpla
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;while ( !condition );
// haz lo que sucede una vez que se cumple tu condición

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Referencias:
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://dev.to/bhagatparwinder/the-empty-statement-in-javascript-3lg7#:~:text=An%20empty%20statement%20provides%20no,loop%20that%20has%20no%20body.&amp;amp;text=It%20is%20a%20good%20idea,on%20using%20an%20empty%20statement."&gt;The Empty Statement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Statements/Empty"&gt;Empty Statement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/34840628/what-is-the-point-of-using-empty-statement-in-javascript"&gt;What is the point of using empty statement in JavaScript?&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>spanish</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
