<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Cristian Fernando Villca Gutierrez - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Descubre miles de cursos de programación escritos por expertos. Aprende Desarrollo Web, Ciencia de Datos, DevOps, Seguridad y obtén asesoramiento profesional para desarrolladores. ]]>
        </description>
        <link>https://www.freecodecamp.org/espanol/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Cristian Fernando Villca Gutierrez - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/espanol/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Tue, 12 May 2026 20:05:43 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/espanol/news/author/cristian-fernando-villca-gutierrez/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Cómo extraer un objeto de error de una respuesta de la API Blob en JavaScript ]]>
                </title>
                <description>
                    <![CDATA[ Encontré un problema cuando realicé una solicitud GET en mi proyecto de React que se suponía que devolvería un archivo que podía descargar. Para que el archivo se descargara correctamente, tuve que hacer que la respuesta fuera un  blob [https://developer.mozilla.org/es/docs/Web/API/Blob]. Pero si ocurriera un error cuando el servidor devuelve ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-extraer-un-objeto-de-error-de-una-respuesta-de-blob-api-en-javascript/</link>
                <guid isPermaLink="false">668edaf1b99552046f705c08</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Blob ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Web API ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Cristian Fernando Villca Gutierrez ]]>
                </dc:creator>
                <pubDate>Mon, 15 Jul 2024 14:17:14 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/07/React-form-validation--1--1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-extract-an-error-object-from-a-blob/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Extract an Error Object from a Blob API Response in JavaScript</a>
      </p><p>Encontré un problema cuando realicé una solicitud GET en mi proyecto de React que se suponía que devolvería un archivo que podía descargar. Para que el archivo se descargara correctamente, tuve que hacer que la respuesta fuera un <a href="https://developer.mozilla.org/es/docs/Web/API/Blob">blob</a>.</p><p>Pero si ocurriera un error cuando el servidor devuelve un objeto JSON, no podría obtener ese objeto porque ya había definido el tipo de respuesta como un blob. Y si elimino la definición de blob, el archivo simplemente regresará como JSON normal y es posible que no se descargue correctamente.</p><p>Entonces, ¿cómo consigo que el blob lo descargue y recupere el objeto de error en caso de que algo no haya salido bien desde el servidor? Afortunadamente, hay una manera de lograrlo.</p><p>Esta guía te mostrará cómo conservar un objeto JSON para fines de manejo de errores y, al mismo tiempo, podrás descargar un archivo desde un servidor. Usaremos <a href="https://axios-http.com/">Axios</a>, una biblioteca de JavaScript utilizada para realizar solicitudes HTTP, para realizar nuestra llamada API.</p><h1 id="paso-1-definir-el-tipo-de-respuesta-en-la-llamada-api">Paso 1: Definir el tipo de respuesta en la llamada API</h1><p>Primero, define una función que realice la solicitud HTTP al servidor. En este caso, esperamos un archivo, por lo que el verbo HTTP convencional sería GET.</p><p>El tipo de respuesta para las solicitudes de Axios es JSON de forma predeterminada, pero queremos cambiarlo a un blob como este:</p><pre><code class="language-js">import axios from "axios";

const obtenerArchivoDelServidor = () =&gt; {
    const respuesta = await axios.get('https://api.some-server.com', {responseType: 'blob'})?.data;
    return respuesta;
}</code></pre><h1 id="paso-2-convertir-el-blob-a-texto">Paso 2: Convertir el Blob a Texto</h1><p>En el paso anterior, pudimos obtener nuestro archivo como un blob fácilmente. Pero cuando se trata de mostrar el error, necesitamos que se muestre como JSON.</p><p>Primero, necesitamos envolver la solicitud en una declaración <a href="https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Statements/try...catch">try/catch</a> para especificar qué debería suceder si se genera un error mientras se realiza la solicitud.</p><pre><code class="language-js">import axios from "axios";

const obtenerArchivoDelServidor = async () =&gt; {
    try {
        const respuesta = await axios.get('https://api.some-server.com', {responseType: 'blob'}).data;
    return respuesta;
    }
    catch (error) {
        let errorRespuesta = await error.response.data.text();
        const errorObjeto = JSON.parse(response);
        console.log(errorObjeto) // mostramos el error por consola
    }
}</code></pre><p>La conversión de tipo se realizó dentro del bloque <code>catch</code>. Primero, convertimos los datos de respuesta a una cadena JSON usando el método <code>text()</code> de la API Fetch de JavaScript.</p><p>Finalmente, utilizamos el método <code>JSON.parse()</code> para convertir esa cadena a JSON real. De esa manera, podemos acceder al objeto en el formato previsto y al mismo tiempo recuperar el archivo del servidor si no hay ningún error.</p><p>Mostrando el objeto de error en la consola dará como resultado algo como esto:</p><pre><code class="language-js">{
  "statusCode": 400,
  "message": "Algún error ocurrió"
}</code></pre><h1 id="conclusi-n">Conclusión</h1><p>Este es uno de los problemas que enfrenté en la vida real, así que pensé en compartirlo en caso de que alguien más lo encuentre. </p><p>Déjame saber tu opinión sobre el artículo y no dudes en hacer cualquier sugerencia que creas que podría mejorar mi solución. </p><p>¡Gracias por leer!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo usar el operador ternario en JavaScript - Explicado con ejemplos ]]>
                </title>
                <description>
                    <![CDATA[ ¿Estás cansado de sentencias robustas de if-else? El operador ternario de JavaScript ofrece una solución poderosa. Esta herramienta práctica te permite condensar lógica condicional compleja en una sola línea, haciendo que su código sea más limpio, elegante y eficiente. En este artículo, profundizaremos en el operador ternario, comprenderemos su sintaxis ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-usar-el-operador-ternario-en-javascript-explicado-con-ejemplos/</link>
                <guid isPermaLink="false">6668dd2364efda04067206f3</guid>
                
                <dc:creator>
                    <![CDATA[ Cristian Fernando Villca Gutierrez ]]>
                </dc:creator>
                <pubDate>Thu, 04 Jul 2024 07:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/06/ternary-operator-1-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>¿Estás cansado de sentencias robustas de <code>if-else</code>? El operador ternario de JavaScript ofrece una solución poderosa. Esta herramienta práctica te permite condensar lógica condicional compleja en una sola línea, haciendo que su código sea más limpio, elegante y eficiente.</p><p>En este artículo, profundizaremos en el operador ternario, comprenderemos su sintaxis y mostraremos ejemplos del mundo real para ayudarlo a comprender cómo funciona para aprovechar todo su potencial.</p><h1 id="-qu-es-el-operador-ternario">¿Qué es el operador ternario?</h1><p>Un operador ternario es un operador condicional en JavaScript que evalúa una expresión condicional y devuelve un valor verdadero o falso.</p><p>Para entender cómo funciona esto, echemos un vistazo más de cerca a su sintaxis a continuación:</p><pre><code class="language-js">expresionCondicional ? valorVerdadero : valorFalso</code></pre><p>Según la sintaxis anterior, <code>expresionCondicional</code> es la expresión que sirve como punto de evaluación, determinando un valor verdadero o falso.</p><p>Siguiendo el <code>?</code> (signo de interrogación), el valor proporcionado se devuelve en caso de que la expresión se evalúe como verdadera, mientras que el valor que sigue a <code>:</code> (dos puntos) se devuelve si la expresión da como resultado un resultado falso.</p><p><code>valorVerdadero</code> y <code>valorFalso</code> pueden ser cualquier cosa en JavaScript. Puede abarcar varias entidades como funciones, valores almacenados en variables, objetos, números, cadenas y más. El operador ternario le otorga la flexibilidad de devolver cualquier valor deseado, ofreciendo versatilidad en su código.</p><h1 id="-c-mo-usar-el-operador-ternario">¿Cómo usar el operador ternario?</h1><p>Ahora que hemos examinado la sintaxis y su funcionalidad, exploremos cómo utilizar el operador ternario para profundizar nuestra comprensión.</p><p>Considera este escenario: estamos creando una plataforma de juegos que solo permite usuarios mayores de 18 años. Diseñaremos una función para comprobar la edad de un usuario. Si son menores de 18 años, se les negará el acceso; de lo contrario, podrán acceder a la plataforma.</p><pre><code class="language-js">function puedeAccederPlataforma(edad) {
  const deberiaAcceder = edad &gt;= 18 ? true : false;

  return deberiaAcceder;
}</code></pre><p>A partir del fragmento de código anterior, creamos una función, <code>puedeAccederPlataforma</code>, que evalúa si un usuario, representado por su parámetro de edad, cumple con los requisitos para acceder a la plataforma.</p><p>Utiliza un operador ternario para determinar si la edad es 18 años o más, asignando <code>true</code> (verdadero) a la variable <code>deberiaAcceder</code> si se cumple la condición y <code>false</code> (falso) en caso contrario. Finalmente devuelve el valor <code>deberiaAcceder</code>, indicando si el usuario puede acceder a la plataforma o no.</p><p>Si la edad es de 18 años o más, la expresión se vuelve verdadera, por lo que el operador devuelve verdadero después de <code>?</code>. De lo contrario, devuelve falso. Este resultado se guarda en una variable y luego se devuelve desde la función.</p><p>Si bien este caso de uso básico simplifica el código y mejora la legibilidad al reemplazar bloques <code>if-else</code> innecesarios, es importante usarlo con moderación para evitar saturar y complicar el código. Más adelante, analizaremos las mejores prácticas para utilizar el operador ternario.</p><p>Aquí hay otro ejemplo que ilustra el uso del operador ternario. Crearemos una función para determinar si un número es par o impar. Consulte el fragmento de código a continuación:</p><pre><code class="language-js">function verificaParOImpar(numero) {
  const resultado = numero % 2 === 0 ? "par" : "impar";
  return resultado;
}

// Uso:
console.log(verificaParOImpar(4)); // Salida: "par"
console.log(verificaParOImpar(7)); // Salida: "impar"</code></pre><p>Del fragmento de código anterior:</p><ul><li>Definimos una función <code>verificaParOImpar</code> que toma un parámetro numérico.</li><li>Dentro de la función usamos el operador ternario para comprobar si el número es par o impar.</li><li>Si el número módulo 2 es igual a 0 (lo que significa que es divisible por 2 sin resto), entonces la condición se evalúa como verdadera y la cadena "par" se asigna a la variable de <code>resultado</code>.</li><li>Si la condición se evalúa como falsa (lo que significa que el número es impar), se asigna la cadena "impar" al <code>resultado</code>.</li><li>Finalmente, la función devuelve el valor del <code>resultado</code>, que indica si el número es par o impar.</li></ul><p>Este código muestra cómo el operador ternario verifica rápidamente si un número es par o impar, lo que hace que el código sea más fácil de leer y comprender.</p><h1 id="-c-mo-refactorizar-sentencias-if-else-con-el-operador-ternario">¿Cómo refactorizar sentencias <code>if-else</code> con el operador ternario?</h1><p>Una ventaja del operador ternario es evitar bloques <code>if-else</code> innecesarios que pueden complicar la legibilidad y el mantenimiento del código. En esta sección, refactorizaremos algunas declaraciones <code>if-else</code> en operaciones ternarias, brindando una comprensión más clara de cómo usar operadores ternarios de manera efectiva.</p><p>Comencemos con nuestro primer ejemplo:</p><pre><code class="language-js">function decidirActividad(clima) {
  let actividad;

  if (clima === "soleado") {
    actividad = "salir";
  } else {
    actividad = "quedarse en casa";
  }

  console.log(actividad);
}

// Uso
console.log(decidirActividad("lloviendo")); // Salida: "quedarse en casa"
console.log(decidirActividad("nevando")); // Salida: "quedarse en casa"
console.log(decidirActividad("soleado")); // Salida: "salir"</code></pre><p>Esta función, <code>decidirActividad</code> toma un parámetro <code>clima</code> y determina la actividad adecuada en función de las condiciones meteorológicas.</p><p>Si el tiempo es "soleado", sugiere "salir". En caso contrario, aconseja "quedarse en casa". Cuando llamamos a la función con diferentes condiciones climáticas como "lloviendo" o "nevando", genera la recomendación de actividad correspondiente usando <code>console.log()</code>.</p><p>Por ejemplo, llamar a <code>decidirActividad("lloviendo")</code> generará "quedarse en casa". De manera similar, <code>decidirActividad("nevando")</code> también genera "quedarse en casa". Cuando se llama a <code>decidirActividad("soleado")</code>, el resultado es "salir". Esta sencilla función ayuda a decidir actividades en función de las condiciones climáticas proporcionadas.</p><p>Ahora podemos refactorizar estos bloques de código para que parezcan más simples y ordenados. Veamos cómo hacerlo a continuación:</p><pre><code class="language-js">function decidirActividad(clima){
   const actividad = clima === "soleado" ? "salir" ? "quedarse en casa";
   
   console.log(actividad)

}

// Uso
console.log(decidirActividad("lloviendo")); // Salida: "quedarse en casa"
console.log(decidirActividad("nevando")); // Salida: "qeudarse en casa"
console.log(decidirActividad("soleado")); // Salida: "salir"</code></pre><p>Según el ejemplo de código anterior, esta función, <code>decidirActividad</code>, utiliza el operador ternario para determinar rápidamente la actividad según las condiciones climáticas. Comprueba si el tiempo es "soleado" y asigna "salir" si es cierto, en caso contrario "quedarse en casa".</p><p>Hemos simplificado las declaraciones <code>if-else</code> en un operador ternario de una sola línea. Esto hace que nuestro código sea más limpio, claro y fácil de leer.</p><p>Echemos un vistazo a otro ejemplo:</p><pre><code class="language-js">function verificarNumero(numero) {
  let resultado;
  if (numero &gt; 0) {
    resultado = "positivo";
  } else {
    resultado = "no-positivo";
  }
  return resultado;
}

// Uso
console.log(verificarNumero(5)); // Salida: "positivo"
console.log(verificarNumero(-2)); // Salida: "no-positivo"</code></pre><p>Expliquemos qué está haciendo el código anterior:</p><ul><li><strong>Definición de función</strong>: comenzamos definiendo una función llamada <code>verificarNumero</code> que toma un único parámetro llamado <code>numero</code>.</li><li><strong>Declaración de variable</strong>: Dentro de la función, declaramos una variable llamada <code>resultado</code> sin asignarle ningún valor todavía. Esta variable almacenará el resultado de nuestra verificación.</li><li><strong>Declaración condicional (</strong><code><strong>if-else</strong></code><strong>)</strong>: Tenemos una declaración condicional que verifica si el parámetro <code>numero</code> es mayor que 0.</li><li>Si la condición es verdadera (lo que significa que el número es positivo), asignamos la cadena "positivo" a la variable de <code>resultado</code>.</li><li>Si la condición es falsa (lo que significa que el número no es positivo sino que es negativo o cero), asignamos la cadena "no-positivo" a la variable de <code>resultado</code>.</li><li><strong>Declaración de devolución</strong>: finalmente, devolvemos el valor almacenado en la variable de resultado.</li><li><strong>Llamadas a funciones:</strong> luego llamamos a la función <code>verificarNumero</code> dos veces con diferentes argumentos: 5 y -2.</li></ul><p>Cuando llamamos a <code>verificarNumero(5)</code>, la función devuelve "positivo", que luego se registra en la consola.</p><p>De manera similar, cuando llamamos a <code>verificarNumero(-2)</code>, la función devuelve "no-positivo", que nuevamente se registra en la consola.</p><p>Esta función determina de manera eficiente si un número es positivo o no positivo y proporciona el resultado apropiado según la condición.</p><p>Simplifiquemos y mejoremos el código reescribiéndolo usando un operador ternario.</p><pre><code class="language-js">function verificarNumero(numero) {
  const resultado = numero &gt; 0 ? "positivo" : "no-positivo";
  return resultado;
}

// Uso
console.log(verificarNumero(5)); // Salida: "positivo"
console.log(verificarNumero(-2)); // Salida: "no-positivo"</code></pre><p>¡Gran trabajo! Al refactorizar la función y utilizar el operador ternario para la evaluación condicional, logramos un código más limpio, conciso y legible.</p><p>Este código, que utiliza el operador ternario, parece más conciso y elegante. Determina de manera eficiente si un número es positivo o no positivo, lo que hace que el código sea más limpio y fácil de entender. Cuando llamamos a <code>checkNumber(5)</code>, devuelve "positivo", mientras que <code>checkNumber(-2)</code> devuelve "no- positivo". En general, el operador ternario mejora la legibilidad del código.</p><h1 id="-c-mo-anidar-operadores-ternarios">¿Cómo anidar operadores ternarios?</h1><p>Cuando se trata de controles condicionales, a veces una sola condición no es suficiente. En tales casos, utilizamos declaraciones <code>else-if</code> junto con <code>if/else</code> para incorporar múltiples condiciones.</p><p>Echemos un vistazo a la sintaxis:</p><pre><code class="language-js">function funcionEjemplo() {
  return expresionCondicional1
    ? valor1
    : expresionCondicional2
    ? valor2
    : expresionCondicional3
    ? valor3
    : valor4;
}</code></pre><p>Esto se puede traducir en una cadena <code>if/else</code>:</p><pre><code class="language-js">function funcionEjemplo() {
  if (expresionCondicional1) {
    return valor1;
  } else if (expresionCondicional2) {
    return valor2;
  } else if (expresionCondicional3) {
    return valor3;
  } else {
    return valor4;
  }
}</code></pre><p>Exploremos un ejemplo a continuación:</p><pre><code class="language-js">function verificarNumero(numero) {
  let mensaje;

  if (numero &gt; 0) {
    mensaje = "Positivo";
  } else if (numero === 0) {
    mensaje = "Cero";
  } else {
    mensaje = "Negativo";
  }

  return mensaje;
}

// Uso
console.log(verificarNumero(5)); // Salida: "Positivo"
console.log(verificarNumero(0)); // Salida: "Cero"
console.log(verificarNumero(-3)); // Salida: "Negativo"</code></pre><p>Este código anterior define una función llamada <code>verificarNumero</code> que toma un parámetro <code>numero</code> y determina su estado (positivo, cero o negativo). Utiliza un bloque <code>if-else</code> con una declaración <code>else-if</code> para evaluar el valor del número. Si el número es mayor que 0 se considera positivo y si es igual a 0 es cero. De lo contrario, es negativo. La función devuelve el resultado.</p><p>Refactoricemos este código usando un operador ternario para lograr la misma funcionalidad.</p><pre><code class="language-js">function verificarNumero(numero) {
  return numero &gt; 0 ? "Positivo" : numero === 0 ? "Cero" : "Negativo";
}

// Uso
console.log(verificarNumero(5)); // Salida: "Positivo"
console.log(verificarNumero(0)); // Salida: "Cero"
console.log(verificarNumero(-3)); // Salida: "Negativo"</code></pre><p>¡Eso es todo! Hemos refactorizado la función y, tras un examen más detenido, podemos observar que los operadores están encadenados. Ahora, exploremos cómo funciona el operador ternario encadenado en la función <code>verificarNumero</code>.</p><p>En el primer operador ternario:</p><ul><li>La primera condición <code>numero &gt; 0</code> comprueba si el número es mayor que 0.</li><li>Si es verdadero, la expresión devuelve "Positivo".</li></ul><p>En el segundo operador ternario (encadenado):</p><ul><li>Si la primera condición es falsa (lo que significa que el número no es mayor que 0), pasa a la siguiente parte de la expresión: <code>número === 0</code>.</li><li>Esta parte comprueba si el número es igual a 0.</li><li>Si es verdadera, la expresión devuelve "Cero".</li></ul><p>Y el valor predeterminado:</p><ul><li>Si ninguna de las condiciones anteriores es verdadera (lo que significa que el número no es mayor que 0 ni igual a 0), el valor predeterminado es la última parte de la expresión: "Negativo".</li><li>Esta parte actúa como valor predeterminado si no se cumple ninguna de las condiciones anteriores.</li></ul><p>En resumen, el operador ternario encadenado evalúa múltiples condiciones en una sola línea de código. Comprueba cada condición secuencialmente y la primera condición que se evalúa como verdadera determina el resultado de toda la expresión. Esto permite una lógica condicional concisa y eficiente.</p><p>Examinemos otro ejemplo de operador ternario encadenado.</p><pre><code class="language-js">function obtenerBebida(edad) {
  return edad &gt;= 21
    ? "Disfrute su coctel"
    : edad &gt;= 18
    ? "Toma una cerveza"
    : edad &gt;= 16
    ? "Toma un refresco"
    : "Disculpa, tu no puedes beber";
}

// Uso
console.log(obtenerBebida(25)); // Salida: "Disfrute su coctel"
console.log(obtenerBebida(19)); // Salida: "Toma una cerveza"
console.log(obtenerBebida(16)); // Salida: "Toma un refresco"
console.log(obtenerBebida(10)); // Salida: "Disculpa, tu no puedes beber"</code></pre><p>En el ejemplo de código proporcionado, los operadores ternarios están encadenados para proporcionar diferentes sugerencias de bebidas según la edad proporcionada. Cada expresión condicional de la cadena evalúa un rango de edad específico.</p><p>Si la primera condición es verdadera (verdadera), devuelve 'Disfrute su coctel'. Si es falso (falso), pasa a la siguiente expresión condicional, y así sucesivamente. Este proceso de encadenamiento continúa hasta que una condición se evalúa como verdadera. Si ninguna de las condiciones de la cadena es verdadera, el último valor se devuelve como alternativa, similar al bloque "else" en una declaración <code>if/else</code>.</p><p>El concepto de "encadenar" operadores ternarios implica vincular expresiones condicionales en función del valor de la expresión anterior. Esto se puede comparar con la estructura <code>else-if</code> en una declaración <code>if/else</code>, lo que proporciona una forma concisa de manejar múltiples condiciones en JavaScript.</p><h1 id="buenas-pr-cticas-cuando-usamos-el-operador-ternario">Buenas prácticas cuando usamos el operador ternario</h1><p>El uso eficiente del operador ternario puede mejorar significativamente la legibilidad y la concisión del código. En esta sección, exploraremos las mejores prácticas clave para utilizar el operador ternario de manera efectiva.</p><ol><li><strong>Manténlo simple y legible</strong>: escribe expresiones concisas que sean fáciles de entender de un vistazo. Evita anidar demasiados operadores ternarios o escribir condiciones demasiado complejas.</li><li><strong>Úsalo para asignaciones simples</strong>: los operadores ternarios son ideales para asignaciones simples donde solo hay dos resultados posibles según una condición. Para escenarios más complejos, considera usar declaraciones <code>if/else</code>.</li><li><strong>Sepa cuándo usarlo</strong>: usa el operador ternario cuando necesitas realizar una verificación condicional simple y asignar un valor según el resultado. Es particularmente útil para asignar valores predeterminados o determinar el valor de una variable en función de una condición.</li><li><strong>Pruebe minuciosamente</strong>: prueba tu código minuciosamente para asegurarse de que el operador ternario se comporte como se espera en diferentes condiciones. Verifica casos extremos y valida la exactitud de los valores asignados.</li><li><strong>Evite los ternarios anidados</strong>: si bien es posible encadenar ternarios, el anidamiento excesivo puede generar código difícil de leer. Elige claridad y considera usar <code>if/else</code> para condiciones complejas.</li><li><strong>Mantén los ternarios breves</strong>: intenta mantener las expresiones ternarias breves y concisas. Los ternarios largos pueden ser difíciles de leer y comprender, lo que genera desafíos de mantenimiento del código.</li></ol><p>Estas mejores prácticas describen pautas para utilizar eficazmente el operador ternario. Si bien no son reglas estrictas, ofrecen información valiosa para mejorar la claridad y legibilidad de su código.</p><h1 id="conclusi-n">Conclusión </h1><p>Al concluir este artículo, obtendrás una comprensión integral del operador ternario: su aplicación en tareas diarias de codificación, conversión de declaraciones <code>if/else</code>, operadores de encadenamiento y mejores prácticas. Estoy seguro de que has adquirido conocimientos valiosos que mejorarán tus prácticas de codificación utilizando el operador ternario. </p><p>¡Gracias por leer y hasta la próxima!</p><h3 id="contacto-de-informaci-n">Contacto de información </h3><p>¿Quieres ponerte en contacto conmigo? No dudes en comunicarte a través de cualquiera de los siguientes canales:</p><ul><li>Twitter / X: <a href="https://twitter.com/developeraspire">@developeraspire</a></li><li>Email: developeraspire5@gmail.com</li></ul> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ ¿Cómo funcionan los tipos en TypeScript? Explicado con ejemplos en JavaScript y TypeScript ]]>
                </title>
                <description>
                    <![CDATA[ TypeScript es un superconjunto de JavaScript que introduce el tipado estático en JavaScript. La seguridad de tipos mejorada y la capacidad de mantenimiento del código de TypeScript permiten a los desarrolladores escribir código con más confianza. Un aspecto fundamental del sistema de escritura estática de TypeScript es su soporte para ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-funcionan-los-tipos-en-typescript-explicado-con-ejemplos-en-javasscript-y-typescript/</link>
                <guid isPermaLink="false">665256ebcf7e6b03ca05a87d</guid>
                
                    <category>
                        <![CDATA[ typescript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Cristian Fernando Villca Gutierrez ]]>
                </dc:creator>
                <pubDate>Wed, 29 May 2024 19:38:47 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/05/Copy-of-Neon-Green-Bold-Quote-Motivational-Tweet-Instagram-Post-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/basic-typescript-types/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How Types Work in TypeScript – Explained with JavaScript + TypeScript Code</a>
      </p><p>TypeScript es un superconjunto de JavaScript que introduce el tipado estático en JavaScript. La seguridad de tipos mejorada y la capacidad de mantenimiento del código de TypeScript permiten a los desarrolladores escribir código con más confianza.</p><p>Un aspecto fundamental del sistema de escritura estática de TypeScript es su soporte para tipos básicos. Estos proporcionan una base para definir la forma y el comportamiento de los datos dentro de las aplicaciones TypeScript.</p><p>En esta guía completa, exploraremos los tipos básicos de TypeScript comparándolos con sus homólogos de JavaScript. También aclararé las diferencias y ventajas que ofrecen las funciones de escritura estática de TypeScript.</p><p>Puede obtener todo el código JavaScript y TypeScript desde <a href="https://github.com/dotslashbit/fcc-article-resources/tree/main/ts-basic-types">aquí</a>.</p><h2 id="entendiendo-el-tipado">Entendiendo el tipado</h2><p>El tipado en TypeScript implica especificar explícitamente el tipo de datos de las variables, los parámetros de función y los valores de retorno. Esta anotación mejora la claridad del código y permite que la verificación de tipos estáticos de TypeScript detecte errores durante la compilación. Esto mejora la calidad y el mantenimiento del código.</p><p>En TypeScript, las anotaciones de tipo se escriben utilizando dos puntos (<code>:</code>) seguidos del tipo deseado. Exploremos cómo se aplican las anotaciones de tipo en los tipos básicos de TypeScript:</p><h2 id="tipos-b-sicos-javascript-vs-typescript">Tipos Básicos: JavaScript vs TypeScript</h2><h3 id="boolean">Boolean</h3><p>Así es como escribirías un valor booleano en JavaScript:</p><pre><code class="language-js">let estaHecho = false;
console.log("estaHecho:", estaHecho); // Salida: estaHecho = false
if (!estaHecho) {
    console.log("La tarea no ha finalizado");
}</code></pre><p>En JavaScript, una variable booleana <code>estaHecho</code> se declara e inicializa con el valor <code>false</code>. La condición <code>!estaHecho</code> comprueba si <code>estaHecho</code> es <code>false</code> y, si es verdadero, registra un mensaje que indica que la tarea aún no ha finalizado.</p><p>Y así es como declararías un booleano en TypeScript:</p><pre><code class="language-ts">let estaHecho: boolean = false;
console.log("estaHecho :", estaHecho ); // Salida: estaHecho = false
if (!estaHecho ) {
    console.log("La tarea no ha finalizado");
}</code></pre><p>En TypeScript, la misma variable booleana <code>estaHecho</code> se declara con una anotación de tipo explícita: <code>boolean</code> que indica que solo puede contener valores booleanos. El comportamiento y el resultado siguen siendo los mismos que los de JavaScript.</p><h3 id="n-meros">Números</h3><p>Así es como se declara un número en JavaScript:</p><pre><code class="language-js">let contador = 42;
let precioTotal = 24.99;
let cantidad = 10;
console.log("contador:", contador); // Salida: contador: 42
console.log("precioTotal:", precioTotal); // Salida: precioTotal: 24.99
console.log("cantidad:", cantidad); // Salida: cantidad: 10</code></pre><p>En JavaScript, las variables numéricas <code>contador</code>, <code>precioTotal</code> y <code>cantidad</code> se declaran e inicializan con valores numéricos. Cada valor representa un tipo numérico diferente (entero, punto flotante, entero respectivamente).</p><p>Y en TypeScript:</p><pre><code class="language-ts">let contador: number = 42;
let precioTotal: number = 24.99;
let quantity: number = 10;
console.log("contador:", contador); // Salida: contador: 42
console.log("precioTotal:", precioTotal); // Salida: precioTotal: 24.99
console.log("cantidad:", cantidad); // Salida: cantidad: 10</code></pre><p>En TypeScript, el tipado: <code>number</code> se agregan a cada declaración de variable, especificando explícitamente que solo pueden contener valores numéricos. Esto proporciona claridad y seguridad de escritura similar a JavaScript.</p><h3 id="cadenas">Cadenas </h3><p>Así es como se escribe una cadena en JavaScript:</p><pre><code class="language-js">let mensaje = "Hola, JavaScript!";
let primerNombre = "John";
let apellido = "Doe";
console.log("mensaje:", mensaje); // Salida: mensaje: Hola, JavaScript!
console.log("primerNombre:", primerNombre); // Salida: primerNombre: John
console.log("apellido:", apellido); // Salida: apellido: Doe</code></pre><p>En JavaScript, las variables de cadena <code>mensaje</code>, <code>PrimerNombre</code> y <code>apellido</code> se declaran e inicializan con valores de cadena.</p><p>Y así es como se hace en TypeScript:</p><pre><code class="language-ts">let mensaje: string = "Hola, TypeScript!";
let primerNombre: string = "John";
let apellido: string = "Doe";
console.log("mensaje:", mensaje); // Salida: mensaje: Hola, TypeScript!
console.log("primerNombre:", primerNombre); // Salida: primerNombre: John
console.log("apellido:", apellido); // Salida: apellido: Doe</code></pre><p>En TypeScript, el tipado: <code>string</code> se agregan a cada declaración de variable, especificando explícitamente que solo pueden contener valores de cadena. Esto mejora la legibilidad y el mantenimiento del código.</p><h3 id="arreglos">Arreglos</h3><p>Así es como puedes declarar un arreglo en JavaScript:</p><pre><code class="language-js">let numeros = [1, 2, 3, 4, 5];
let frutas = ["manzana", "banana", "naranja"];
console.log("numeros:", numeros); // Salida: numeros: [1, 2, 3, 4, 5]
console.log("frutas:", frutas); // Salida: frutas: ["manzana", "banana", "naranja"]</code></pre><p>En JavaScript, los arreglos de <code>numeros</code> y <code>frutas</code> se declaran e inicializan con valores numéricos y de cadena respectivamente.</p><p>Así es como se hace en TypeScript:</p><pre><code class="language-typescript">let numeros: number[] = [1, 2, 3, 4, 5];
let frutas: string[] = ["manzana", "banana", "naranja"];
console.log("numeros:", numeros); // Salida: numeros: [1, 2, 3, 4, 5]
console.log("frutas:", frutas); // Salida: frutas: ["manzana", "banana", "naranja"]</code></pre><p>En TypeScript, se agregan tipados para declarar arreglos con tipos de elementos específicos (<code>: number[]</code> y <code>: string[]</code>), asegurando que solo se puedan almacenar valores numéricos o de cadena en arreglos de números y frutas, respectivamente.</p><h3 id="tupla">Tupla</h3><p>Así es como escribirías una tupla en TypeScript:</p><pre><code class="language-typescript">let persona: [string, number] = ["John", 30];
console.log("persona:", persona); // Salida: persona: ["John", 30]</code></pre><p>En TypeScript, una tupla <code>persona</code> se declara con una anotación de tipo explícita <code>[string, number]</code>, lo que indica que debe contener una cadena seguida de un número. Almacena el nombre y la edad de una persona.</p><p>Y aquí está la simulación de JavaScript:</p><pre><code class="language-javascript">// JavaScript no tiene soporte nativo para tuplas, pero podemos usar arreglos
let persona = ["John", 30];
console.log("persona:", persona); // Salida: persona: ["John", 30]
</code></pre><p>En JavaScript, dado que las tuplas no son compatibles, los arreglos se utilizan a menudo como solución alternativa para simular un comportamiento similar a una tupla. El arreglo <code>persona</code> almacena el nombre y la edad de una persona, similar al ejemplo de TypeScript.</p><h3 id="enum">Enum</h3><p>Así es como declararías una enumeración en TypeScript:</p><pre><code class="language-typescript">enum Direccion {
    Arriba,
    Abajo,
    Izquierda,
    Derecha
}
let direccion: Direccion = Direccion.Arriba;
console.log("direccion:", direccion); // Salida: direccion: 0</code></pre><p>En TypeScript, una <code>direccion</code> de enumeración se declara con constantes nombradas <code>Arriba</code>, <code>Abajo</code>, <code>Izquierda</code> y <code>Derecha</code>, a las que se les asignan valores numéricos a partir de 0 de forma predeterminada. A la variable de <code>direccion</code> se le asigna el valor <code>Direccion.Arriba</code>.</p><p>Y aquí está la simulación de JavaScript:</p><pre><code class="language-javascript">// JavaScript no soporta de manera nativa los enums, pero podemos usar objetos o constantes
const Direccion = {
    Arriba: 0,
    Abajo: 1,
    Izquierda: 2,
    Derecha: 3
};
let direccion = Direccion.Up;
console.log("direccion:", direccion); // Salida: direccion: 0</code></pre><p>En JavaScript, las enumeraciones no son compatibles de forma nativa, por lo que a menudo se utilizan objetos o constantes para simular un comportamiento similar a una enumeración. Aquí, el objeto <code>Direccion</code> contiene constantes con nombre asignadas a valores numéricos, y a la variable de <code>direccion</code> se le asigna el valor de <code>Direccion.Arriba</code> similar al ejemplo de TypeScript.</p><h2 id="conclusi-n">Conclusión</h2><p>Los tipos básicos de TypeScript brindan ventajas significativas sobre JavaScript tradicional en términos de seguridad, claridad y mantenibilidad de tipos.</p><p>Al introducir tipado explicito y estructuras, como tuplas y enumeraciones, TypeScript permite a los desarrolladores escribir código más sólido y sin errores.</p><p>Comprender las diferencias entre los tipos básicos de JavaScript y TypeScript es esencial para aprovechar todo el potencial de las capacidades de escritura estática de TypeScript en el desarrollo web moderno.</p><p>Si tiene algún comentario, puede enviarme un mensaje de texto en <a href="https://x.com/introvertedbot">Twitter </a>o <a href="https://www.linkedin.com/in/sahil-mahapatra/">LinkedIn</a>.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ JavaScript Fetch API para principiantes: Explicado con ejemplos de código ]]>
                </title>
                <description>
                    <![CDATA[ Fetch API es una función de JavaScript que puede utilizar para enviar una solicitud a cualquier URL de API web y obtener una respuesta. En este artículo, le mostraré cómo realizar solicitudes HTTP a API externas utilizando la API Fetch de JavaScript. Aprenderá a crear solicitudes GET, POST, PUT/PATCH y ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/javascript-fetch-api-para-principiantes/</link>
                <guid isPermaLink="false">66305fb97b1bd304018ef79a</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Cristian Fernando Villca Gutierrez ]]>
                </dc:creator>
                <pubDate>Tue, 07 May 2024 15:52:06 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/04/javascript-fetch-cover-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/javascript-fetch-api-for-beginners/#how-to-send-a-post-request-using-the-fetch-api" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">JavaScript Fetch API For Beginners – Explained With Code Examples</a>
      </p><p>Fetch API es una función de JavaScript que puede utilizar para enviar una solicitud a cualquier URL de API web y obtener una respuesta.</p><p>En este artículo, le mostraré cómo realizar solicitudes HTTP a API externas utilizando la API Fetch de JavaScript. Aprenderá a crear solicitudes GET, POST, PUT/PATCH y DELETE utilizando la API Fetch.</p><p>Para aprovechar al máximo este artículo, debe tener un buen conocimiento de las promesas de JavaScript. Puedes leer mi artículo<a href="https://www.freecodecamp.org/news/javascript-promise-object-explained/"> Promesas en JavaScript</a> si necesitas un repaso.</p><ul><li><a href="#como">Cómo funciona la API Fetch</a></li><li><a href="#get">Cómo enviar una solicitud GET</a></li><li><a href="#post">Cómo enviar una solicitud POST</a></li><li><a href="#put">Cómo enviar una solicitud PUT</a></li><li><a href="#patch">Cómo enviar una solicitud PATCH</a></li><li><a href="#delete">Cómo enviar una solicitud DELETE</a></li><li><a href="#async-await">Cómo usar Async/Await con la API Fetch</a></li><li><a href="#ejemplos">Ejemplos de Código de Ejecución</a></li><li><a href="#resumen">Resumen</a></li></ul><p>¡Comencemos!</p><!--kg-card-begin: html--><h2 id="como">¿Cómo trabaja la API Fetch?</h2><!--kg-card-end: html--><p>Para enviar una petición similar a la de un formulario HTML, solo necesita pasar la URL donde desea enviar los datos como argumento a la función <code>fetch()</code>:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">fetch('&lt;Tu URL&gt;', {})</code></pre><figcaption>Sintaxis de una petición Fetch</figcaption></figure><p>La función <code>fetch()</code> acepta dos parámetros:</p><ol><li>La URL a la que enviar la petición (este es un parámetro obligatorio).</li><li>Las opciones a configurar en la petición. Puede configurar el método de solicitud aquí (este es un parámetro opcional).</li></ol><p>Debajo del capó, la función <code>fetch()</code> devuelve una Promesa, por lo que necesitas agregar los métodos <code>.then()</code> y <code>.catch()</code>.</p><p>Cuando la petición devuelve una respuesta, se llamará al método <code>then()</code>. Si la solicitud devuelve un error, se ejecutará el método <code>catch()</code>:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">fetch('&lt;Tu URL&gt;', {})
  .then(respuesta =&gt; {
    // Manejamos la respuesta de la petición aqui
  })
  .catch(error =&gt; {
    // Si hay un error en la petición, lo manejamos aqui 
  })</code></pre><figcaption>Respuesta de una solicitud Fetch con los métodos then() y catch()</figcaption></figure><p>Dentro de los métodos <code>.then()</code> y <code>.catch()</code>, pasas una función de callback de llamada para ejecutarla cuando se llaman los métodos respectivos.</p><p>El método <code>.catch()</code> se puede omitir en Fetch API. Se usa solo cuando Fetch no puede realizar una solicitud a la API, como por ejemplo si no hay conexión de red o no se encuentra la URL.</p><!--kg-card-begin: html--><h2 id="get">¿Cómo mandar una petición GET usando Fetch API?</h2><!--kg-card-end: html--><p>La petición GET es una solicitud HTTP que se utiliza para solicitar datos específicos de una API cuando así se necesita.</p><p>En el siguiente ejemplo, accederemos a una URL ficticia ubicada en <code>https://jsonplaceholder.typicode.com</code> para solicitar un usuario registrado en el sitio:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">fetch('https://jsonplaceholder.typicode.com/users/1')
  .then(respuesta =&gt; console.log(respuesta))
  .catch(error =&gt; console.log(error));</code></pre><figcaption>Mandamos una petición GET usando Fetch API</figcaption></figure><p>El código anterior dará la siguiente respuesta:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/04/fetch-readable-stream.png" class="kg-image" alt="fetch-readable-stream" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/04/fetch-readable-stream.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2024/04/fetch-readable-stream.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2024/04/fetch-readable-stream.png 1498w" sizes="(min-width: 720px) 720px" width="1498" height="608" loading="lazy"><figcaption>Respuesta de la petición HTTP</figcaption></figure><p>Aquí puede ver que la propiedad del cuerpo contiene un <code>ReadableStream</code>. Para usar <code>ReadableStream</code> en nuestra aplicación JavaScript, necesitamos convertirlo para llamar al método <code>json()</code>:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">fetch('https://jsonplaceholder.typicode.com/users/1')
  .then(respuesta =&gt; respuesta.json())
  .then(datos =&gt; console.log(datos))</code></pre><figcaption>Convertir la respuesta a JSON usando el método json()</figcaption></figure><p>El método <code>json()</code> convierte <code>ReadableStream</code> en un objeto JavaScript. La variable de datos anterior se imprimirá de la siguiente manera:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">{
  "id": 1,
  "name": "Leanne Graham",
  "username": "Bret",
  "email": "Sincere@april.biz",
  "address": {
    "street": "Kulas Light",
    "suite": "Apt. 556",
    "city": "Gwenborough",
    "zipcode": "92998-3874",
    "geo": {
      "lat": "-37.3159",
      "lng": "81.1496"
    }
  },
  "phone": "1-770-736-8031 x56442",
  "website": "hildegard.org",
  "company": {
    "name": "Romaguera-Crona",
    "catchPhrase": "Multi-layered client-server neural-net",
    "bs": "harness real-time e-markets"
  }
}</code></pre><figcaption>La petición regresa un objeto de JavaScript</figcaption></figure><p>Ahora que tiene el objeto de datos, puede utilizar este valor de la forma que desee. Por ejemplo, si desea mostrar el nombre de usuario y el correo electrónico en HTML, así es como lo hace:</p><figure class="kg-card kg-code-card"><pre><code class="language-html">&lt;body&gt;
  &lt;h1 id='nombre-usuario'&gt;Esperando por datos&lt;/h1&gt;
  &lt;h2 id='correo-usuario'&gt;Esperando por datos&lt;/h1&gt;
  &lt;script&gt;
    fetch('https://jsonplaceholder.typicode.com/users/1')
      .then(respuesta =&gt; respuesta.json())
      .then(datos =&gt; {
        document.querySelector('#nombre-usuario').textContent = datos.name
        document.querySelector('#correo-usuario').textContent = datos.email
      })
  &lt;/script&gt;
&lt;/body&gt;</code></pre><figcaption>Mostrnado datos de la petición Fetch en HTML</figcaption></figure><p>En el código anterior, la API Fetch se ejecutará tan pronto como el navegador cargue el documento HTML.</p><p>Después de procesar la respuesta en un objeto de datos, JavaScript cambiará el texto de los elementos <code>&lt;h1&gt;</code> y <code>&lt;h2&gt;</code> anteriores para reflejar el nombre y el correo electrónico del usuario.</p><p>Si ejecuta el código anterior, obtendrá el siguiente resultado:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/04/fetch-get-response.png" class="kg-image" alt="fetch-get-response" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/04/fetch-get-response.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2024/04/fetch-get-response.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2024/04/fetch-get-response.png 1542w" sizes="(min-width: 720px) 720px" width="1542" height="1194" loading="lazy"><figcaption>Salida de la petición Fetch en el navegador</figcaption></figure><p>Y así es como envía una solicitud GET usando Fetch y muestra los datos devueltos en HTML.</p><p>Tenga en cuenta que, según la petición que solicite, una API puede devolver un tipo diferente de datos.</p><p>En este ejemplo, la API typicode devuelve un objeto, pero también puede obtener una matriz cuando solicita más de una unidad de datos.</p><p>Si accede a la URL en <a href="https://jsonplaceholder.typicode.com/users">https://jsonplaceholder.typicode.com/users</a>, verá que la API responde con un arreglo de objetos.</p><p>Necesita conocer el tipo de datos devuelto por la API para manejarlo correctamente.</p><!--kg-card-begin: html--><h2 id="post">¿Cómo mandar peticiones POST usando Fetch API?</h2><!--kg-card-end: html--><p>Si desea enviar una solicitud POST en lugar de una solicitud GET, debe definir el segundo argumento al llamar a la función, que es el objeto de configuración</p><p>Dentro del objeto de configuración, defina una propiedad <code>method</code> de la siguiente manera:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">fetch('https://jsonplaceholder.typicode.com/users', {
  method: 'POST', // Establecemos el método de la petición aqui
})
.then(respuesta =&gt; respuesta.json())
.then(datos =&gt; console.log(datos))</code></pre><figcaption>Configuramos la petición Fetch con el método POST</figcaption></figure><p>Cuando envía un método POST, debe configurar el encabezado de la solicitud y las propiedades del cuerpo para garantizar un proceso fluido.</p><p>Para el encabezado, debe agregar la propiedad <code>Content-Type</code> y configurarla en <code>application/json</code>.</p><p>Los datos que desea enviar deben colocarse dentro de la propiedad `body` en formato JSON. Vea el ejemplo a continuación:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">fetch('https://jsonplaceholder.typicode.com/users', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    nombre: 'Nathan Sebhastian',
    correo: 'ns@mail.com'
  }),
}).then(respuesta =&gt; respuesta.json())
  .then(datos =&gt; console.log(datos))</code></pre><figcaption>Agregamos a la petición la cabecera y el cuerpo&nbsp;</figcaption></figure><p>En el ejemplo anterior, enviamos una solicitud POST para crear un nuevo usuario. En la propiedad del cuerpo, un objeto JavaScript normal se convirtió en una cadena JSON llamando al método <code>JSON.stringify()</code>.</p><p>JSON es uno de los formatos que utilizan las computadoras para comunicarse entre sí en Internet.</p><p>La respuesta de la API de Typicode.com sería similar a la siguiente:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">{
  "nombre": "Nathan Sebhastian",
  "correo": "ns@mail.com",
  "id": 11
}</code></pre><figcaption>Respuesta a la petición POST</figcaption></figure><p>Esto significa que creamos exitosamente un nuevo usuario. Dado que typicode.com es una API falsa, el usuario realmente no será agregado, pero simulará como si lo fuera.</p><!--kg-card-begin: html--><h2 id="put">¿Cómo mandar peticiones PUT?</h2><!--kg-card-end: html--><p>Una solicitud PUT se utiliza para crear un nuevo recurso o actualizar uno existente.</p><p>Por ejemplo, si desea actualizar un nombre de usuario y datos de correo electrónico existentes. Puede utilizar una solicitud PUT para hacerlo:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">fetch('https://jsonplaceholder.typicode.com/users/1', {
  method: 'PUT',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    nombre: 'Nathan Sebhastian',
    correo: 'nathan@mail.com'
  }),
}).then(respuesta =&gt; resporespuestanse.json())
  .then(datos =&gt; console.log(datos))</code></pre><figcaption>Ejemplo de petición PUT usando Fetch API</figcaption></figure><p>La solicitud anterior recibirá la siguiente respuesta:</p><pre><code class="language-js">{
    "name": "Nathan Sebhastian",
    "email": "nathan@mail.com",
    "id": 1
}</code></pre><p>Debido a que ya existen datos de usuario con un <code>id</code> de 1, la solicitud PUT anterior actualiza esos datos.</p><p>A continuación, veamos la solicitud PATCH.</p><!--kg-card-begin: html--><h2 id="patch">¿Cómo mandar una petición PATCH?</h2><!--kg-card-end: html--><p>La solicitud PATCH se envía cuando necesita actualizar una petición existente.</p><p>Por ejemplo, si desea cambiar el <code>nombre</code> y el <code>usuario</code> de un usuario existente.</p><p>A continuación se muestra un ejemplo de cómo enviar una solicitud PATCH a typicode.com:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">fetch('https://jsonplaceholder.typicode.com/users/1', {
  method: 'PATCH',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ 
    nombre: 'Nathan Sebhastian',
    usaurio: 'nsebhastian'
  }),
}).then(respuesta =&gt; respuesta.json())
  .then(datos =&gt; console.log(datos))</code></pre><figcaption>Ejemplo de envio de una petición PATCH con Fetch API</figcaption></figure><p>La solicitud anterior recibirá la siguiente respuesta:</p><pre><code class="language-js">{
    "id": 1,
    "nombre": "Nathan Sebhastian",
    "usuario": "nsebhastian",
    "correo": "Sincere@april.biz",
    // ... the rest of user data
}</code></pre><p>Arriba, puede ver que los valores de las propiedades de <code>nombre</code> y<code>usuario</code> se actualizan utilizando el cuerpo de la solicitud PATCH.</p><!--kg-card-begin: html--><h2 id="delete">¿Cómo mandar una petición DELETE?</h2><!--kg-card-end: html--><p>La solicitud DELETE se utiliza cuando desea solicitar que un recurso se elimine permanentemente del servidor.</p><p>Para ejecutar una solicitud DELETE con Fetch, solo necesita especificar la URL del recurso que desea eliminar y el <code>method: 'DELETE'</code> de la siguiente manera:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">fetch('https://jsonplaceholder.typicode.com/users/1', {
  method: 'DELETE',
}).then(respuesta =&gt; respuesta.json())
  .then(datos =&gt; console.log(datos))</code></pre><figcaption>Ejemplo de petición DELETE usando Fetch</figcaption></figure><p>La solicitud anterior eliminará los datos de un usuario que tenga un <code>id</code>de 1.</p><p>La API podría responder con algún mensaje para confirmar que el recurso se ha eliminado. Pero como typicode.com es una API ficticia, devolverá un objeto JavaScript vacío <code>{}</code>.</p><!--kg-card-begin: html--><h2 id="async-await">¿Cómo utilizar Async/Await con la API Fetch?</h2><!--kg-card-end: html--><p>Dado que Fetch devuelve un objeto <code>Promise</code>, esto significa que también puede usar la sintaxis <code>async/await</code> para reemplazar los métodos <code>.then()</code> y <code>.catch()</code>.</p><p>A continuación se muestra un ejemplo de envío de una solicitud GET usando Fetch en sintaxis async/await:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">try {
  const respuesta = await fetch('https://jsonplaceholder.typicode.com/users/1');
  const json = await respuesta.json();
  console.log(json);
} catch (error) {
  console.log(error);
}</code></pre><figcaption>Usamos async/await para manejar la respuesta Fetch</figcaption></figure><p>Manejar una respuesta Fetch usando <code>async/await</code> parece más limpio porque no es necesario usar las devoluciones de llamada <code>.then()</code> y <code>.catch()</code>.</p><p>Si necesita un repaso sobre async/await, puede leer mi artículo <a href="https://www.freecodecamp.org/news/javascript-async-await/">JavaScript Async/Await</a>.</p><!--kg-card-begin: html--><h2 id="ejemplos">Ejecutando el código de ejemplo</h2><!--kg-card-end: html--><p>También creé un sitio web de ejemplo que le muestra cómo ejecutar estos 5 protocolos de solicitud HTTP en <a href="https://nathansebhastian.github.io/js-fetch-api/">https://nathansebhastian.github.io/js-fetch-api/</a></p><p>Compruébelo y estudie el objeto de datos devuelto. Para saber qué peticiones puede enviar a una API específica, debe consultar la documentación de ese proyecto de API.</p><!--kg-card-begin: html--><h2 id="resumen">Resumen</h2><!--kg-card-end: html--><p>Fetch API le permite acceder a las API y realizar una solicitud de red utilizando métodos de solicitud estándar como GET, POST, PUT, PATCH y DELETE.</p><p>La API Fetch devuelve una promesa, por lo que debe encadenar la llamada a la función con los métodos <code>.then()</code> y <code>.catch()</code>, o usar la sintaxis async/await.</p><p>¡Y así es como funciona la API Fetch! Si te ha gustado este artículo, quizás quieras consultar mi libro <a href="https://www.amazon.com/dp/B0CQXHMF8G?maas=maas_adg_8249349D07643FE6BFD0B487A55E6033_afap_abs&amp;ref_=aa_maas">Beginning Modern JavaScript</a> para mejorar tus habilidades en JavaScript:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/05/beginning-js-cover.png" class="kg-image" alt="beginning-js-cover" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/05/beginning-js-cover.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2024/05/beginning-js-cover.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2024/05/beginning-js-cover.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/2024/05/beginning-js-cover.png 2000w" sizes="(min-width: 720px) 720px" width="2000" height="1667" loading="lazy"></figure><p>El libro está diseñado para ser fácil para principiantes y accesible para cualquiera que quiera aprender JavaScript. Proporciona una guía sencilla paso a paso que le ayudará a comprender cómo utilizar JavaScript para crear una aplicación web dinámica.</p><p>Esta es mi promesa: realmente sentirás que entiendes lo que estás haciendo con JavaScript.</p><p>¡Nos vemos en otros artículos!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ ¿Cómo crear y sincronizar repositorios con Git y GitHub? ]]>
                </title>
                <description>
                    <![CDATA[ > Nota del traductor: Este post contiene muchos videos que sirven para complementar la información del mismo, los videos están en inglés pero es posible verlos con los subtítulos autogenerados que proporciona YouTube. Trabajar con Git y GitHub suele ser una parte esencial de sus tareas diarias de programación. En ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-crear-y-sincronizar-repositorios-con-git-y-github/</link>
                <guid isPermaLink="false">660aeb236e403a04017cd01a</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Cristian Fernando Villca Gutierrez ]]>
                </dc:creator>
                <pubDate>Tue, 23 Apr 2024 01:09:21 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/04/thumbnail-4-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/create-and-sync-git-and-github-repositories/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Create and Sync Git and GitHub Repositories</a>
      </p><blockquote><strong>Nota del traductor: </strong>Este post contiene muchos videos que sirven para complementar la información del mismo, los videos están en inglés pero es posible verlos con los subtítulos autogenerados que proporciona YouTube.</blockquote><p>Trabajar con Git y GitHub suele ser una parte esencial de sus tareas diarias de programación. En muchos casos, necesitarás tanto un repositorio Git local como un repositorio GitHub remoto para un proyecto.</p><ul><li>Con el <strong>repositorio local</strong>, trabajas en tu propia copia del proyecto. Usted realiza y prueba los cambios de forma independiente antes de enviarlos al repositorio remoto para que otros los revisen y combinen.</li><li>El<strong> repositorio remoto</strong> se usa para almacenamiento externo y para compartir el proyecto con otros.</li></ul><p>Este tutorial se divide en 2 escenarios:</p><ul><li><strong>Local primero</strong>: primero crea un repositorio local y envía su código a ese repositorio. Más adelante, creará un repositorio remoto. Con los dos repositorios instalados, querrás mantenerlos sincronizados. Este escenario es común si ha iniciado un proyecto por su cuenta y luego desea compartirlo.</li><li><strong>Remoto primero</strong>: en este escenario, existe un repositorio remoto y desea trabajar con ese código. Utilice ese repositorio remoto para crear su repositorio local para poder realizar y probar cambios localmente. Con los dos repositorios instalados, querrás mantenerlos sincronizados. Este escenario es común si está trabajando en un equipo o en un proyecto de código abierto que tiene un repositorio de GitHub existente.</li></ul><p>Esto es lo que trataremos en este tutorial:</p><ol><li>¿<a href="#significan">Qué significan Git, GitHub y Repositorio?</a></li><li>¿<a href="#instalar">Cómo instalar Git y GitHub</a>?</li><li><a href="#primero">Escenario 1: Primero local</a></li><li><a href="#crear">¿Cómo crear un repositorio local?</a></li><li><a href="#confirmar">¿Cómo confirmar archivos en el repositorio local?</a></li><li><a href="#remoto">¿Cómo crear un repositorio remoto de GitHub?</a></li><li><a href="#conectar">¿Cómo conectar Git y Github?</a></li><li><a href="#sincronizar">¿Cómo sincronizar los repositorios local y remoto?</a></li><li><a href="#escenario-2">Escenario 2: Primero remoto</a></li><li><a href="#clonar">¿Cómo clonar un repositorio</a>?</li><li><a href="#terminando">Terminando</a></li></ol><p>Comencemos con una breve introducción a los términos que estamos usando y luego pasemos a nuestros dos escenarios.</p><!--kg-card-begin: html--><h2 id="significan">¿Qué significan Git, GitHub y repositorio?</h2><!--kg-card-end: html--><p>Un repositorio, o "repo" para abreviar, almacena y rastrea las versiones de los archivos de su proyecto. A medida que realiza cambios en esos archivos, confirma (o copia) esos archivos en el repositorio para su custodia. El repositorio mantiene una lista de todos los cambios confirmados, denominada<strong> historial de confirmaciones </strong>o <strong>commit history</strong> en inglés. </p><p><strong>Git </strong>es un sistema de control de versiones popular y ampliamente utilizado para crear y trabajar con repositorios. Se ejecuta localmente en su computadora. Puedes descargar, instalar y usar Git en cualquier plataforma sin ningún costo ni tarifa. Con Git, creas un repositorio local en la carpeta de trabajo de tu proyecto y Git almacena el <strong>historial de confirmación</strong> de los archivos en esa carpeta.</p><p>Si eres nuevo en Git, considera ver este vídeo como introducción:</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.49999999999999%;" class="fluid-width-video-wrapper">
            <iframe width="200" height="113" src="https://www.youtube.com/embed/hfOeWgWp__E?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" title="Understanding Git (Clip 2): Gentle Introduction to Git and GitHub" name="fitvid0"></iframe>
          </div>
        </div>
      </figure><p><strong>GitHub </strong>es un sitio web que aloja repositorios remotos en Internet. Una cuenta básica de GitHub también es <strong>gratuita</strong>. Utilice GitHub para crear un repositorio remoto para su proyecto. Con un repositorio remoto, puede almacenar su código fuera del sitio, colaborar con otros, trabajar en proyectos de la empresa o de código abierto y mostrar su portafolio a posibles empleadores.</p><p>Si eres nuevo en GitHub, considera ver este vídeo como introducción:</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.49999999999999%;" class="fluid-width-video-wrapper">
            <iframe width="200" height="113" src="https://www.youtube.com/embed/Uf2LLF7UKMw?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" title="Understanding GitHub (Clip 4): Gentle Introduction to Git and GitHub" name="fitvid1"></iframe>
          </div>
        </div>
      </figure><p>Antes de saltar a nuestros escenarios, necesitamos instalar Git y crear una cuenta de GitHub.</p><!--kg-card-begin: html--><h2 div="instalar">¿Cómo instalar Git y GitHub?</h2><!--kg-card-end: html--><p>Si desea trabajar con los ejemplos presentados en este tutorial, existen algunos pasos preparatorios. Pero no dudes en pasar a la siguiente sección si ya tienes estas herramientas instaladas o prefieres leer este artículo sin codificar.</p><p>Primero, instala Git en tu computadora si aún no lo tienes. Para obtener instrucciones paso a paso sobre cómo instalar Git, vea la segunda parte de este video:</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.49999999999999%;" class="fluid-width-video-wrapper">
            <iframe width="200" height="113" src="https://www.youtube.com/embed/Xzy-hSdNGOI?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" title="Installing VS Code and Git (Clip 14): Gentle Introduction to Git and GitHub" name="fitvid2"></iframe>
          </div>
        </div>
      </figure><p>A continuación, cree una cuenta de GitHub, si aún no tiene una. Este video proporciona instrucciones paso a paso sobre cómo crear una cuenta de GitHub:</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.49999999999999%;" class="fluid-width-video-wrapper">
            <iframe width="200" height="113" src="https://www.youtube.com/embed/GrWL62j3gTU?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" title="Creating a GitHub Account (Clip 8): Gentle Introduction to Git and GitHub" name="fitvid3"></iframe>
          </div>
        </div>
      </figure><p>Por último, cree una carpeta de trabajo en su computadora (yo nombré <strong>mis recetas</strong> en mi carpeta de documentos). Luego cree dos archivos de texto simples en esa carpeta: <code>archivo1.txt</code> y <code>archivo2.txt</code>. Aunque estemos usando archivos de texto, el proceso de sincronización cubierto en este artículo es el mismo con cualquier tipo de archivos de código.</p><p>Ahora estamos listos para analizar nuestros dos escenarios: primero el local y primero el remoto.</p><!--kg-card-begin: html--><h2 id="primero">Escenario 1: Primero local</h2><!--kg-card-end: html--><p>Supongamos que desea crear un sitio web de recetas (o tal vez una aplicación) para recopilar y administrar recetas. Crea un repositorio local para poder rastrear fácilmente sus cambios en los archivos del proyecto.</p><p>Más tarde decide que también desea un repositorio remoto para mantener una copia de sus archivos fuera del sitio y compartir el proyecto con otros. Una vez que tenga el repositorio remoto, querrá mantener su repositorio local sincronizado con ese repositorio remoto.</p><p>Este escenario se muestra en la Figura 1:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/04/Figure1-local-repo.png" class="kg-image" alt="Figure1-local-repo" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/04/Figure1-local-repo.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2024/04/Figure1-local-repo.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2024/04/Figure1-local-repo.png 1557w" sizes="(min-width: 720px) 720px" width="1557" height="980" loading="lazy"><figcaption>Figura 1: creando un repositorio local primero.</figcaption></figure><p>Según los números de la Figura 1:</p><ol><li>Primero se crea el repositorio local, representado como un cuadro.</li><li>El repositorio remoto se crea con GitHub algún tiempo después.</li><li>Los dos repositorios se mantienen sincronizados.</li></ol><p>Repasemos estos pasos en detalle.</p><!--kg-card-begin: html--><h2 id="crear">¿Cómo crear un repositorio local?</h2><!--kg-card-end: html--><p>Ya preparamos una carpeta de trabajo y creamos dos archivos que son el comienzo de nuestro proyecto. </p><p>Para crear un <strong>repositorio local</strong> para ese proyecto, abra su terminal o símbolo del sistema y navegue hasta esa carpeta de trabajo. </p><p>Luego inicializa un nuevo repositorio Git usando el siguiente comando:</p><pre><code class="language-git">git init</code></pre><p>Este comando inicializa un nuevo repositorio Git en la carpeta actual. El proceso de inicialización crea una carpeta <code>.git</code> dentro de la carpeta del proyecto que almacena los archivos y datos del repositorio.</p><p>Esta carpeta <code>.git</code> puede estar oculta de forma predeterminada. En el Finder de Mac, use <code>Command + Mayús +.</code> (punto) para que aparezcan carpetas y archivos ocultos. En Windows, use la pestaña Ver del Explorador de archivos y marque Elementos Ocultos para mostrar carpetas y archivos ocultos.</p><p>¡Ahora tenemos un repositorio local! Agreguemos nuestros dos archivos de proyecto en ese repositorio.</p><!--kg-card-begin: html--><h2 id="confirmar">¿Cómo confirmar archivos en el repositorio local?</h2><!--kg-card-end: html--><p>Cada vez que creamos archivos nuevos, cambiamos archivos existentes o eliminamos archivos, enviamos esos cambios a nuestro repositorio local. Esto asegura que el repositorio rastree el estado actual de nuestro proyecto.</p><p>Enviar archivos a un repositorio local requiere dos pasos:</p><ol><li>Stage (Área de preparación)</li><li>Commit (Confirmación)</li></ol><p>Primero, agregue los archivos al área de preparación de Git:</p><pre><code class="language-git">git add .</code></pre><p>Le decimos a Git qué archivos queremos incluir en esa confirmación agregándolos a un área de preparación. La puesta en escena nos permite elegir selectivamente qué cambios incluir en una confirmación.</p><p>Utilizando el <code>.</code> (punto) agrega todos los archivos en la carpeta de trabajo (y sus subcarpetas) al área de preparación. Si solo desea agregar archivos específicos, puede enumerarlos.</p><p>A continuación, confirmamos los archivos preparados en el repositorio local:</p><pre><code>git commit -m "Confirmación inicial"</code></pre><p>Este comando envía los archivos en el área de preparación de Git al repositorio local.</p><p>La opción <code>-m</code> es para un mensaje de confirmación. Siga la <code>-m</code> con el mensaje, entre comillas. Asegúrese de definir un mensaje claro que describa los cambios que está realizando.</p><p>Para obtener más información sobre cómo definir excelentes mensajes de confirmación, vea este video:</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.49999999999999%;" class="fluid-width-video-wrapper">
            <iframe width="200" height="113" src="https://www.youtube.com/embed/9UlmPCMZ4tc?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" title="Creating Great Git Commit Messages (Clip 13): Gentle Introduction to GitHub for Beginners" name="fitvid4"></iframe>
          </div>
        </div>
      </figure><p>Después de estos pasos, el terminal aparece como se muestra a continuación:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/04/Figure2-git-init-1.png" class="kg-image" alt="Figure2-git-init-1" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/04/Figure2-git-init-1.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2024/04/Figure2-git-init-1.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2024/04/Figure2-git-init-1.png 1355w" sizes="(min-width: 720px) 720px" width="1355" height="441" loading="lazy"><figcaption>Figura 2. Creación de un repositorio local, luego preparación y confirmación de los archivos del proyecto.</figcaption></figure><p>El comando <code>init</code> muestra un mensaje de estado que nos indica que creó un repositorio Git vacío.</p><p>El comando <code>add</code> no proporciona ningún resultado.</p><p>El comando <code>commit</code> muestra la rama en la que estamos ( <code>main</code> en este ejemplo), los primeros caracteres de la identificación de la confirmación y el mensaje de confirmación. Luego enumera los archivos modificados. En este ejemplo, se cambiaron 2 archivos y ambos fueron inserciones (archivos nuevos).</p><p>El número después del modo de creación indica el tipo de archivo y los permisos. <code>100644</code> significa que se trata de archivos normales, no carpetas, con permisos de lectura y escritura del propietario.</p><p>Con nuestro repositorio local implementado, es hora de crear nuestro repositorio remoto.</p><!--kg-card-begin: html--><h2 id="remoto">¿Cómo crear un repositorio remoto en GitHub?</h2>
<!--kg-card-end: html--><p>Ahora crearemos un repositorio remoto en GitHub. Vaya al sitio web de GitHub en <a href="https://github.com/">www.github.com</a> e inicie sesión. Si no tiene una cuenta de GitHub, consulte la sección "Cómo instalar Git y GitHub" anteriormente en este tutorial para conocer los pasos para crear una cuenta.</p><p>Mire este video para ver el proceso de creación de un repositorio de GitHub:</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.49999999999999%;" class="fluid-width-video-wrapper">
            <iframe width="200" height="113" src="https://www.youtube.com/embed/QuCdgrYph98?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" title="Initializing a GitHub Repository (Clip 9): Gentle Introduction to Git and GitHub" name="fitvid5"></iframe>
          </div>
        </div>
      </figure><p>Después de iniciar sesión en GitHub, se le dirigirá a su panel personal. Su panel personal de GitHub proporciona información sobre sus repositorios y proyectos.</p><p>Si es la primera vez que creas un repositorio en GitHub, proporciona el botón <code>Crear Repositorio</code> para ayudarte a comenzar. Si ya ha estado usando GitHub, verá un botón <code>Nuevo</code> en su lugar.</p><p>En cualquier caso, al hacer clic en el botón se accede a la página <code>Crear un nuevo repositorio</code>, como se muestra en la Figura 3.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/04/Figure3-create-new-repo.png" class="kg-image" alt="Figure3-create-new-repo" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/04/Figure3-create-new-repo.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2024/04/Figure3-create-new-repo.png 705w" width="705" height="1192" loading="lazy"><figcaption>Figura 3. Cree un nuevo repositorio remoto con GitHub.</figcaption></figure><p>Comience ingresando el nombre del repositorio. El nombre de un repositorio debe ser breve, pero descriptivo de su proyecto. Debe ser único dentro de su cuenta de GitHub. GitHub lo comprueba por ti.</p><p>Las convenciones generales para los nombres de los repositorios sugieren el uso de minúsculas. Si hay varias palabras, utilice guiones entre las palabras, como <code>libro- de-recetas</code>.</p><p>Llamé a mi repositorio de <code>recetas</code>. Y la flecha verde al lado del nombre significa que es único dentro de esta cuenta de GitHub.</p><p>Opcionalmente, puede proporcionar una descripción. Aquí es donde puedes poner más información sobre el repositorio, si lo deseas.</p><p>A continuación, tienes la opción de crear un repositorio público o privado. Si crea un repositorio público, cualquiera en Internet puede verlo. Pero sólo los colaboradores que tú elijas pueden comprometerse con ello. Así que no tienes que preocuparte de que extraños cambien tus archivos. Si crea un repositorio privado, será privado excepto para los colaboradores elegidos.</p><p>Considere hacer públicos sus repositorios para compartir su código con otros, a menos que su código sea propietario.</p><p>Luego tiene la opción de crear un archivo <code>Readme</code> (Léame). Un archivo <code>Readme</code> les da a quienes miran un repositorio una idea de para qué sirve ese repositorio e instrucciones sobre cómo usarlo. Marque la casilla para agregar un archivo <code>Readme</code>.</p><p>Una plantilla <code>.gitignore</code> le ayuda a identificar qué archivos de su carpeta de trabajo no desea incluir en el seguimiento de versiones de Git. Para una aplicación, no desea incluir archivos de compilación intermedios, por ejemplo, ya que suelen ser grandes y pueden reconstruirse fácilmente a partir de archivos fuente. Para este proyecto simple, no necesitamos una plantilla <code>.gitignore</code>.</p><p>Lo siguiente es elegir una licencia. Una licencia permite a otros desarrolladores saber qué pueden hacer con el código de su repositorio. Por ejemplo, si podrían utilizar libremente el código para sus propios proyectos.</p><p>GitHub proporciona un sitio web para ayudarle a tomar una decisión. Haga clic en obtener más información en la opción Elegir una licencia para ir a la documentación de GitHub. En la página de documentación, encontrará un enlace de <code>choosealicense.com</code> para obtener ayuda para seleccionar qué licencia es adecuada para su proyecto.</p><p>Para mi repositorio de recetas, haré que la licencia sea simple y permisiva y elegiré una licencia MIT.</p><p>Cierre la pestaña del navegador de documentación, regrese a la pestaña GitHub y seleccione la licencia deseada de la lista.</p><p>Justo encima del botón <code>Crear Repositorio</code>, GitHub proporciona un resumen para que puedas verificar la acción que estás a punto de realizar. Luego haga clic en <code>Crear Repositorio</code>.</p><p>Crea el repositorio como se muestra en la Figura 4. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/04/Figure4-github-repo.png" class="kg-image" alt="Figure4-github-repo" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/04/Figure4-github-repo.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2024/04/Figure4-github-repo.png 833w" sizes="(min-width: 720px) 720px" width="833" height="677" loading="lazy"><figcaption>Figura 4. Nuestro repositorio remoto de GitHub.</figcaption></figure><p>Como puede ver en la Figura 4, ¡GitHub realizó automáticamente nuestra primera confirmación! Esa confirmación es una instantánea de los dos archivos que le dijimos que agregara al repositorio: nuestro archivo de licencia y el archivo Léame. Estableció un mensaje de confirmación de "compromiso inicial". Y de forma predeterminada, GitHub muestra el contenido de nuestro archivo Léame.</p><p>En este punto, nuestro repositorio local contiene nuestros dos archivos de texto. Y nuestro repositorio remoto contiene nuestra licencia y archivos Léame. Queremos que los dos repositorios coincidan.</p><!--kg-card-begin: html--><h2 id="conectar">¿Cómo conectar Git y Github?</h2><!--kg-card-end: html--><p>Antes de poder sincronizar los repositorios local y remoto, debe establecer una conexión entre ellos. Básicamente, necesita indicarle a su repositorio local dónde encontrar el repositorio remoto. </p><p>Identificamos un repositorio remoto por su URL. En la Figura 4 anterior, observe el botón verde <code>Código</code>. Haga clic en ese botón para ver detalles sobre el repositorio (Figura 5).</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/04/Figure5-repo-link.png" class="kg-image" alt="Figure5-repo-link" width="516" height="476" loading="lazy"><figcaption>Figura 5. Encontrar la URL del repositorio de GitHub.</figcaption></figure><p>Asegúrese de que la pestaña HTTPS esté seleccionada y haga clic en el icono de copiar para copiar la URL de este repositorio de GitHub.</p><p>De vuelta en la ventana de comandos de su máquina local, agregue el repositorio remoto al repositorio local. Luego enumere los controles remotos para confirmar que se creó el control remoto.</p><pre><code class="language-git">git remote add recipes-gh https://github.com/DeborahK/recipes.git
git remote</code></pre><p>El comando <code>remote add</code> agrega el repositorio remoto en la URL proporcionada. Y le permite asignar un alias para ese repositorio para que no tenga que escribir la URL cuando haga referencia al repositorio remoto.</p><p>Un alias común para el repositorio remoto es <code>origin</code>, pero algunos encuentran ese nombre un poco confuso, especialmente si el repositorio remoto no fue el origen del proyecto. En ese caso, a veces uso el nombre del repositorio local con <code>-gh</code> (para GitHub) como apodo del repositorio remoto, para poder recordarlo fácilmente. Pero siéntete libre de usar cualquier nombre.</p><p>El comando <code>remote</code> por sí solo muestra la lista de controles remotos que conoce su repositorio local. Así es como se ve:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/04/Figure6-add-remote.png" class="kg-image" alt="Figure6-add-remote" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/04/Figure6-add-remote.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2024/04/Figure6-add-remote.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2024/04/Figure6-add-remote.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/2024/04/Figure6-add-remote.png 1739w" sizes="(min-width: 720px) 720px" width="1739" height="260" loading="lazy"><figcaption>Figura 6. Estableciendo una conexión con el repositorio remoto.</figcaption></figure><p>Nuestro repositorio Git local ahora sabe dónde encontrar su repositorio remoto asociado. El siguiente paso es sincronizar los repositorios para que coincida su historial de confirmaciones.</p><!--kg-card-begin: html--><h2 id="sincronizar">¿Cómo sincronizar un Repositorio Local con un Repositorio Remoto?</h2><!--kg-card-end: html--><p>Para sincronizar nuestros repositorios local y remoto, primero recuperamos el historial de cambios del repositorio remoto y lo fusionamos en nuestro repositorio local usando el comando <code>pull</code>. Luego enviamos nuestro historial de cambios local al repositorio remoto usando el comando <code>push</code>.</p><p>Si prefieres sincronizar repositorios usando VS Code, mira este video:</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.49999999999999%;" class="fluid-width-video-wrapper">
            <iframe width="200" height="113" src="https://www.youtube.com/embed/5vYPLUMP6dg?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" title="Committing and Syncing Files using VS Code (Clip 16): Gentle Introduction to Git and GitHub" name="fitvid6"></iframe>
          </div>
        </div>
      </figure><p>Para extraer del repositorio remoto y fusionarlo con nuestro repositorio local usando un comando de Git:</p><pre><code class="language-git">git pull recetas-gh main --allow-unrelated-histories

dir		// En Windows
o
ls		// En Mac</code></pre><p>El comando <code>pull</code> requiere el alias del repositorio remoto (<code>recetas-gh</code>) y el nombre de la rama. Como no hemos creado ninguna rama adicional, especificamos la rama principal ( <code>main</code> ).</p><p>La bandera <code>--allow-un related-histories</code> es necesaria la primera vez que extraemos porque queremos fusionar dos repositorios que se crearon por separado y actualmente no comparten un historial relacionado.</p><p>Después de la primera vez, el comando <code>git pull</code> no requiere esa bandera:</p><pre><code class="language-git">git pull recetas-gh main</code></pre><p>En cualquier caso, el comando <code>pull</code> busca la URL apropiada para el repositorio remoto usando el apodo proporcionado ( <code>recetas-gh</code> ).</p><p>Luego recupera el historial de confirmaciones y otros datos de la rama especificada ( <code>main</code> ) del repositorio remoto que no está en esa rama del repositorio local.</p><p>Fusiona esos datos en el repositorio local. Si hay algún conflicto, deberá resolverlo manualmente antes de que Git combine los cambios.</p><p>Por último, actualiza la carpeta de trabajo local con todos los archivos de la confirmación más reciente.</p><p>Usando el comando <code>dir</code> en Windows, o el comando <code>ls</code> en una Mac, vemos que nuestro repositorio local ahora tiene nuestros archivos originales más los archivos de licencia y Léame de nuestro repositorio remoto, como se muestra en la Figura 7.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/04/Figure7-pull.png" class="kg-image" alt="Figure7-pull" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/04/Figure7-pull.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2024/04/Figure7-pull.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2024/04/Figure7-pull.png 1526w" sizes="(min-width: 720px) 720px" width="1526" height="798" loading="lazy"><figcaption>Figura 7. Extrayendo el historial de cambios del repositorio remoto.</figcaption></figure><p>Ahora nuestro repositorio local contiene todo el historial de confirmaciones del repositorio remoto.</p><p>A continuación, enviamos el historial de cambios desde nuestro repositorio local a nuestro repositorio remoto usando el comando <code>push</code>.</p><pre><code class="language-git">git push recetas-gh main</code></pre><p>El comando <code>push</code> requiere el nombre del repositorio remoto ( <code>recetas-gh</code> ) y el nombre de la rama. Como no hemos creado ninguna rama adicional, especificamos la rama principal ( <code>main</code> ).</p><p>Este comando fusiona el historial de cambios local con el repositorio remoto. Si hay algún conflicto, deberá resolverlo manualmente antes de que Git combine los cambios. Consulte la Figura 8 para ver el resultado:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/04/Figure8-push.png" class="kg-image" alt="Figure8-push" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/04/Figure8-push.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2024/04/Figure8-push.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2024/04/Figure8-push.png 1079w" sizes="(min-width: 720px) 720px" width="1079" height="395" loading="lazy"><figcaption>Figura 8. Enviar el historial de cambios local al repositorio remoto.</figcaption></figure><p>Para confirmar que nuestro repositorio remoto incluye todos nuestros archivos, vea el repositorio remoto en GitHub. En la Figura 9, vemos que los archivos de nuestro repositorio local ahora están en nuestro repositorio remoto y ¡nuestros repositorios están sincronizados!</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/04/Figure9-github-repo.png" class="kg-image" alt="Figure9-github-repo" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/04/Figure9-github-repo.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2024/04/Figure9-github-repo.png 936w" sizes="(min-width: 720px) 720px" width="936" height="504" loading="lazy"><figcaption>Figura 9. Nuestro repositorio remoto con los archivos de nuestro repositorio local.</figcaption></figure><p>En resumen, sincronizar sus repositorios local y remoto implica extraer cualquier cambio del repositorio remoto a su repositorio local, resolver conflictos y luego enviar sus cambios locales nuevamente al repositorio remoto.</p><p>Eso es todo para el primer escenario. Creamos un repositorio local a partir de nuestros archivos existentes. Luego creamos un repositorio remoto, configuramos una conexión a ese repositorio remoto y sincronizamos nuestros archivos. Repita los comandos <code>pull</code> y <code>push</code> para sincronizar los repositorios mientras trabaja en su proyecto.</p><!--kg-card-begin: html--><h2 id="escenario-2">Escenario 2: Primero remoto</h2><!--kg-card-end: html--><p>Para nuestro segundo escenario, el repositorio remoto ya existe. Este será el caso si te unes a un equipo que tiene código existente en GitHub. O si quieres trabajar en un proyecto de código abierto. O si encontró algún código en GitHub que le gustaría usar como punto de partida para su proyecto.</p><p>Quiere crear su repositorio local a partir de un repositorio remoto existente. Hay tres formas básicas de obtener código de un repositorio remoto, como se muestra en la Figura 10.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/04/Figure10-remote-first.png" class="kg-image" alt="Figure10-remote-first" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/04/Figure10-remote-first.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2024/04/Figure10-remote-first.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2024/04/Figure10-remote-first.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/2024/04/Figure10-remote-first.png 1920w" sizes="(min-width: 720px) 720px" width="1920" height="1080" loading="lazy"><figcaption>Figura 10. Obtener código de un repositorio remoto.</figcaption></figure><p>En el lado izquierdo de la Figura 10, tenemos un escenario: si posee o tiene derechos de acceso para modificar el repositorio remoto, puede clonar el repositorio remoto para crear su repositorio local. Luego puede sincronizar directamente los cambios entre los dos repositorios.</p><p>El segundo escenario se muestra en el medio de la Figura 10: si no es propietario del repositorio remoto o no tiene derechos de acceso para modificarlo, primero use GitHub para bifurcar el repositorio. Esto crea una copia del repositorio remoto en su cuenta de GitHub. Luego clona tu copia para crear tu repositorio local.</p><p>Este será el caso si estás trabajando en un proyecto de código abierto o quieres usar el código en el repositorio de otra persona como punto de partida para tu proyecto.</p><p>El tercer escenario se muestra a la derecha de la Figura 10; también existe la opción de descargar un archivo zip del código en el repositorio. Esto no crea un repositorio local. Utilice esta opción si desea ver el código de un repositorio de GitHub, pero no planea realizar un seguimiento de los cambios.</p><p>Para configurar el ejemplo de este escenario, necesita un repositorio remoto que actualmente no tenga un repositorio local asociado. Puede utilizar el repositorio remoto de <code>recetas</code> que ya creó en el primer escenario. Si prefieres utilizar el repositorio de otra persona para este ejemplo, asegúrate de bifurcarlo primero.</p><p>Una vez que tenga un repositorio remoto, asegúrese de que no haya ningún repositorio local asociado a él. Si está utilizando el repositorio remoto de <code>recetas</code>, elimine la carpeta de <code>recetas</code> de su sistema local. Eso elimina su repositorio local.</p><p>Ahora está listo para crear un nuevo repositorio local desde su repositorio remoto en GitHub.</p><!--kg-card-begin: html--><h2 id="clonar">¿Cómo clonar un repositorio?</h2><!--kg-card-end: html--><p>Para crear un repositorio local desde un repositorio remoto en GitHub, use el comando <code>clone</code>.</p><p>Si prefieres clonar un repositorio usando la aplicación GitHub Desktop, mira este video:</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.49999999999999%;" class="fluid-width-video-wrapper">
            <iframe width="200" height="113" src="https://www.youtube.com/embed/GpqIr0y2rvc?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" title="Using GitHub Desktop to Clone a Repository (Clip 11): Gentle Introduction to Git and GitHub" name="fitvid7"></iframe>
          </div>
        </div>
      </figure><p>Para clonar usando un comando de Git, primero necesitamos la URL del repositorio remoto.</p><p>Navegue a GitHub, inicie sesión y verá su panel personal. Localice el repositorio que desea clonar. Haga clic en el botón verde <code>Código</code> para ver los detalles sobre el repositorio como se muestra anteriormente en la Figura 5. Haga clic en el botón copiar al lado de la URL para copiarlo.</p><p>A continuación, abra su terminal o símbolo del sistema en su computadora. Navegue hasta la carpeta donde desea crear la carpeta de trabajo del proyecto. Navegaré a mi carpeta de <code>documentos</code>.</p><p>Entonces estamos listos para clonar ese repositorio:</p><pre><code class="language-git">git clone https://github.com/DeborahK/recetas.git</code></pre><p>El comando <code>clone</code> requiere la URL del repositorio remoto. Acabamos de copiar esa URL de GitHub, así que péguela como parte de este comando.</p><p>Cuando se ejecuta el comando, primero crea la carpeta de trabajo para el repositorio utilizando el nombre del repositorio remoto de la URL, que son <code>recetas</code> en este ejemplo. Luego copia el historial de confirmaciones del repositorio remoto en la URL proporcionada.</p><p>El proceso de clonación también vincula automáticamente el nuevo repositorio local con su repositorio remoto. Y asigna al repositorio remoto un alias de <code>origen</code>. Luego podemos hacer referencia al repositorio remoto usando ese alias en lugar de su URL.</p><p>Por último, el proceso de clonación copia todos los archivos de la confirmación más reciente a la carpeta de trabajo local. Luego puede agregar, editar o eliminar archivos en esa carpeta de trabajo mientras trabaja localmente en el proyecto.</p><p>Navegue hacia abajo hasta la carpeta de nuevas <code>recetas</code>. Luego use el comando remoto para ver el repositorio remoto vinculado. Y como se muestra en la Figura 11, efectivamente tiene el alias <code>origen</code>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/04/Figure11-git-clone.png" class="kg-image" alt="Figure11-git-clone" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/04/Figure11-git-clone.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2024/04/Figure11-git-clone.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2024/04/Figure11-git-clone.png 1348w" sizes="(min-width: 720px) 720px" width="1348" height="506" loading="lazy"><figcaption>Figura 11. Clonación de un repositorio.</figcaption></figure><p>Observe el resultado de la operación de clonación en la Figura 11. Git enumera (o encuentra) 10 objetos. Sólo tenemos cuatro archivos en el repositorio remoto de <code>recetas</code>. Entonces, ¿por qué encuentra 10 objetos? Esto se debe a que el proceso de clonación copia todo el historial de confirmaciones, no solo los archivos.</p><p>Utilice el comando <code>rev-list</code> con las banderas <code>--objects</code> y <code>--all</code> para ver la lista de objetos.</p><pre><code class="language-git">git rev-list --objects --all</code></pre><p>La Figura 12 muestra el resultado de ese comando:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/04/Figure12-git-rev-list.png" class="kg-image" alt="Figure12-git-rev-list" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/04/Figure12-git-rev-list.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2024/04/Figure12-git-rev-list.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2024/04/Figure12-git-rev-list.png 1114w" sizes="(min-width: 720px) 720px" width="1114" height="442" loading="lazy"><figcaption>Figura 12. Lista de objetos en el repositorio.</figcaption></figure><p>Cada uno de los objetos anteriores se muestra como un identificador SHA o algoritmo hash seguro. El SHA se utiliza como identificación para identificar de forma única los objetos en nuestro repositorio.</p><p>Los primeros tres objetos de esta lista (objetos 1 a 3) son las tres confirmaciones realizadas en este repositorio. Al observar la lista de confirmaciones en GitHub (Figura 13), cada confirmación muestra los primeros caracteres de su SHA. Estos coinciden con los primeros tres objetos:</p><ul><li>La fusión se confirma cuando fusionamos los dos repositorios. </li><li>El commit inicial que GitHub realizó en el repositorio remoto creando los archivos <code>LICENCIA</code> y <code>README.md</code>. </li><li>El commit inicial que realizamos en el repositorio local confirmando <code>file1.txt</code> y <code>file2.txt</code>.</li></ul><p>Los objetos del medio en la lista que se muestra en la Figura 12 (objetos 5-8) son los cuatro archivos comprometidos.</p><p>Los tres objetos restantes (objetos 4, 9, 10) son objetos de árbol. Un objeto de árbol representa el estado de una carpeta, incluidos los archivos y subcarpetas de esa carpeta. Mantiene la jerarquía de la carpeta.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/04/Figure13-commit-history.png" class="kg-image" alt="Figure13-commit-history" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/04/Figure13-commit-history.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2024/04/Figure13-commit-history.png 910w" sizes="(min-width: 720px) 720px" width="910" height="660" loading="lazy"><figcaption>Figura 13. Historial de confirmaciones, cada uno identificado por los primeros valores de SHA.</figcaption></figure><p>Usando el comando <code>dir</code> en Windows o el comando <code>ls</code> en Mac, vemos que nuestra carpeta de trabajo ahora contiene todos los archivos de nuestro repositorio remoto.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/04/Figure14-working-folder.png" class="kg-image" alt="Figure14-working-folder" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/04/Figure14-working-folder.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2024/04/Figure14-working-folder.png 997w" sizes="(min-width: 720px) 720px" width="997" height="530" loading="lazy"><figcaption>Figura 14. Un directorio de los archivos en nuestra carpeta de trabajo.</figcaption></figure><p>Ahora que hemos clonado el repositorio, nuestros repositorios local y remoto coinciden. Para mantenerlos sincronizados, utilizamos <code>pull</code> y <code>push</code> como vimos en la sección "Cómo sincronizar repositorios locales y remotos" anteriormente en este artículo.</p><p>Tenga en cuenta que si está trabajando con un repositorio remoto que no es de su propiedad, es posible que no tenga acceso para enviar sus cambios directamente al repositorio. En su lugar, deberás emitir un <code>Pull Request</code>.</p><p>Un <code>Pull Request</code>, o PR, les dice a los propietarios u otros contribuyentes que usted ha enviado cambios y que está solicitando que esos cambios se revisen y extraigan, o se fusionen, en el repositorio remoto.</p><p>Vea este vídeo para obtener más información sobre los <code>Pull Request</code>:</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.49999999999999%;" class="fluid-width-video-wrapper">
            <iframe width="200" height="113" src="https://www.youtube.com/embed/y_A8O3cpDyM?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" title="Pull Requests and Merging Branches in GitHub (Clip 18): Gentle Introduction to Git and GitHub" name="fitvid8"></iframe>
          </div>
        </div>
      </figure><h1 id="terminando">Terminando</h1><p>En el primer escenario, teníamos código existente y creamos un repositorio local a partir de ese código. Luego creamos un repositorio remoto para mantener una copia de los archivos fuera del sitio y compartir el proyecto con otros.</p><p>En el segundo escenario, teníamos un repositorio remoto existente creado en GitHub por nuestro equipo o por un colaborador de código abierto. Luego clonamos ese repositorio para crear nuestro repositorio local. De esa manera, podemos trabajar en nuestra propia copia del proyecto y realizar y probar cambios de forma independiente antes de enviar esos cambios al repositorio remoto para que otros los revisen y fusionen.</p><p>Ya sea que cree primero su repositorio local o primero su repositorio remoto de GitHub, una vez que tenga ambos repositorios en su lugar, puede mantenerlos sincronizados con los comandos <code>pull</code> y <code>push</code> de Git. O enviando solicitudes de extracción o relaciones públicas.</p><p>Para obtener más detalles sobre cómo aprender Git y GitHub, consulte este curso:</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.49999999999999%;" class="fluid-width-video-wrapper">
            <iframe width="200" height="113" src="https://www.youtube.com/embed/pICJdbC7j0Q?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" title="Introduction to Git and GitHub (Clip 1): Gentle Introduction to Git and GitHub" name="fitvid9"></iframe>
          </div>
        </div>
      </figure><p>Obtener una comprensión sólida de los repositorios locales y remotos, y cómo mantenerlos sincronizados, es esencial cuando se trabaja en su propio código. Es aún más importante cuando se trabaja en un equipo o en un proyecto de código abierto.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo utilizar la API React context en tus proyectos ]]>
                </title>
                <description>
                    <![CDATA[ La gestión del estado es una parte esencial del desarrollo de aplicaciones en React. Una forma común de gestionar el estado es pasando props. Pasar props significa enviar datos de un componente a otro. Es una buena manera de asegurarse de que los datos lleguen al lugar correcto en una ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-usar-context-api-de-react-en-tus-proyectos/</link>
                <guid isPermaLink="false">65c5b8a185c7c103ecb57c94</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Cristian Fernando Villca Gutierrez ]]>
                </dc:creator>
                <pubDate>Fri, 29 Mar 2024 00:06:40 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/02/context-api-cover-main-1.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/context-api-in-react/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Use the React Context API in Your Projects</a>
      </p><p>La gestión del estado es una parte esencial del desarrollo de aplicaciones en React. Una forma común de gestionar el estado es pasando props. Pasar props significa enviar datos de un componente a otro. Es una buena manera de asegurarse de que los datos lleguen al lugar correcto en una aplicación React.</p><p>Pero puede resultar molesto pasar props cuando tienes que enviar los mismos datos a muchos componentes o cuando los componentes están muy lejos unos de otros. Esto puede hacer que una aplicación sea más lenta y más difícil de trabajar.</p><p>Afortunadamente, React proporciona una función incorporada conocida como Context API que ayuda a "teletransportar" datos a los componentes que los necesitan sin pasar props.</p><p>En este artículo, exploraremos cómo funciona Context API y cómo usarla de manera efectiva en sus aplicaciones React.</p><h2 id="el-problema-al-pasar-props">El problema al pasar props</h2><p>En React, <strong>pasar props es un concepto fundamental</strong> que permite que un componente principal comparta datos con sus componentes secundarios, así como con otros componentes dentro de una aplicación.</p><p>En muchos casos, pasar props puede ser una forma eficaz de compartir datos entre diferentes componentes de su aplicación. Pero pasar props a lo largo de una cadena de múltiples componentes para llegar a un componente específico puede hacer que su código sea demasiado engorroso.<br></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2023/03/image-198.png" class="kg-image" alt="image-198" width="600" height="400" loading="lazy"><figcaption>Pasando props de un componente padre a un componente hijo</figcaption></figure><p><br>Según el diagrama anterior, para pasar datos al componente "Hijo B", debemos pasarlos a través de todos los componentes intermedios, incluso si esos componentes en realidad no usan los datos por sí mismos. Esto es lo que se conoce como "<em>prop drilling</em>".</p><p>El <em>prop drilling</em> puede hacer que tu código sea más difícil de leer y mantener, y también puede dificultar la refactorización de tus componentes más adelante.</p><p>Aquí es donde entra en juego Context API. Con Context API, puede almacenar datos en el nivel superior del árbol de componentes y ponerlos a disposición de todos los demás componentes que los necesiten sin pasar props.</p><h2 id="-c-mo-funciona-context-api">¿Cómo funciona Context API?</h2><p>Context API permite pasar datos a través de un árbol de componentes sin tener que pasar props manualmente en cada nivel. Esto facilita el intercambio de datos entre componentes.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/02/image-197.png" class="kg-image" alt="image-197" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/02/image-197.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2024/02/image-197.png 623w" width="623" height="359" loading="lazy"><figcaption>Funcionamiento de Context API</figcaption></figure><p>Por ejemplo, digamos que tiene una aplicación de compras con un componente que muestra el carrito de compras de un usuario y otro componente que muestra el historial de pedidos del usuario.</p><p>Con Context API, puede crear un "contexto" que contenga la información de compras del usuario, como su carrito y su historial de pedidos. Luego, puede usar ese contexto tanto en el carrito de compras como en el componente del historial de pedidos, sin tener que pasar la información a través de props.</p><p>Es como tener una caja grande que contiene todo lo que necesitas para tu viaje de compras. Puedes sacar cosas de la caja cuando las necesites y volver a guardarlas cuando hayas terminado.</p><p>Básicamente, Context API consta de dos componentes principales: <strong>el proveedor de contexto y el consumidor de contexto</strong>. El proveedor es responsable de crear y gestionar el contexto que contiene los datos que se compartirán entre los componentes. Por otro lado, el consumidor se utiliza para acceder al contexto y sus datos desde dentro de un componente.</p><p>En el ejemplo dado, el proveedor creará el contexto que contiene la información de compras del usuario, mientras que los componentes del consumidor (carrito de compras e historial de pedidos) accederán a ese contexto para recuperar los datos que necesitan. Esto evita la necesidad de transmitir la información a través de props, lo que hace que su código sea más eficiente y más fácil de administrar.</p><h2 id="-c-mo-empezar-a-usar-context-api">¿Cómo empezar a usar context API?</h2><p>Para comenzar a utilizar Context API en sus aplicaciones, deberá seguir unos sencillos pasos:</p><h2 id="crear-un-objeto-de-contexto">Crear un objeto de contexto </h2><p>Primero, necesita crear un objeto de contexto usando la función <code>createContext</code> que viene de manera nativa en React. Este objeto de contexto contendrá los datos que desea compartir en su aplicación.</p><p>Cree un nuevo archivo llamado <code>MiContexto.js</code> en la carpeta <code>src</code> y agregue el siguiente código para crear un objeto de contexto:</p><pre><code class="language-js">import { createContext } from 'react';

export const MiContexto = createContext("");</code></pre><p><br>En el código anterior, importamos <code>createContext</code> desde React y lo usamos para crear un nuevo objeto de contexto llamado "MiContexto". Luego, exportamos el objeto de contexto para poder usarlo en otras partes de nuestra aplicación.</p><h2 id="envolver-componentes-con-un-proveedor">Envolver componentes con un Proveedor</h2><p>Una vez que haya creado un objeto de contexto, debe envolver los componentes que necesitan acceso a los datos compartidos con un componente de proveedor. El componente Proveedor acepta una propiedad <code>value</code> que contiene los datos compartidos, y cualquier componente que sea hijo del componente Proveedor puede acceder a esos datos compartidos.</p><p>Es importante tener en cuenta que el componente Proveedor debe incluirse alrededor del componente de nivel superior en una aplicación para garantizar que todos los componentes secundarios tengan acceso a los datos compartidos.</p><p>A continuación se muestra un ejemplo que demuestra cómo empaquetar componentes con un Proveedor usando Context API:</p><pre><code class="language-js">// Creamos un componente padre que envuelva los componentes hijos con un Proveedor
import { useState, React } from "react";
import { MiContexto } from "./MiContexto";
import MiComponente from "./MiComponente";

function App() {
  const [texto, setTexto] = useState("");

  return (
    &lt;div&gt;
      &lt;MiContexto.Provider value={{ texto, setTexto }}&gt;
        &lt;MiComponente /&gt;
      &lt;/MiContexto.Provider&gt;
    &lt;/div&gt;
  );
}

export default App;</code></pre><p>En este ejemplo, tenemos un componente principal llamado <code>App</code>. Este componente tiene una variable de estado llamada "texto", que inicialmente se establece en una cadena vacía. También hemos definido una función llamada <code>setTexto</code> que se puede usar para actualizar el valor del texto.</p><h2 id="consumir-el-contexto">Consumir el contexto</h2><p>Ahora que hemos creado el componente proveedor, necesitamos consumir el contexto en otros componentes. Para hacer esto, usamos el hook "useContext" de React.</p><pre><code class="language-js">import { useContext } from 'react';
import { MiContexto } from './MiContexto';

function MiComponente() {
  const { texto, setTexto } = useContext(MiContexto);

  return (
    &lt;div&gt;
      &lt;h1&gt;{texto}&lt;/h1&gt;
      &lt;button onClick={() =&gt; setTexto('Hola mundo!')}&gt;
        Click me
      &lt;/button&gt;
    &lt;/div&gt;
  );
}

export default MiComponente;</code></pre><p>En este ejemplo, hemos utilizado el hook <code>useContext</code> para acceder a las variables "texto" y "setTexto" que se definieron en el componente del proveedor.</p><p>Dentro de la declaración de retorno de "MiComponente", hemos representado un elemento de párrafo que muestra el valor del texto. También hemos representado un botón que, al hacer clic, llamará a la función <code>setTexto</code> para actualizar el valor del texto a "¡Hola, mundo!".</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/02/a191j3C-1.gif" class="kg-image" alt="a191j3C-1" width="716" height="472" loading="lazy"></figure><p>¡Y eso es! Así es como puedes usar la Context API en tu aplicación React.</p><p>Al crear un objeto de contexto, definir un componente de proveedor y consumir el contexto en otros componentes, puede compartir datos en su aplicación de una manera simple y eficiente.</p><h2 id="casos-de-uso-de-context-api">Casos de uso de context API</h2><p>A continuación se muestran algunos casos de uso reales de Context API:</p><ol><li><strong>Temas</strong>: puede utilizar Context API para almacenar el tema actual de su aplicación y ponerlo a disposición de todos los componentes. De esta manera, cada vez que el usuario cambie el tema (como habilitar el modo oscuro), todos los componentes se actualizarán con el nuevo tema.</li><li><strong>Autenticación de usuario</strong>: también puede utilizar Context API para almacenar el estado de autenticación de un usuario y transmitirlo a todos los componentes que lo necesitan. De esta manera, puede restringir fácilmente el acceso a ciertas partes de su aplicación según el estado de autenticación del usuario.</li><li><strong>Soporte multilingüe</strong>: puede almacenar el idioma actual de su aplicación en el contexto y transmitirlo a todos los componentes que lo necesiten. De esta manera, puede cambiar fácilmente entre diferentes idiomas sin tener que pasar el idioma como props a todos los componentes.</li><li><strong>Acceso a datos de fuentes externas</strong>: finalmente, puede utilizar Context API para almacenar datos recuperados de fuentes externas, como API o bases de datos, y ponerlos a disposición de todos los componentes. Esto puede simplificar su código y facilitar la administración de datos en su aplicación.</li></ol><h2 id="en-resumen">En resumen</h2><p>En este artículo, exploramos Context API de React, una poderosa herramienta para administrar el estado en aplicaciones React.</p><p>Hemos analizado los conceptos básicos Context API, incluida la creación de un contexto, la creación de un componente de proveedor para pasar datos a componentes secundarios y el consumo de datos en otro componente mediante el hook <code>useContext</code>.</p><h1 id="conclusi-n">Conclusión</h1><p>Si está interesado en explorar cómo implementar un tema de modo claro/oscuro en sus propios proyectos de React usando Context API, he creado un sitio web simple que demuestra cómo hacerlo. Puedes encontrar el código del proyecto en mi <a href="https://github.com/dboatengg/context-api-tutorial">GitHub.</a></p><p>Al explorar el código y experimentar con sus propias modificaciones, estará bien encaminado para dominar Context API y desbloquear todo su potencial en sus propios proyectos.</p><p>¡Muchas gracias por leer!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ ¿Cómo crear un directorio con Python? ]]>
                </title>
                <description>
                    <![CDATA[ En este artículo, aprenderás cómo crear nuevos directorios (que es otro nombre para las carpetas) en Python. También aprenderás a crear una estructura de directorios anidados. Para trabajar con directorios en Python, primero debes incluir el módulo os en su proyecto, que le permite interactuar con su sistema operativo. El ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-crear-un-directorio-con-python/</link>
                <guid isPermaLink="false">65f998f7fef4be04135ccd09</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Cristian Fernando Villca Gutierrez ]]>
                </dc:creator>
                <pubDate>Fri, 22 Mar 2024 18:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/03/pexels-pixabay-51191.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/creating-a-directory-in-python-how-to-create-a-folder/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Creating a Directory in Python – How to Create a Folder</a>
      </p><p>En este artículo, aprenderás cómo crear nuevos directorios (que es otro nombre para las carpetas) en Python.</p><p>También aprenderás a crear una estructura de directorios anidados.</p><p>Para trabajar con directorios en Python, primero debes incluir el módulo <code>os</code> en su proyecto, que le permite interactuar con su sistema operativo.</p><p>El módulo <code>os</code> también te permite utilizar los dos métodos que cubriremos en este artículo:</p><ul><li>el método <code>os.mkdir()</code></li><li>el método <code>os.makedirs()</code></li></ul><p>¡Comencemos!</p><h2 id="c-mo-crear-un-directorio-nico-usando-el-m-todo-os-mkdir-en-python">Cómo crear un directorio único usando el método <code>os.mkdir()</code> en Python</h2><p>Como se mencionó anteriormente, para trabajar con directorios en Python, primero debes incluir el módulo <code>os</code>. </p><p>Para hacerlo, agrega la siguiente línea de código en la parte superior de su archivo:</p><pre><code class="language-py">import os</code></pre><p>El código anterior te permitirá utilizar el método <code>os.mkdir()</code> para crear un nuevo directorio único. </p><p>El método <code>os.mkdir()</code> acepta un argumento: la ruta del directorio.</p><pre><code class="language-py">import os

# especificamos la ruta para el directorio - nos aseguramos de hacerlo entre comillas
ruta = './proyectos'

# creamos un nuevo directorio
os.mkdir(ruta)</code></pre><p>El código anterior creará un directorio de proyectos en el directorio de trabajo actual.</p><p>Ten en cuenta que <code>./</code> representa el directorio de trabajo actual. Puedes omitir esta parte y escribir proyectos solo cuando especifique la ruta; ¡el resultado será el mismo!</p><h2 id="c-mo-manejar-excepciones-al-usar-el-m-todo-os-mkdir-en-python">Cómo manejar excepciones al usar el método <code>os.mkdir</code> en Python</h2><p>Pero, ¿qué sucede cuando el directorio que estás intentando crear ya existe? Se genera una excepción <code>FileExistsError</code>:</p><pre><code class="language-py">Traceback (most recent call last):
  File "main.py", line 3, in &lt;module&gt;
    os.mkdir(ruta)
FileExistsError: [Errno 17] File exists: './proyectos'</code></pre><p>Una forma de manejar esta excepción es verificar si el archivo ya existe usando un bloque <code>if..else</code>:</p><pre><code class="language-py">import os

ruta = './proyectos'

# verificamos si el directorio ya existe
if not os.path.exists(ruta):
  os.mkdir(ruta)
  print("Directorio %s creado!" % ruta)
else:
  print("Directorio %s ya existe" % ruta)</code></pre><p>En el ejemplo anterior, primero verifica si el directorio <code>./proyectos</code> ya existe usando el método <code>os.path.exists()</code>.</p><p>Si es así, obtendré el siguiente resultado en lugar de un <code>FileExistsError</code>:</p><pre><code class="language-py">Directorio ./proyectos ya existe</code></pre><p>Si el archivo no existe, se crea una nueva carpeta de proyectos en el directorio de trabajo actual y obtengo el siguiente resultado:</p><pre><code class="language-py">Directorio ./proyectos creado!</code></pre><p>Alternativamente, puedes usar un bloque <code>try/except</code> para manejar excepciones:</p><pre><code class="language-py">import os

ruta = './proyectos'

try:
    os.mkdir(ruta)
    print("Directorio %s creado!" % ruta)
except FileExistsError:
    print("Directorio %s ya existe" % ruta)</code></pre><p>Si ya existe una carpeta de proyectos en el directorio de trabajo actual, obtendrá el siguiente resultado en lugar de un mensaje de error:</p><pre><code class="language-py">Directorio ./proyectos ya existe.</code></pre><h2 id="c-mo-crear-un-directorio-con-subdirectorios-usando-el-m-todo-os-makedirs-en-python">Cómo crear un directorio con subdirectorios usando el método <code>os.makedirs()</code> en Python</h2><p>El método <code>os.mkdir()</code> no te permite crear un subdirectorio. Este método te permite crear un directorio único.</p><p>Para crear una estructura de directorios anidados (como un directorio dentro de otro directorio), utiliza el método <code>os.makedirs()</code>.</p><p><code>os.makedirs()</code> acepta un argumento: la ruta completa de la carpeta que desea crear.</p><pre><code class="language-py">import os

# define el nombre del directorio con sus subdirectorios
ruta = './proyectos/juegos/juego01'

os.makedirs(ruta)</code></pre><p>En el ejemplo anterior, creé un directorio de proyectos en el directorio de trabajo actual.</p><p>Dentro de proyectos, creé otro directorio, <code>juegos</code>. Y dentro de <code>juegos</code>, creé otro directorio más, <code>juego01</code>.</p><h2 id="conclusi-n">Conclusión</h2><p>¡Y ahí lo tienes! Ahora sabe cómo crear un directorio único y un directorio con subdirectorios en Python. </p><p>Para obtener más información sobre Python, consulte el curso <a href="https://www.freecodecamp.org/news/python-programming-course/">Python para principiantes</a> de freeCodeCamp.</p><p>Gracias por leer y feliz codificación. </p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Copiar un Objeto en JS: Cómo clonar un objeto en JavaScript ]]>
                </title>
                <description>
                    <![CDATA[ Un objeto JavaScript es una colección de pares clave-valor. Es un tipo de datos no primitivo que puede contener varios tipos de datos. Por ejemplo: const usuario = {   nombre: "John Doe",   edad: 14,   verificado: false }; Cuando trabaja con objetos en JavaScript, es ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/copiar-un-objeto-en-js-como-clonar-un-objeto-en-javascript/</link>
                <guid isPermaLink="false">65c3a00b85c7c103ecb57936</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Cristian Fernando Villca Gutierrez ]]>
                </dc:creator>
                <pubDate>Mon, 11 Mar 2024 16:00:07 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/02/cover-template--20--1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/clone-an-object-in-javascript/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">JS Copy an Object – How to Clone an Obj in JavaScript</a>
      </p><p>Un objeto JavaScript es una colección de pares clave-valor. Es un tipo de datos no primitivo que puede contener varios tipos de datos. Por ejemplo:</p><pre><code class="language-js">const usuario = {
  nombre: "John Doe",
  edad: 14,
  verificado: false
};</code></pre><p>Cuando trabaja con objetos en JavaScript, es posible que en ocasiones desee cambiar el valor o agregar una nueva propiedad al objeto.</p><p>En algunos escenarios, antes de actualizar o agregar nuevas propiedades, querrá crear un nuevo objeto y copiar o clonar los valores del original.</p><p>Por ejemplo, si desea copiar el valor del objeto <code>usuario</code> y luego cambiar el nombre a algo diferente. En el sentido típico, querrás utilizar el operador de igualdad (=).</p><pre><code class="language-js">const nuevoUsuario = usuario;
console.log(nuevoUsuario); // {nombre: 'John Doe', edad: 14, verificado: false}</code></pre><p>Todo parece estar bien, pero veamos qué pasa si editamos nuestro segundo objeto:</p><pre><code class="language-js">const nuevoUsuario = usuario;
nuevoUsuario.nombre = "Jane Doe";

console.log(nuevoUsuario); 
// {nombre: 'Jane Doe', edad: 14, verificado: false}</code></pre><p>Todo está bien con el nuevo objeto, pero si intentas verificar los valores de tu objeto original, notarás que se ve afectado. ¿Por qué? ¿Cómo?</p><pre><code class="language-js">console.log(usuario); // {nombre: 'Jane Doe', edad: 14, verificado: false}</code></pre><p>Este es el problema. El objeto original se ve afectado porque <strong>los valores de un objeto son pasados por referencia</strong>. Esto significa que cualquier valor que almacene en el clon o en el objeto original apunta al mismo objeto, a la misma dirección de memoria.</p><p>Esto no es lo que se busca. Se desea almacenar el valor de un objeto en un objeto nuevo y manipular el valor en el objeto nuevo sin afectar el objeto original.</p><p>En este artículo, aprenderá tres métodos que puede utilizar para hacer esto. También aprenderá qué significan los clones profundos y superficiales y cómo funcionan.</p><p>En caso de que tengas prisa, aquí tienes los tres métodos y un ejemplo de cómo funcionan.</p><pre><code class="language-js">// Usando el Operador de Propagación (Spread Operator)
let clon = { ...usuario }

// Usando Object.assign()
let clon = Object.assign({}, usuario)

// Usando JSON.parse()
let clon = JSON.parse(JSON.stringify(usuario))</code></pre><p>Si no tienes prisa, comencemos.🚀</p><h2 id="-c-mo-clonar-un-objeto-en-javascript-usando-el-operador-de-propagaci-n-spread-operator-">¿Cómo clonar un objeto en JavaScript usando el Operador de Propagación (<em>Spread Operator</em>)?</h2><p>El operador de propagación se introdujo en ES6 y puede distribuir valores en un objeto con la sintaxis de tres puntos: <code>...</code></p><pre><code class="language-js">// declaramos un objeto
const usuario = {
  nombre: "John Doe",
  edad: 14,
  verificado: false
};

// clonamos el objeto usando el operador de propagación
let clonUsuario = { ...usuario };

console.log(clonUsuario); 
// {nombre: 'John Doe', edad: 14, verificado: false}</code></pre><p>Ya no se hace referencia directa al objeto, lo que significa que cambiar el valor del objeto no afectará al objeto original.</p><pre><code class="language-js">// clonamos el objeto usando el operador de propagación
let clonUsuario = { ...usuario };

// cambiamos un valor de clonUsuario
clonUsuario.nombre = "Jane Doe"

console.log(clonUsuario.nombre); // 'Jane Doe'
console.log(clonUsuario); // {nombre: 'Jane Doe', edad: 14, verificado: false}</code></pre><p>Cuando verifica el valor del nombre en el objeto original o en todo el objeto, notará que no se ve afectado.</p><pre><code class="language-js">console.log(usuario.nombre); // 'John Doe'
console.log(usuario); // {nombre: 'John Doe', edad: 14, verificado: false}</code></pre><p><strong>Nota</strong>: Solo puede utilizar la sintaxis del operador de propagación para hacer una copia superficial de un objeto, no funciona con propiedades de objetos más profundos. Lo entenderás cuando lleguemos a la última sección de este artículo.</p><h2 id="-c-mo-clonar-un-objeto-en-javascript-usando-el-object-assing-">¿Cómo clonar un objeto en JavaScript usando el <code>Object.assing()</code>?</h2><p>Una alternativa al operador de propagación es el método <code>Object.assing()</code>. Utilice este método para copiar los valores y propiedades de uno o más objetos de origen a un objeto de destino.</p><pre><code class="language-js">// declaramos un objeto
const usuario = {
  nombre: "John Doe",
  edad: 14,
  verificado: false
};

// clonamos el objeto usando Object.assing()
let clonUsuario = Object.assign({}, usuario);

console.log(clonUsuario); 
// {nombre: 'John Doe', edad: 14, verificado: false}</code></pre><p>Ya no se hace referencia al objeto, lo que significa que cambiar el valor del objeto no afectará al objeto original.</p><pre><code class="language-js">// clonamos el objeto usando Object.assing()
let clonUsuario = Object.assign({}, usuario);

// cambiamos un valor del objeto clonado
clonUsuario.nombre = "Jane Doe"

console.log(clonUsuario.nombre); // 'Jane Doe'
console.log(clonUsuario); // {nombre: 'Jane Doe', edad: 14, verificado: false}</code></pre><p>Cuando verifica el valor del nombre en el objeto original o en todo el objeto, notará que no se ve afectado.</p><pre><code class="language-js">console.log(usuario.nombre); // 'John Doe'
console.log(usuario); // {nombre: 'John Doe', edad: 14, verificado: false}</code></pre><p><strong>Nota</strong>: Solo puede utilizar el método <code>Object.assign()</code> para hacer una copia superficial de un objeto, no funciona con propiedades de objetos más profundos. Lo entenderás cuando lleguemos a la última sección de este artículo.</p><h2 id="-c-mo-clonar-un-objeto-en-javascript-usando-el-json-parse-">¿Cómo clonar un objeto en JavaScript usando el <strong><code>JSON.parse()</code></strong>?</h2><p>El método final es <code>JSON.parse()</code>. Utilizará este método junto con <code>JSON.stringify()</code>. Puedes usar esto para clonar profundamente, pero tiene algunas desventajas. Primero, veamos cómo funciona.</p><pre><code class="language-js">// declaramos un objeto
const usuario = {
  nombre: "John Doe",
  edad: 14,
  verificado: false
};

// clonamos el objeto usando JSON.parse()
let clonUsuario = JSON.parse(JSON.stringify(usuario));

console.log(clonUsuario); 
// {nombre: 'John Doe', edad: 14, verificado: false}</code></pre><p>Además, al igual que los métodos anteriores, ya no se hace referencia al objeto original. Esto significa que puede cambiar un valor en el nuevo objeto sin afectar el objeto original.</p><pre><code class="language-js">// clonamos el objeto usando JSON.parse()
let clonUsuario = JSON.parse(JSON.stringify(usuario));

// cambiamos un valor del objeto clonUsuario
clonUsuario.nombre = "Jane Doe"

console.log(clonUsuario.nombre); // 'Jane Doe'
console.log(clonUsuario); // {nombre: 'Jane Doe', edad: 14, verificado: false}</code></pre><p>Cuando verifica el valor del nombre en el objeto original o en todo el objeto, notará que no se ve afectado.</p><pre><code class="language-js">console.log(usuario.nombre); // 'John Doe'
console.log(usuario); // {nombre: 'John Doe', edad: 14, verifido: false}</code></pre><p><strong>Nota</strong>: Este método se puede utilizar para la clonación profunda, pero no será la mejor opción porque no funciona con propiedades de que almacenan funciones o símbolos.</p><p>Exploremos ahora la clonación superficial y profunda y cómo puede utilizar el método <code>JSON.parse()</code> para realizar una clonación profunda. También aprenderás por qué no es la mejor opción.</p><h2 id="clonaci-n-superficial-vs-clonaci-n-profunda">Clonación superficial vs. clonación profunda</h2><p>Hasta ahora, el ejemplo utilizado en este artículo es un objeto básico con un solo nivel. Esto significa que sólo hemos realizado clones superficiales. Pero cuando un objeto tiene más de un nivel, se le pedirá que realice una clonación profunda.</p><pre><code class="language-js">// objeto superficial
const usuario = {
  nombre: "John Doe",
  edad: 14,
  verificado: false
};

// objeto profundo
const usuario = {
  nombre: "John Doe",
  edad: 14,
  estado: {
    verificado: false,
  }
};</code></pre><p>Observe que el objeto profundo tiene más de un nivel porque hay otro objeto en el objeto <code>usuario</code>. Un objeto profundo puede tener tantos niveles como quieras.</p><p><strong>Nota</strong>: Cuando utiliza el operador de propagación o el método <code>Object.assign()</code> para clonar un objeto profundo, se hará referencia a los objetos más profundos.</p><pre><code class="language-js">const usuario = {
  nombre: "John Doe",
  edad: 14,
  estado: {
    verificado: false,
  }
};

// clanamos el objeto usando el operador de propagación 
let clonUsuario = { ...usuario };

// cambiamos un valor de clonUsuario
clonUsuario.estado.verificado = true;

console.log(clonUsuario); 
// {nombre: 'John Doe', edad: 14, estado: {verificado: true}}
console.log(usuario); 
// {nombre: 'John Doe', edad: 14, estado: {verificado: true}}</code></pre><p>Notarás que tanto el objeto original como el nuevo se ven afectados porque cuando usas el operador de propagación o el método <code>Object.assign()</code> para clonar un objeto profundo, se hará referencia a los objetos más profundos.</p><h2 id="-c-mo-podemos-solucionar-este-problema">¿Cómo podemos solucionar este problema?</h2><p>Puede utilizar el método <code>JSON.parse()</code> y todo funcionará bien.</p><pre><code class="language-js">const usuario = {
  nombre: "John Doe",
  edad: 14,
  estado: {
    verificado: false,
  }
};

// clonamos el objeto usando JSON.parse()
let clonUsuario = JSON.parse(JSON.stringify(usuario));

// cambiamos un valor de clonUsuario
clonUsuario.estado.verificado = true;

console.log(clonUsuario); 
// {nombre: 'John Doe', edad: 14, estado: {verificado: true}}
console.log(usuario); 
// {nombre: 'John Doe', edad: 14, estado: {verificado: false}}</code></pre><p>Pero hay un problema con este método. El problema es que puedes perder tus datos. ¿Cómo?</p><p><code>JSON.stringify()</code> funciona muy bien con tipos de datos primitivos como números, cadenas o booleanos, y eso es lo que has visto en nuestros ejemplos anteriores. Pero a veces, <code>JSON.stringify()</code> es impredecible si no se conoce algunos valores y cómo se los maneja.</p><p>Por ejemplo, no funciona con funciones, símbolos o valores <code>undefined</code>. También cambia otros valores como <code>NaN</code> e <code>Infinity</code> a <code>null</code>, rompiendo tu código. Cuando tenga una función, símbolo o valor <code>undefined</code>, devolverá un par clave-valor vacío y lo omitirá.</p><pre><code class="language-js">const usuario = {
  nombre: "John Doe",
  edad: 14,
  estado: {
    verificado: false,
    metodo: Symbol(),
    titulo: undefined
  }
};

// clonamos el objeto usando Object.parse()
let clonUsuario = JSON.parse(JSON.stringify(userDetails));</code></pre><p>Todo parece funcionar bien, pero para el nuevo objeto, <code>JSON.stringify()</code> no devolverá ningún par clave-valor para los valores <code>undefined</code>y<code>symbol</code>.</p><pre><code class="language-js">console.log(clonUsuario); 

// salida
{
  nombre: "John Doe",
  edad: 14,
  estado: {
    verificado: false
  }
};</code></pre><p><br>Esto significa que debes tener cuidado. La mejor opción para implementar la clonación profunda será utilizar Lodash. Entonces puede estar seguro de que no se perderá ninguno de sus datos.</p><pre><code class="language-js">const usuario = {
  nombre: "John Doe",
  edad: 14,
  estado: {
    verificado: false,
    metodo: Symbol(),
    titulo: undefined
  }
};

console.log(_.cloneDeep(usuario));</code></pre><h2 id="para-finalizar-">Para finalizar...</h2><p><br>Este artículo le ha enseñado cómo clonar un objeto en JavaScript utilizando tres métodos principales. Has visto cómo funcionan esos métodos y cuándo utilizar cada uno de ellos. También aprendiste sobre la clonación profunda.</p><p>Puede leer <a href="https://medium.com/@pmzubar/why-json-parse-json-stringify-is-a-bad-practice-to-clone-an-object-in-javascript-b28ac5e36521">este artículo</a> para comprender por qué <code>JSON.parse(JSON.stringify())</code> es una mala práctica para clonar un objeto en JavaScript.</p><p>¡Feliz codificación!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Div Color de fondo: Cómo cambiar  el color de fondo en CSS ]]>
                </title>
                <description>
                    <![CDATA[ Si estás trabajando en un proyecto de desarrollo web, establecer un color de fondo agradable puede darle al sitio web un aspecto más atractivo. Para establecer un color de fondo para un div o elemento parecido en CSS, utiliza la propiedad background-color. Al configurar la propiedad, background-colortu creatividad es el ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/div-color-de-fondo-como-cambiar-el-color-de-fondo-en-css/</link>
                <guid isPermaLink="false">65c263d0aa1f2203f0eb10d2</guid>
                
                    <category>
                        <![CDATA[ CSS ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Cristian Fernando Villca Gutierrez ]]>
                </dc:creator>
                <pubDate>Mon, 11 Mar 2024 15:28:53 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/02/backgroundcolor-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/div-background-color-how-to-change-background-color-in-css/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Div Background Color – How to Change Background Color in CSS</a>
      </p><h3 id="si-est-s-trabajando-en-un-proyecto-de-desarrollo-web-establecer-un-color-de-fondo-agradable-puede-darle-al-sitio-web-un-aspecto-m-s-atractivo-">Si estás trabajando en un proyecto de desarrollo web, establecer un color de fondo agradable puede darle al sitio web un aspecto más atractivo.</h3><p>Para establecer un color de fondo para un <code>div</code> o elemento parecido en CSS, utiliza la propiedad <code>background-color</code>.</p><p>Al configurar la propiedad, <code>background-color</code>tu creatividad es el límite en cuanto hasta dónde quieres llegar.</p><p>Entonces, en este artículo, te mostraré cómo puedes configurar la propiedad <code>background-color</code>.</p><h2 id="c-mo-configurar-background-color-con-nombres-de-color">Cómo configurar <code>background-color</code> con nombres de color</h2><p>Con los colores con nombre, puede establecer el color de fondo incorporando la propiedad <code>background-color</code> y asignándole un valor expresado en un nombre de color como <code>red</code>, <code>green</code>, <code>blue</code>, etc.</p><pre><code class="language-css">div {
   background: green;
}</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/02/ss-1-1.png" class="kg-image" alt="ss-1-1" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/02/ss-1-1.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2024/02/ss-1-1.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2024/02/ss-1-1.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/2024/02/ss-1-1.png 1911w" sizes="(min-width: 720px) 720px" width="1911" height="1019" loading="lazy"><figcaption>Ejemplo de un div color verde en CSS</figcaption></figure><p>Puede utilizar los siguientes estilos para que la página web se vea mejor. Simplemente, establezca un ancho y alto para el <code>div</code>, para que el <code>background-color</code> pueda tener efecto:</p><pre><code class="language-css">body {
   display: flex;
   align-items: center;
   justify-content: center;
   height: 100vh;
   background-color: #d3d3d3;
 }

div {
   background: green;
 }</code></pre><p>Los navegadores modernos reconocen alrededor de 147 colores, por lo que todavía su uso es un poco limitado.</p><h2 id="c-mo-configurar-background-color-con-colores-hexadecimales">Cómo configurar <code>background-color</code> con colores hexadecimales</h2><p>Con valores hexadecimales, puedes establecer un color de fondo para un <code>div</code> o cualquier otro elemento con un total de 6 caracteres.</p><p>Los colores hexadecimales comienzan con el signo de numeral (#), cualquier número del 0 al 9 y, finalmente, cualquier letra de la A a la F.</p><p>Los primeros 2 valores representan el rojo, los 2 siguientes representan el verde y los 2 últimos representan el azul.</p><p>Con valores hexadecimales, puedes sumergirte profundamente en el círculo cromático e incluso usar colores que nadie ha usado nunca.</p><pre><code class="language-css">div {
   background: #2ecc71;
}</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/02/ss-2-1.png" class="kg-image" alt="ss-2-1" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/02/ss-2-1.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2024/02/ss-2-1.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2024/02/ss-2-1.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/2024/02/ss-2-1.png 1904w" sizes="(min-width: 720px) 720px" width="1904" height="1023" loading="lazy"><figcaption>Ejemplo de div usando colores hexadecimales</figcaption></figure><h2 id="c-mo-configurar-background-color-con-colores-rgb">Cómo configurar <code>background-color</code> con colores RGB</h2><p>RGB significa Red (Rojo), Green (Verde) y Blue (Azul).</p><p>Para configurar el color de fondo con RGB, especifica la cantidad de rojo, verde y azul que desea con números entre 0 y 255.</p><pre><code class="language-css">div {
   background: rgb(220, 20, 60);
}</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/02/ss-3-2.png" class="kg-image" alt="ss-3-2" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/02/ss-3-2.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2024/02/ss-3-2.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2024/02/ss-3-2.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/2024/02/ss-3-2.png 1896w" sizes="(min-width: 720px) 720px" width="1896" height="1008" loading="lazy"><figcaption>Ejemplo de div usando colores RGB</figcaption></figure><p>RGB también tiene una variación llamada RGBA. La última A significa alfa y te permite determinar qué tan opaco quieres que sea el color.</p><p>El alfa toma un valor de 0,0 a 1,0. 0,0 significa 0% de opacidad, 0,5 significa 50% de opacidad y 1,0 significa 100% de opacidad.</p><pre><code class="language-css">div {
    background: rgb(220, 20, 60, 0.6);
}</code></pre><p></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/02/ss-4.png" class="kg-image" alt="ss-4" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/02/ss-4.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2024/02/ss-4.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2024/02/ss-4.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/2024/02/ss-4.png 1907w" sizes="(min-width: 720px) 720px" width="1907" height="1022" loading="lazy"><figcaption>Ejemplo de div con RGB y una opacidad del 60%</figcaption></figure><h2 id="c-mo-configurar-background-color-con-colores-hsl">Cómo configurar <code>background-color</code> con colores HSL</h2><p>HSL significa Hue (Tono), Saturation (Saturación) y Lightness (Luminosidad). Es la forma más dinámica dentro de las formas en que puedes especificar un color de fondo para un <code>div</code> u otros elementos.</p><ul><li><strong>Hue (Tono)</strong> representa la rueda de colores en 360°. 0° es rojo, 120° es verde y 240° es azul.</li><li><strong>Saturation (Saturación)</strong> es la cantidad de gris en el color expresada en porcentajes. 0% es el tono de gris y 100% es el mismo color.</li><li>Como su nombre lo indica, la <strong><strong>lightness</strong> (luminosidad) </strong>es la cantidad de oscuridad y luminosidad del color expresada como porcentaje. 0% es negro y 100% es blanco.</li></ul><pre><code class="language-css">div {
   background: hsl(16, 100%, 50%);
 }</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/02/ss-5.png" class="kg-image" alt="ss-5" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/02/ss-5.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2024/02/ss-5.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2024/02/ss-5.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/2024/02/ss-5.png 1911w" sizes="(min-width: 720px) 720px" width="1911" height="1021" loading="lazy"><figcaption>Ejemplo de div usando colores HSL</figcaption></figure><h1 id="conclusi-n">Conclusión</h1><p>Dado que puedes aplicar colores de 4 maneras diferentes, debes preguntarte cuál deberías usar.</p><p>Cuando usas colores con nombre, estás un poco limitado en cuanto a hasta dónde puedes llegar al aplicar diferentes tonos de colores.</p><p>Cada color, como rojo, verde, azul, amarillo o cualquier otro color, tiene muchas variaciones a las que no tendrás acceso con colores con nombre.</p><p>Sólo puedes acceder a unos 147 colores predefinidos reconocidos por los navegadores. Los colores hexadecimales, por otro lado, son muy dinámicos. Se utilizan principalmente entre desarrolladores y la creatividad es el límite. Estos colores hexadecimales te permiten utilizar diferentes tonos del mismo color.</p><p>Los colores RGB son tan dinámicos como los colores hexadecimales. Puede especificar la cantidad de rojo, verde y azul de 0 a 255, y también puede usar el valor alfa agregado para especificar la transparencia del color.</p><p>HSL es el más dinámico de todos ellos. Puede especificar exactamente el color de 0 a 360 grados en el círculo cromático, establecer la saturación y la oscuridad como porcentaje y establecer la opacidad en cualquier valor entre 0,0 y 1,0.</p><p>Por lo tanto, decidir cuál usar entre colores con nombre, hexadecimales, RGB y HSL depende de usted y de qué tan creativo quiera ser y cuáles sean las necesidades de su proyecto.</p><p>Gracias por leer.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Añadiendo a dict() en Python: Cómo añadir a un diccionario ]]>
                </title>
                <description>
                    <![CDATA[ Un diccionario en Python es un grupo de elementos desordenados, cada uno de los cuales tiene un conjunto único de claves y valores. Se puede usar como clave cualquier tipo de dato inmutable, como una cadena, un número o una tupla. Sirve como identificador único de valor en el diccionario. ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/anadiendo-a-dict-en-python-como-anadir-a-un-diccionario/</link>
                <guid isPermaLink="false">65bd5e45aa1f2203f0eb07d9</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Cristian Fernando Villca Gutierrez ]]>
                </dc:creator>
                <pubDate>Mon, 11 Mar 2024 15:19:36 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/02/Shittu-Olumide-Adding-to-Dict-in-Python---How-to-Append-to-a-Dictionary-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/add-to-dict-in-python/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Adding to Dict in Python – How to Append to a Dictionary</a>
      </p><h3 id="un-diccionario-en-python-es-un-grupo-de-elementos-desordenados-cada-uno-de-los-cuales-tiene-un-conjunto-nico-de-claves-y-valores-">Un diccionario en Python es un grupo de elementos desordenados, cada uno de los cuales tiene un conjunto único de claves y valores.</h3><p>Se puede usar como clave cualquier tipo de dato inmutable, como una cadena, un número o una tupla. Sirve como identificador único de valor en el diccionario. El valor es repetible y aplicable a todo tipo de datos.</p><p>En Python, los diccionarios se indican con llaves <strong><code>{ }</code></strong>, y cada par clave-valor está delimitado por dos puntos <strong><code>:</code></strong>. Una coma separa cada par clave-valor. A continuación se muestra un ejemplo de un diccionario básico:</p><figure class="kg-card kg-code-card"><pre><code class="language-py">mi_diccionario = {"piña": 12, "manzana": 30, "naranja": 5, "palta":7}
</code></pre><figcaption>Ejemplo de diccionario básico en Python</figcaption></figure><p>En este ejemplo, "piña", "manzana", "naranja" y "palta" son las claves y 12, 30, 5 y 7 son los valores correspondientes.</p><p>Veremos como podemos agregar un único par clave-valor a un diccionario usando el método <code><strong>update()</strong></code>, y finalmente aprenderemos a usar el constructor <code><strong>dict()</strong></code>.</p><h2 id="-c-mo-agregar-un-nico-par-clave-valor-a-un-diccionario">¿Cómo agregar un único par clave-valor a un diccionario?</h2><p>Para agregar un único par clave-valor a un diccionario en Python, podemos usar el siguiente código como ejemplo:</p><figure class="kg-card kg-code-card"><pre><code class="language-py">my_diccionario = {'a': 1, 'b': 2}
my_diccionario['c'] = 3</code></pre><figcaption>Agregar un nuevo par clave-valor a un diccionario Python</figcaption></figure><p>El código anterior creará un diccionario <code>my_diccionario</code> con dos pares clave-valor. Luego agregamos un nuevo par clave-valor <code>c:3</code> al diccionario simplemente asignando el valor <code>3</code> a la clave <code>c</code>. Después de ejecutar el código, el diccionario <code>my_diccionario</code> ahora contendrá el par clave-valor <code>c:3</code>.</p><p>Podemos verificar esto imprimiendo el diccionario:</p><figure class="kg-card kg-code-card"><pre><code>print(my_diccionario)</code></pre><figcaption>Imprimimos el diccionario</figcaption></figure><p>Obtenemos como salida:</p><figure class="kg-card kg-code-card"><pre><code>{'a': 1, 'b': 2, 'c': 3}</code></pre><figcaption>Verificamos que el nuevo par clave-valor efectivamente se agrego al diccionario</figcaption></figure><p>Si ya existe una clave <code>c</code> en el diccionario, el valor se actualizará a <code>3</code>.</p><h2 id="-c-mo-agregar-m-ltiples-pares-clave-valor-con-el-m-todo-update-">¿Cómo agregar múltiples pares clave-valor con el método <code>update()</code>?</h2><p>Se pueden agregar de manera simultánea varios pares clave-valor a un diccionario usando método <code>update()</code>. Este método inserta nuevas entradas en el diccionario original desde otro diccionario o un iterable de pares clave-valor como entrada. El valor de una clave existente en el diccionario original se actualizará con el nuevo valor.</p><p>Ahora veamos un ejemplo usando el método <code>update()</code> para agregar múltiples entradas a un diccionario:</p><figure class="kg-card kg-code-card"><pre><code class="language-py">my_diccionario = {'a': 1, 'b': 2}
nuevos_datos = {'c': 3, 'd': 4}

my_diccionario.update(nuevos_datos)

print(my_diccionario)</code></pre><figcaption>Agregamos múltiples pares clave-valor a un diccionario usando el método <code>update()</code></figcaption></figure><p>Salida:</p><figure class="kg-card kg-code-card"><pre><code class="language-py">{'a': 1, 'b': 2, 'c': 3, 'd': 4}</code></pre><figcaption>Verificamos que todos los pares clave-valor se agregaron</figcaption></figure><p>Otra cosa divertida de este método es que podemos usar<code>update()</code> con un iterable de pares clave-valor, como una lista de tuplas. Veamos esto en acción:</p><figure class="kg-card kg-code-card"><pre><code class="language-py">my_diccionario = {'a': 1, 'b': 2}
nuevos_datos = [('c', 3), ('d', 4)]

my_diccionario.update(nuevos_datos)

print(my_diccionario)</code></pre><figcaption>Agregamos multiples pares clave-valor como tupla a un diccionario usando el método <code>update()</code></figcaption></figure><p>La salida será la misma obtenida en el ejemplo anterior:</p><figure class="kg-card kg-code-card"><pre><code class="language-python">{'a': 1, 'b': 2, 'c': 3, 'd': 4}</code></pre><figcaption>Verificamos nuevamente la salida</figcaption></figure><h2 id="-c-mo-actualizar-un-diccionario-usando-el-constructor-dict-">¿Cómo actualizar un diccionario usando el constructor <code>dict()</code>?</h2><p>En Python, un diccionario se puede actualizar o crear desde cero utilizando el constructor <code>dict()</code>. Al pasar un diccionario que contiene el nuevo par clave-valor como argumento al constructor <code>dict()</code>, podemos agregar un único par clave-valor a un diccionario existente.</p><p>Ejemplo:</p><figure class="kg-card kg-code-card"><pre><code class="language-py">my_diccionario = {'a': 1, 'b': 2, 'c': 3}
nuevo_diccionario = dict(my_diccionario, d=4)

print(nuevo_diccionario)</code></pre><figcaption>Agregamos un nuevo par clave-valor usando <code>dict()</code></figcaption></figure><p>Salida:</p><figure class="kg-card kg-code-card"><pre><code class="language-py">{'a': 1, 'b': 2, 'c': 3, 'd': 4}	</code></pre><figcaption>Verificamos la salida</figcaption></figure><p>En este ejemplo, contamos con el diccionario <code>my_diccionario</code> con 3 pares clave-valor. Luego creamos un nuevo diccionario llamado <code>nuevo_diccionario</code> usando el constructor <code>dict()</code> y agregamos el par clave-valor <code>d:4</code>.</p><p>Tenga en cuenta que también se puede crear un nuevo diccionario utilizando el constructor <code>dict()</code> a partir de una lista de pares clave-valor, donde cada par está representado por una tupla.</p><figure class="kg-card kg-code-card"><pre><code class="language-py">mi_lista = [('a', 1), ('b', 2), ('c', 3)]
mi_diccionario = dict(mi_lista)

print(mi_diccionario)</code></pre><figcaption>Convertimos una lista de tuplas a un diccionario usando <code>dict()</code></figcaption></figure><p>Salida:</p><figure class="kg-card kg-code-card"><pre><code class="language-py">{'a': 1, 'b': 2, 'c': 3}</code></pre><figcaption>Verificamos la salida</figcaption></figure><h1 id="conclusi-n">Conclusión</h1><p>En Python los diccionarios se usan con frecuencia para almacenar datos y proporcionar acceso rápido a ellos mediante una clave única. Resultan útiles cuando se trabajan con listas o tuplas donde necesitamos acceder a datos utilizando un identificador único en lugar de una secuencia.</p><p>Conecta conmigo en <a href="https://twitter.com/Shittu_Olumide_">Twitter</a> y/o <a href="https://www.linkedin.com/in/olumide-shittu">Linkedln</a>. Puedes suscribirte también a mi canal en <a href="https://www.youtube.com/channel/UCNhFxpk6hGt5uMCKXq0Jl8A">YouTube</a>.</p><p>¡Feliz codificación!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ ¿Cómo comprobar si una cadena esta vacía o es nula en JavaScript? ]]>
                </title>
                <description>
                    <![CDATA[ En JavaScript, es importante comprobar si una cadena está vacía o nula antes de realizar cualquier operación. Intentar operar con una cadena vacía o nula puede provocar errores, bugs y resultados inesperados. En este tutorial, exploraremos las diferentes formas de verificar si una cadena está vacía o nula en JavaScript ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-comprobar-si-un-string-esta-vacio-o-es-nulo-en-javascript/</link>
                <guid isPermaLink="false">65c52d0a85c7c103ecb57b76</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Cristian Fernando Villca Gutierrez ]]>
                </dc:creator>
                <pubDate>Fri, 08 Mar 2024 06:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/02/cover-template--13--1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/check-if-string-is-empty-or-null-javascript/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Check if a String is Empty or Null in JavaScript – JS Tutorial</a>
      </p><p>En JavaScript, es importante comprobar si una cadena está vacía o nula antes de realizar cualquier operación. Intentar operar con una cadena vacía o nula puede provocar errores, bugs y resultados inesperados.</p><p>En este tutorial, exploraremos las diferentes formas de verificar si una cadena está vacía o nula en JavaScript y algunas de las mejores prácticas para hacerlo.</p><h2 id="-qu-son-las-cadenas-vac-as-y-nulas-en-javascript">¿Qué son las cadenas vacías y nulas en JavaScript?</h2><p><strong>Una cadena vacía es una cadena que no tiene caracteres</strong>, mientras que <strong>una cadena nula es una cadena que no tiene ningún valor asignado</strong>. Es importante diferenciar entre ambos, ya que no son lo mismo.</p><p>Por ejemplo, tiene un formulario donde un usuario puede ingresar su nombre. Si el usuario no ingresa nada, el valor del campo de entrada será una cadena vacía. Sin embargo, el valor será nulo si ni siquiera se crea el campo de entrada.</p><h2 id="-c-mo-verificar-si-una-cadena-esta-vac-a-o-es-nula">¿Cómo verificar si una cadena esta vacía o es nula?</h2><p>JavaScript tiene varias formas de comprobar si una cadena está vacía o nula. Exploremos algunos de ellos.</p><h2 id="usando-un-condicional-if-y-el-operador-typeof">Usando un condicional <code>if</code> y el operador <code>typeof</code></h2><p>Una forma de comprobar si hay una cadena vacía o nula es utilizar la instrucción <code>if</code> y el operador <code>typeof</code>. He aquí un ejemplo:</p><pre><code class="language-js">let cadena = "";

if (typeof cadena === "string" &amp;&amp; cadena.length === 0) {
  console.log("La cadena esta vacía");
} else if (cadena === null) {
  console.log("La cadena es nula");
} else {
  console.log("La cadena no esta vacía o nula");
}</code></pre><p>En este ejemplo, estamos comprobando si la variable <code>cadena</code> es de tipo <code>string</code> y si su longitud es cero. Si es así, entonces sabemos que es una cadena vacía. Si la variable <code>cadena</code> es nula, entonces sabemos que es una cadena nula. De lo contrario, sabemos que la cadena no está vacía ni es nula.</p><h2 id="usando-la-propiedad-length">Usando la propiedad <code>length</code></h2><p>Otra forma de comprobar si hay una cadena vacía es utilizar la propiedad <code>length</code>. He aquí un ejemplo:</p><pre><code class="language-js">let cadena = "";

if (cadena.length === 0) {
  console.log("La cadena esta vacía");
} else {
  console.log("La cadena no esta vacía");
}</code></pre><p>En este ejemplo, estamos comprobando si la longitud de la variable <code>cadena</code> es cero. Si es así, entonces sabemos que es una cadena vacía. De lo contrario, sabemos que la cadena no está vacía.</p><h2 id="usando-el-m-todo-trim-">Usando el método <code>trim()</code></h2><p>A veces, una cadena puede contener espacios en blanco que hacen que parezca que no está vacía incluso cuando lo está. En tales casos, podemos utilizar el método <code>trim()</code> para eliminar los espacios en blanco iniciales o finales antes de comprobar si están vacíos. He aquí un ejemplo:</p><pre><code class="language-js">let cadena = "   ";

if (cadena.trim().length === 0) {
  console.log("La cadena esta vacía");
} else {
  console.log("La cadena no esta vacía");
}</code></pre><p>En este ejemplo, primero usamos el método <code>trim()</code> para eliminar los espacios en blanco iniciales o finales de la variable <code>cadena</code> y luego verificamos si la cadena resultante tiene longitud cero. Si es así, entonces sabemos que la cadena está vacía. De lo contrario, sabemos que la cadena no está vacía.</p><h2 id="buenas-pr-cticas-para-verificar-si-una-cadena-esta-vac-a-o-nula">Buenas prácticas para verificar si una cadena esta vacía o nula</h2><p>A continuación se muestran algunas prácticas recomendadas a seguir al comprobar si hay cadenas vacías o nulas en JavaScript:</p><ul><li>Utilice siempre triple igual (<code>===</code>) al comparar una cadena con <code>null</code>. Esto garantiza que los tipos estén verificados y que no se compare accidentalmente una cadena con el número <code>0</code> o <code>false</code>.</li><li>Utilice igualdad estricta (<code>===</code>) cuando busque una cadena vacía. Esto garantiza que no compare una cadena vacía con una cadena que contenga solo caracteres de espacio en blanco.</li><li>Utilice el método <code>trim()</code> para eliminar los espacios en blanco iniciales y finales antes de buscar una cadena vacía. Esto garantiza que las cadenas con solo espacios en blanco también se consideren vacías.</li><li>Utilice expresiones regulares para comprobaciones más complejas, como comprobar una cadena que solo contenga dígitos o comprobar una cadena que coincida con un patrón determinado.</li></ul><p>Por ejemplo:</p><pre><code class="language-js">let cadena = "12345";
let digitosRegExp = /^\d+$/;

if (digitosRegExp.test(cadena)) {
  console.log("La cadena contiene solo dígitos");
} else {
  console.log("La cadena no contiene solo dígitos");
}</code></pre><h1 id="conclusi-n">Conclusión</h1><p><br>En este artículo, hemos aprendido cómo comprobar si una cadena está vacía o nula en JavaScript. Hemos explorado diferentes métodos para hacerlo, como usar la declaración <code>if</code> y <code>typeof</code>, la propiedad <code>length</code> y el método <code>trim()</code>.</p><p>Si desea obtener más información sobre JavaScript y el desarrollo web, <a href="https://joelolawanle.com/contents">explore más de 200 artículos de expertos sobre desarrollo web escritos por mí</a> y también consulte <a href="https://joelolawanle.com/posts">mi blog</a> para obtener contenido más cautivador.</p><p>Feliz codificación.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Comentarios en un archivo JSON ]]>
                </title>
                <description>
                    <![CDATA[ JSON (JavaScript Object Notation - Notación de Objeto de JavaScript) es un formato de intercambio de datos popular utilizado en el desarrollo web y aplicaciones móviles debido a su simplicidad y flexibilidad. Pero los archivos JSON no soportan comentarios oficialmente. Esto hace que proporcionar contexto o explicación adicional para estos ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/comentarios-en-un-archivo-json/</link>
                <guid isPermaLink="false">65c24922aa1f2203f0eb0eae</guid>
                
                    <category>
                        <![CDATA[ Json ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Cristian Fernando Villca Gutierrez ]]>
                </dc:creator>
                <pubDate>Wed, 21 Feb 2024 07:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/02/cover-template--1-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>JSON (JavaScript Object Notation - Notación de Objeto de JavaScript) es un formato de intercambio de datos popular utilizado en el desarrollo web y aplicaciones móviles debido a su simplicidad y flexibilidad.</p><p>Pero los archivos JSON no soportan comentarios oficialmente. Esto hace que proporcionar contexto o explicación adicional para estos datos sea un desafío.</p><p>Este artículo te mostrará cómo incluir comentarios en archivos JSON y por qué JSON no admite comentarios de forma nativa.</p><h2 id="-por-qu-json-no-soporta-comentarios">¿Por qué JSON no soporta comentarios?</h2><p>Según la especificación JSON, un documento JSON sólo debe contener estructuras de datos como arreglos y objetos y no incluir comentarios. Esto se debe a que JSON pretende ser un formato de datos simple y fácilmente analizable que se pueda procesar de manera rápida y eficiente.</p><p>Los comentarios, si bien son útiles para proporcionar contexto o explicación adicional para los humanos,<strong> pueden agregar complejidad al proceso de análisis</strong>. Esto ralentiza el rendimiento y aumenta el riesgo de errores.</p><p>La razón principal por la que JSON no admite comentarios es que su creador, <a href="https://es.wikipedia.org/wiki/Douglas_Crockford">Douglas Crockford</a>, los eliminó deliberadamente del formato para evitar el uso indebido y mantenerlo como un formato exclusivamente de datos.</p><p>Crockford observó que algunas personas usaban comentarios para almacenar directivas de análisis, lo que podría romper la compatibilidad entre diferentes sistemas. De ahí la decisión de eliminar los comentarios para mantener la simplicidad y coherencia del formato en varios lenguajes y entornos de programación.</p><p>Como resultado, la única opción para agregar comentarios a un archivo JSON es utilizar una solución alternativa, como utilizar elementos personalizados para almacenar comentarios.</p><h2 id="-c-mo-agregar-comentarios-a-un-archivo-json">¿Cómo agregar comentarios a un archivo JSON?</h2><p>Cuando agregas comentarios en el formato <code>//</code>, <code>#</code> o <code>/* */</code>, que se utilizan en lenguajes de programación populares, notará el error <strong>Comments are not permitted in JSON</strong> ("<strong>No se permiten comentarios en JSON</strong>").</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/02/s_7788E690364D593F2C3E31F8D1CF26EB90DAC0141414EE29BD5F57C061BD4347_1680020901125_image.png" class="kg-image" alt="s_7788E690364D593F2C3E31F8D1CF26EB90DAC0141414EE29BD5F57C061BD4347_1680020901125_image" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/02/s_7788E690364D593F2C3E31F8D1CF26EB90DAC0141414EE29BD5F57C061BD4347_1680020901125_image.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2024/02/s_7788E690364D593F2C3E31F8D1CF26EB90DAC0141414EE29BD5F57C061BD4347_1680020901125_image.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2024/02/s_7788E690364D593F2C3E31F8D1CF26EB90DAC0141414EE29BD5F57C061BD4347_1680020901125_image.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/2024/02/s_7788E690364D593F2C3E31F8D1CF26EB90DAC0141414EE29BD5F57C061BD4347_1680020901125_image.png 1774w" sizes="(min-width: 720px) 720px" width="1774" height="354" loading="lazy"></figure><p>Entonces, ¿cómo puedo agregar comentarios a mi archivo JSON?</p><p><strong>La única forma de hacerlo es incluir comentarios como pares de datos en un archivo JSON</strong>. No es una práctica comúnmente utilizada ni recomendada, pero técnicamente es la mejor manera de agregar comentarios a su archivo JSON.</p><p>Crea un elemento personalizado dentro de tu objeto JSON, como "_comentario", para distinguirlos del resto de los datos.</p><pre><code class="language-json">{
    "_comentario": "escribe acá tu comentario JSON"
    "nombre": "John Doe",
    "edad": 35,
    "ciudad": "New York",
    "esCasado": true,
    "ocupacion": "Ingeniero de Software",
}</code></pre><p><strong>Nota</strong>: No es obligatorio utilizar guiones bajos. Puedes decidir utilizar dos barras, como “//comentario” o cualquier otro carácter permitido. <strong>El objetivo es dejar claro que se trata de un comentario</strong>.</p><p>Es importante tener en cuenta que este enfoque puede hacer que el archivo JSON sea más complejo y más difícil de analizar. Pero si los comentarios se agregan como elementos personalizados, se recibirán y procesarán como cualquier otro dato en JSON en el lado del servidor.</p><p>Ahora sabes técnicamente cómo agregar comentarios a tu archivo JSON. Pero, ¿cómo se pueden agregar varios comentarios? Esto es posible, pero debes recordar que JSON no permite claves de objetos duplicadas. Debe incluir letras o números únicos en el elemento de comentario, asegurándose de que sea válido y distinguible de otros elementos en el archivo JSON.</p><pre><code class="language-json">{
    "_comentario1": "Estos son datos básicos",
    "nombre": "John Doe",
    "edad": 35,
    "ciudad": "New York",
    "_comentario2": "Información marital",
    "esCasado": true,
    "nombreEsposa": "Jane Doe"
}</code></pre><p>Cuando tengas objetos JSON anidados, puedes utilizar claves de objetos similares:</p><pre><code class="language-json">{
    "_comentario": "Estos son datos básicos",
    "nombre": "John Doe",
    "edad": 35,
    "ciudad": "New York",
    "informacionMarital": {
        "_comentario": "Información Marital",
        "esCasado": true,
        "nombreEsposa": "Jane Doe"
    }
}</code></pre><h1 id="conclusi-n">Conclusión</h1><p>Ahora sabes cómo agregar comentarios a tu archivo JSON. Pero debido a que estos comentarios también se procesan y se puede acceder a ellos, debes tener cuidado al agregar comentarios a archivos JSON utilizando elementos personalizados.</p><p>Gracias por leer y feliz codificación.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Un vistazo rápido a Bun 1.0 - Una alternativa a Node.js ]]>
                </title>
                <description>
                    <![CDATA[ Un hombre sabio me dijo una vez: "Cuando empieces a comer Bun (panecillo), Node.js se sentirá insípido". Pero ¿por qué es eso relevante? JavaScript se volvió mucho más rápido con un nuevo entorno de ejecución de JavaScript llamado Bun, que ahora está listo para producción con su versión 1.0. ¿Cómo ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/un-vistazo-rapido-a-bun-1-0-una-alternativa-a-node-js/</link>
                <guid isPermaLink="false">65c24f33aa1f2203f0eb0f2e</guid>
                
                    <category>
                        <![CDATA[ nodejs ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Node ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Node.js ]]>
                    </category>
                
                    <category>
                        <![CDATA[ bun ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Cristian Fernando Villca Gutierrez ]]>
                </dc:creator>
                <pubDate>Wed, 14 Feb 2024 19:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/02/But-why-is-that-relevant--2-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <h3 id="un-hombre-sabio-me-dijo-una-vez-cuando-empieces-a-comer-bun-panecillo-node-js-se-sentir-ins-pido-">Un hombre sabio me dijo una vez: "Cuando empieces a comer Bun (panecillo), Node.js se sentirá insípido".</h3><p>Pero ¿por qué es eso relevante? JavaScript se volvió mucho más rápido con un nuevo entorno de ejecución de JavaScript llamado Bun, que ahora está listo para producción con su versión 1.0.</p><p>¿Cómo y por qué es más rápido que Node.js? Me vienen a la mente muchas preguntas.</p><p>Responderé algunas de esas preguntas en este artículo. Y lo haré rápidamente, ya que ahora soy más rápido, al igual que JavaScript, que se prepara con Bun 1.0.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2023/09/But-why-is-that-relevant--3-.gif" class="kg-image" alt="But-why-is-that-relevant--3-" width="600" height="400" loading="lazy"></figure><p><strong>Bun es un conjunto de herramientas rápidas todo en uno para ejecutar, crear, probar y depurar JavaScript y TypeScript</strong>, desde un único archivo hasta una aplicación <em>full-stack</em>.</p><p>A continuación algunas cosas que podemos hacer con Bun:</p><h2 id="ejecuta-tu-c-digo-m-s-r-pido-con-bun">Ejecuta tu código más rápido con Bun</h2><p>Ahora no necesitamos herramientas como <code>npm</code>, <code>pnpm</code> o <code>yarn</code> porque Bun es 17 veces mas rápido. Eche un vistazo a los datos mostrados a continuación:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/02/266451126-23cbde35-b859-41b5-9480-98b88bf40c44.png" class="kg-image" alt="266451126-23cbde35-b859-41b5-9480-98b88bf40c44" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/02/266451126-23cbde35-b859-41b5-9480-98b88bf40c44.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2024/02/266451126-23cbde35-b859-41b5-9480-98b88bf40c44.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2024/02/266451126-23cbde35-b859-41b5-9480-98b88bf40c44.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/size/w2400/2024/02/266451126-23cbde35-b859-41b5-9480-98b88bf40c44.png 2400w" sizes="(min-width: 720px) 720px" width="2680" height="1324" loading="lazy"><figcaption>Comparación de velocidades entre Bun, pnpm, npm y yarn</figcaption></figure><p>Bun tarda solo 0,36 segundos en compilar su código, mientras que tarda unos 6,44 segundos en el caso de pnpm, 10,58 segundos con npm y 12,08 segundos con yarn.</p><h2 id="bun-soporta-hot-reloading">Bun soporta <em>hot reloading</em></h2><p>Bun soporta <em>hot reloading</em> (recarga en caliente) desde el primer momento, por lo que no necesita herramientas como Nodemon. Actualizará automáticamente el servidor cuando se ejecute JavaScript o TypeScript.</p><p>Puede reemplazar el comando <code>npm run</code> con <code>bun run</code> para ahorrar más de 150 ms milisegundos cada vez que ejecuta un comando.</p><p>Aquí un gráfico completo:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/02/Screenshot-2023-09-14-at-7.17.45-PM-1.png" class="kg-image" alt="Screenshot-2023-09-14-at-7.17.45-PM-1" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/02/Screenshot-2023-09-14-at-7.17.45-PM-1.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2024/02/Screenshot-2023-09-14-at-7.17.45-PM-1.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2024/02/Screenshot-2023-09-14-at-7.17.45-PM-1.png 1198w" sizes="(min-width: 720px) 720px" width="1198" height="434" loading="lazy"><figcaption>Promedio de tiempos de <em>hot realoding </em>usando diferentes paquetes</figcaption></figure><p>Según el cuadro anterior, el uso de <code>npm</code> tarda unos 176 ms en ejecutarse, <code>yarn</code> tarda unos 131 ms. En el caso de <code>pnpm</code>, se necesitan 259 ms. Sin embargo, en el caso de Bun, se necesitan unos 7 ms. Eso es rápido, ¿no?</p><h2 id="bun-es-un-empaquetador-javascript">Bun es un empaquetador JavaScript</h2><p>Bun también es un empaquetador de JavaScript con el mejor rendimiento de su clase y una API compatible con ESBuild, por lo que no necesitamos cosas como:</p><ul><li>ESBuild</li><li>Webpack</li><li>Parcel, .parcelrc</li><li>Rollup, rollup.config.js</li></ul><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/02/But-why-is-that-relevant--2-.gif" class="kg-image" alt="But-why-is-that-relevant--2-" width="1920" height="1080" loading="lazy"></figure><p>Bun ahora soporta Next.js, Remix, Nuxt, Astro, SvelteKit, Nest, SolidStart y Vite.</p><h2 id="bun-es-compatible-con-esm-y-commonjs">Bun es compatible con ESM y CommonJS</h2><p>Otra gran característica de Bun es que podemos usar módulos ES6 y CommonJs juntos en el mismo archivo, lo que no era posible en Node.js.</p><p>Puedes usar <code>import</code> y <code>require()</code> en el mismo archivo:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">import lodash from "lodash";
const _ = require("underscore");</code></pre><figcaption>ESM y CommonJs en el mismo archivo</figcaption></figure><p>Aparte de eso, Bun tiene soporte integrado para las API estándar web que están disponibles en los navegadores, como <code>fetch</code>, junto con la propia API de Bun como <code>Bun.file()</code> para leer un archivo de forma diferida y <code>Bun.Write()</code> para escribir un archivo al sistema de archivos local, que es mucho más simple que Node.js.</p><h2 id="ejemplo-bun-file-">Ejemplo <code>Bun.file()</code></h2><figure class="kg-card kg-code-card"><pre><code class="language-js">const archivo = Bun.file("package.json");
const contenido = await archivo.text();
</code></pre><figcaption>Leemos archivos del sistema de archivos con Bun</figcaption></figure><p>El código anterior leerá el contenido de un archivo <code>package.json</code> y transferirá su contenido a una nueva variable llamada <code>contenido</code>.</p><h2 id="ejemplo-bun-write-">Ejemplo <code>Bun.write()</code></h2><figure class="kg-card kg-code-card"><pre><code class="language-js">await Bun.write("index.html", "&lt;html/&gt;");
await Bun.write("index.html", Buffer.from("&lt;html/&gt;"));
await Bun.write("index.html", Bun.file("home.html"));
await Bun.write("index.html", 
await fetch("https://ejemplo.com/"));</code></pre><figcaption>Escribimos archivos en el sistema de archivos</figcaption></figure><p>En el código anterior, <code>Bun.write()</code> escribirá la cadena <code>"&lt;html/&gt;"</code>, o copiará el contenido del archivo <code>home.html</code> en el archivo <code>index.html</code>. Si tenemos que recuperar datos, obtendrá los resultados de una API web externa y escribirá el contenido en un archivo <code>index.html</code>.</p><h2 id="-por-que-bun-es-tan-r-pido">¿Por que Bun es tan rápido?</h2><p>Bun es rápido porque usa el motor JavaScriptCore, mientras que Node.js usa el motor JavaScript V8. El primero se ha optimizado para un tiempo de inicio más rápido.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/02/But-why-is-that-relevant.png" class="kg-image" alt="But-why-is-that-relevant" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/02/But-why-is-that-relevant.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2024/02/But-why-is-that-relevant.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2024/02/But-why-is-that-relevant.png 1600w" sizes="(min-width: 720px) 720px" width="1600" height="900" loading="lazy"><figcaption>Bun usa JavaScriptCore | Node usa V8</figcaption></figure><p>Si deseas hacer las cosas más rápido, debería considerar reemplazar Node.js con Bun.</p><h2 id="-c-mo-empezar-a-usar-bun">¿Cómo empezar a usar Bun?</h2><p>Puedes instalar Bun en sistemas MacOS y Linux usando <code>npm</code>:</p><figure class="kg-card kg-code-card"><pre><code class="language-shell">npm install -g bun</code></pre><figcaption>Comando para instalar Bun en MacOs y distribuciones Linux</figcaption></figure><p>Ahora ya está todo listo. Para instalar un paquete <code>npm</code>, haz esto:</p><figure class="kg-card kg-code-card"><pre><code class="language-shell">bun install &lt;nombre-paquete&gt;</code></pre><figcaption>Comando para instalar paquetes usando Bun</figcaption></figure><p>Para iniciar una aplicación, haz esto:</p><figure class="kg-card kg-code-card"><pre><code class="language-shell">bun run dev</code></pre><figcaption>Ejecutar una app Next.js</figcaption></figure><p>Para todo lo que pueda necesitar solo reemplace <code>npm</code> con <code>bun</code>.</p><p>Sin embargo, Bun sólo está listo para producción en los sistemas operativos MacOS y Linux. La versión de Windows aún es experimental. Por el momento, solo se admite el entorno de ejecución de JavaScript para Windows, y no el administrador de paquetes, el empaquetador ni el entorno de pruebas. <a href="https://bun.sh/docs/installation#windows">Puedes leer más al respecto aquí</a>.</p><h1 id="conclusi-n">Conclusión</h1><p>Este artículo muestra cómo puedes utilizar Bun como alternativa a Node.js y acelerar su tiempo de desarrollo.</p><p>También puedes ver mi vídeo sobre <a href="https://www.youtube.com/watch?v=q5UKY_dCmh4"><strong>El asesino de Node.js está aquí — Primer vistazo a Bun 1.0</strong></a><strong> (en inglés)</strong>.</p><p>Gracias por leer.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Notación de Punto vs Notación de Corchetes en Objetos JavaScript - ¿Cuál es la diferencia? ]]>
                </title>
                <description>
                    <![CDATA[ Hay varias formas de acceder a las propiedades de los objetos en JavaScript. Pero los dos más comunes son la notación de punto y la notación de corchetes. Explicaré la diferencia entre estos dos enfoques en este artículo. Con la notación de punto y de corchetes puedes:  * Acceder ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/notacion-de-punto-vs-notacion-de-corchetes-en-objetos-javascript-cual-es-la-diferencia/</link>
                <guid isPermaLink="false">65c15f45aa1f2203f0eb0b81</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Cristian Fernando Villca Gutierrez ]]>
                </dc:creator>
                <pubDate>Tue, 13 Feb 2024 19:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/02/19.-dot-vs-bracket-notation.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Hay varias formas de acceder a las propiedades de los objetos en JavaScript. Pero los dos más comunes son la notación de punto y la notación de corchetes.</p><p>Explicaré la diferencia entre estos dos enfoques en este artículo.</p><p>Con la notación de punto y de corchetes puedes:</p><ul><li>Acceder al valor de una propiedad por su clave.</li><li>Modificar el valor de una propiedad existente por su clave.</li><li>Agregar una nueva propiedad a un objeto.</li></ul><p>Pero estas dos formas acceden a las propiedades de manera diferente y existen diferentes escenarios en los que una es mejor que la otra.</p><h2 id="notaci-n-de-punto">Notación de punto</h2><p>La notación de punto implica el uso de un punto <code>.</code> y una clave para acceder a una propiedad. Aquí esta la sintaxis:</p><pre><code class="language-js">objeto.clave</code></pre><p>Tienes el punto y luego la clave de la propiedad a la que se desea acceder. Esta expresión devolverá el valor de la propiedad. Veamos un ejemplo:</p><pre><code class="language-js">const objeto = {
  nombre: "hola mundo",
  edad: 80,
  lenguaje: "javascript",
}

const resultado = objeto.nombre
// hola mundo</code></pre><p>Al usar el punto y la clave <code>nombre</code>, <code>.nombre</code> obtenemos "hola mundo", que es el valor de la propiedad <code>nombre</code>.</p><p>También puede usar esta notación para modificar una propiedad existente:</p><pre><code class="language-js">const objeto = {
  nombre: "hola mundo",
  edad: 80,
  lenguaje: "javascript",
}

objeto.edad = 100

console.log(objeto)
// {
//   nombre: "hola mundo",
//   edad: 100,
//   lenguaje: "javascript"
// }</code></pre><p>En este ejemplo modificamos la propiedad <code>edad</code>.</p><p>Además, es posible agregar una nueva propiedad siguiendo este enfoque:</p><pre><code class="language-js">const objeto = {
  nombre: "hola mundo",
  edad: 80,
  lenguaje: "javascript",
}

objeto.localizacion = "Mercurio"

console.log(objeto)
// {
//   nombre: "hola mundo",
//   edad: 80,
//   lenguaje: "javascript",
//   localizacion: "Mercurio"
// }</code></pre><p>Aquí agregamos la propiedad <code>localizacion</code>.</p><p>Este enfoque tiene limitaciones que veremos pronto. A continuación, comprendamos como funciona el enfoque de notación entre corchetes.</p><p>Existe una <a href="https://www.youtube.com/watch?v=AzVvBO65SMc">versión en video</a> (en inglés) sobre este tema si usted esta interesado. </p><h2 id="notaci-n-de-corchetes">Notación de Corchetes</h2><p>El enfoque de notación de corchetes implica el uso de corchetes, en los que se tiene una expresión que se evalúa como un valor. Ese valor sirve como clave para acceder a la propiedad. La sintaxis es la siguiente:</p><pre><code class="language-js">objeto[expresion]</code></pre><p>La expresión entre corchetes se evalúa como una clave para la propiedad a la que dese acceder y esta expresión devolverá el valor de la propiedad. Veamos un ejemplo:</p><pre><code class="language-js">const objeto = {
  nombre: "hola mundo",
  edad: 80,
  lenguaje: "javascript",
}

const resultado = objeto["nombre"]
// hola mundo</code></pre><p>Al usar corchetes y la expresión de cadena "nombre", <code>["nombre"]</code>, obtenemos <code>hola mundo</code> que es el valor de la propiedad nombre.</p><p>También se puede usar este enfoque para modificar una propiedad existente:</p><pre><code class="language-js">const objeto = {
  nombre: "hola mundo",
  edad: 80,
  lenguaje: "javascript",
}

objeto["edad"] = 100

console.log(objeto)
// {
//   nombre: "hola mundo",
//   edad: 100,
//   lenguaje: "javascript"
// }</code></pre><p>En este ejemplo modificamos la propiedad <code>edad</code> usando la expresión <code>"edad"</code> como cadena. </p><p>Es posible agregar una nueva propiedad usando corchetes de la siguiente manera:</p><pre><code class="language-js">const objeto = {
  nombre: "hola mundo",
  edad: 80,
  lenguaje: "javascript",
}

objeto["localizacion"] = "Mercurio"

console.log(objeto)
// {
//   nombre: "hola mundo",
//   edad: 80,
//   lenguaje: "javascript",
//   localizacion: "Mercurio"
// }</code></pre><p>Acá agregamos una nueva propiedad al objeto llamada <code>localizacion</code> usando la expresión <code>[localizacion]</code> como cadena.</p><h2 id="diferencias-entre-la-notaci-n-de-punto-y-la-notaci-n-de-corchetes">Diferencias entre la Notación de Punto y la Notación de Corchetes</h2><p><strong>La notación de punto solo permite claves estáticas</strong>, mientras que <strong>la notación de corchetes acepta claves dinámicas</strong>. La clave estática significa que la clave se escribe directamente, mientras que la clave dinámica significa que la clave se evalúa a partir de una expresión. </p><p>Veamos algunos ejemplos</p><h2 id="usando-ambos-enfoques-para-acceder-a-las-propiedades">Usando ambos enfoques para acceder a las propiedades</h2><p>Empecemos por la notación de punto:</p><pre><code class="language-js">const objeto = {
  nombre: "hola mundo",
  edad: 80,
  lenguaje: "javascript",
}

const miClave = "lenguaje"

const resultado = objeto.miClave
// undefined</code></pre><p>En este ejemplo asignamos el valor "lenguaje" a la variable <code>miClave</code>. Lo que se esperaría es que cuando usamos la notación de punto, como <code>objeto.miClave</code>, <code>miClave</code> se reemplace por <code>lenguaje</code>. Entonces se leería como <code>objeto.lenguaje</code> y devolvería <code>javascript</code>.</p><p>Pero eso no es lo que sucede. En cambio, el resultado es <code>undefined</code>.</p><p>La razón de esto es que<strong> la notación de punto solo acepta claves estáticas</strong>. Entonces, cuando hacemos <code>objeto.miClave</code>, JavaScript busca la propiedad con la clave <code>miClave</code> en la variable <code>objeto</code>. Pero esa propiedad no existe, por lo que devolvemos <code>undefined</code>.</p><p><strong>La notación de corchetes, por otro lado, permite claves dinámicas</strong>. Como esta notación acepta expresiones, puede utilizar cualquier expresión que se evalúe como un valor. Podría ser:</p><ul><li><code>hola + Eyy</code> evalúa a la clave <code>holaEyy</code>.</li><li><code>returnClave()</code> que se evalúa como clave.</li><li><code>isVerdad ? "claveVerdad" : "claveFalso"</code> evalúa como <code>claveVerdad</code> o como <code>claveFalso</code> para la clave.</li><li><code>variable</code> evalúa según el valor de la variable para la clave.</li></ul><p>Por lo tanto usando el ejemplo anterior, podemos tener lo siguiente:</p><pre><code class="language-js">const objeto = {
  nombre: "hola mundo",
  edad: 80,
  lenguaje: "javascript",
}

const miClave = "lenguaje"

const resultado = objeto[miClave]
// javascript</code></pre><p>La expresión que pasamos entre corchetes es <code>miClave</code>, que es una variable. Esta expresión se evalúa como <code>lenguaje</code>, que es el valor de la variable. Usando este valor, los corchetes pueden obtener el valor de la propiedad que es <code>javascript</code>.</p><p>Pero si pasa una expresión de cadena como <code>miClave</code> quedará como <code>undefined</code>:</p><pre><code class="language-javascript">const objeto = {
  nombre: "hola mundo",
  edad: 80,
  lenguaje: "javascript",
}

const miClave = "lenguaje"

const resultado = objeto["miClave"]
// undefined</code></pre><p>Esto se debe a que la expresión de cadena <code>miClave</code> se evalúa como el valor <code>miClave</code> que sirve como clave para acceder a la propiedad. Como no hay una clave <code>miClave</code> en <code>objeto</code>, el valor devuelto será <code>undefined</code>.</p><h2 id="usando-ambos-enfoques-para-modificar-propiedades">Usando ambos enfoques para modificar propiedades</h2><p>Empecemos con la notación de punto:</p><pre><code class="language-js">const objeto = {
  nombre: "hola mundo",
  edad: 80,
  lenguaje: "javascript",
}

const miClave = "edad"

objeto.miClave = 100

console.log(objeto)
// {
//   nombre: "hola mundo",
//   edad: 80,
//   lenguaje: "javascript",
//   miClave: 100
// }</code></pre><p>Tenemos <code>miClave</code> con el valor "edad". Al intentar hacer <code>objeto.miClave = 100</code> para modificar la propiedad edad, no funcionará. Esto se debe a que la notación de puntos acepta una clave estatática. Entonces <code>objeto.miClave</code> toma <code>miClave</code> como clave. Como <code>miClave</code> no existe en la declaración del objeto esta declaración se agrega. Entonces, <code>objeto</code> tiene una nueva clave, <code>miClave</code> con el valor de <code>100</code>.</p><p>El comportamiento es diferente con la notación de corchetes:</p><pre><code class="language-javascript">const objeto = {
  nombre: "hola mundo",
  edad: 80,
  lenguaje: "javascript",
}

const miClave = "edad"

objeto[miClave] = 100

console.log(objeto)
// {
//   nombre: "hola mundo",
//   edad: 100,
//   lenguaje: "javascript"
// }</code></pre><p>En lugar de agregar una nueva propiedad <code>miClave</code> a <code>objeto</code>, el enfoque entre corchetes modifica la propiedad <code>edad</code>. La razón es que pasamos <code>miClave</code> como expresión entre corchetes. Esta expresión como variable, se evalúa como <code>edad</code> que es el valor de la variable. Usando <code>edad</code> como clave, este enfoque modifica el valor de la propiedad <code>edad</code> a <code>100</code>.</p><p>Y si quisiéramos agregar una nueva propiedad usando corchetes, entonces podemos pasar una expresión que devuelva una nueva clave que no existe, por ejemplo:</p><pre><code class="language-js">const objeto = {
  nombre: "hola mundo",
  edad: 80,
  lenguaje: "javascript",
}

const miClave = "localizacion"

objeto[miClave] = "Mercurio"

console.log(objeto)
// {
//   nombre: "hola mundo",
//   edad: 100,
//   lenguaje: "javascript",
//   localizacion: "Mercurio"
// }</code></pre><p>La variable <code>miClave</code> contiene un nuevo valor: <code>localizacion</code>. Al pasar esto entre corchetes y asignar un valor de "Mercurio" ahora tenemos una nueva propiedad con par clave-valor <code>localizacion</code> y <code>Mercurio</code>.</p><h2 id="-deber-a-usar-notaci-n-de-punto-o-de-corchetes">¿Debería usar notación de punto o de corchetes?</h2><p>Hasta ahora, hemos visto cómo funciona cada notación, usando diferentes ejemplos para acceder/modificar propiedades existentes y para agregar nuevas propiedades. Entonces, ¿cuál debería utilizar al escribir código JavaScript?</p><p>El principal factor que te ayudará a tomar una decisión es la clave de la propiedad a la que deseas acceder. Si es una clave estática, utilice la notación de punto. Pero si es una clave dinámica (evaluada a partir de una expresión durante el tiempo de ejecución), use la notación de corchetes.</p><p>La notación de punto es útil cuando conoce la propiedad de antemano. Simplemente haga <code>objecto.clave</code> para leer/modificar una propiedad existente o para agregar una nueva propiedad.</p><p>La notación de corchetes es útil cuando desea acceder dinámicamente a una propiedad. La clave de esta propiedad podría provenir de expresiones como <code>obtenterClave()</code>, <code>"my" + "clave"</code> o <code>claveVariable</code>.</p><p>Espero que hayas podido comprender el artículo. </p><p>Por favor comparte si te resultó útil.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Todo en mayúsculas con CSS: ¿Cómo poner texto en mayúsculas con estilo? ]]>
                </title>
                <description>
                    <![CDATA[ Cuando se diseña un sitio web o se trabaja en un proyecto, es posible que desees utilizar texto en mayúsculas por varias razones. Tal vez quieras usar una abreviatura o un acrónimo, enfatizar cierto texto o usarlo como encabezado. Hay varias maneras de poner texto en mayúsculas con HTML. La ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/todo-en-mayusculas-con-css-como-poner-texto-en-mayusculas-con-estilo/</link>
                <guid isPermaLink="false">65ba4de8aa1f2203f0eb029e</guid>
                
                    <category>
                        <![CDATA[ CSS ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Cristian Fernando Villca Gutierrez ]]>
                </dc:creator>
                <pubDate>Tue, 06 Feb 2024 06:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/01/how-to-uppercase-text-in-CSS.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/all-caps-in-css-how-to-uppercase-text-with-style/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">All Caps in CSS - How to Uppercase Text with Style</a>
      </p><h3 id="cuando-se-dise-a-un-sitio-web-o-se-trabaja-en-un-proyecto-es-posible-que-desees-utilizar-texto-en-may-sculas-por-varias-razones-tal-vez-quieras-usar-una-abreviatura-o-un-acr-nimo-enfatizar-cierto-texto-o-usarlo-como-encabezado-">Cuando se diseña un sitio web o se trabaja en un proyecto, es posible que desees utilizar texto en mayúsculas por varias razones. Tal vez quieras usar una abreviatura o un acrónimo, enfatizar cierto texto o usarlo como encabezado.</h3><p>Hay varias maneras de poner texto en mayúsculas con HTML. La primera es escribir el texto en mayúsculas directo en el HTML:</p><pre><code class="language-html">&lt;p&gt;TEXTO EN MAYUSCULAS&lt;/p&gt;
</code></pre><p>La segunda forma es utilizar el método de cadenas de JavaScript <code>toUpperCase()</code> y representarlo en el DOM:</p><pre><code class="language-javascript">const mayusculas = cedena.toUpperCase()

// aqui se muestra en pantalla</code></pre><p>La tercera forma, que veremos en este artículo, es usar la propiedad de transformación de texto de CSS:</p><pre><code class="language-css">selector {
  text-transform: uppercase;
}</code></pre><p>Esto aplica el estilo de mayúsculas en el elemento seleccionado.</p><p>Esta declaración no cambia el contenido del DOM. Por ejemplo, echa un vistazo a este código HTML:</p><pre><code class="language-html">&lt;p class='parrafo'&gt;
  Some text
&lt;/p&gt;</code></pre><p>Y a este estilo:</p><pre><code class="language-css">.parrafo {
  text-transform: uppercase;
}</code></pre><p>En la UI, el texto tendrá un estilo como el siguiente:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/01/image-137.png" class="kg-image" alt="image-137" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/01/image-137.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2024/01/image-137.png 1000w" sizes="(min-width: 720px) 720px" width="1000" height="285" loading="lazy"><figcaption>Texto en mayúsculas con CSS&nbsp;</figcaption></figure><p>Pero en el DOM, el texto sigue siendo el mismo:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/01/image-139-1.png" class="kg-image" alt="image-139-1" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/01/image-139-1.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2024/01/image-139-1.png 1000w" sizes="(min-width: 720px) 720px" width="1000" height="144" loading="lazy"><figcaption>El DOM no se altera, solo la vista en la UI</figcaption></figure><p>Cuando copias el texto en el navegador, el texto original "Some text" se copia en algunos navegadores, pero en otros se copia la versión con estilo. </p><h2 id="-deber-as-usar-text-transform-en-css-u-otros-m-todos">¿Deberías usar <code>text-transform</code> en CSS u otros métodos?</h2><p>Si usas mayúsculas por razones de estilo te recomiendo que uses CSS. La razón es que puede haber inconsistencias en la forma en la que los diferentes navegadores y las herramientas del navegador manejan el texto en mayúsculas.</p><p>Una de las diferencias es la inconsistencia entre copiar y pegar el texto en diferentes navegadores.</p><p>Otra inconsistencia es que algunos lectores de pantalla interpretan el texto en mayúsculas como abreviaturas. Por lo tanto, un texto como "SOME TEXT" se leerá como "S.O.M.E. T.E.X.T.", lo que puede afectar la manera en la que el lector comprende el mensaje.</p><p>Sin embargo, vale la pena señalar que algunos lectores de pantalla también interpretan el texto en mayúsculas con CSS como abreviaturas.</p><p>Se recomienda mantener los estilos como estilos. Si deseas tener texto en mayúsculas solo por motivos de estilo, usa CSS y deja el texto original en HTML. Pero si usas mayúsculas para abreviaturas o tienes un motivo específico para tener texto en mayúsculas, puedes escribirlo en HTML.</p><p>Puedes consultar este <a href="https://twitter.com/Mandy_Kerr/status/1285866670284668930">tweet sobre mayúsculas sin CSS</a> para ver las discusiones al respecto. </p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
