<?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[ Cristina Padilla - 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[ Cristina Padilla - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/espanol/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sun, 24 May 2026 19:37:24 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/espanol/news/author/cristinapadilla/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ La función length en Python: Cómo averiguar el tamaño de una lista ]]>
                </title>
                <description>
                    <![CDATA[ Una lista en Python es una estructura de datos que contiene múltiples elementos en un orden determinado. En ocasiones es necesario saber el tamaño de una lista. En este artículo te enseñaré cómo hacerlo. Cómo crear una lista en Python Puedes crear listas en Python usando paréntesis. Dentro de estos ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/la-funcion-length-en-python-como-averiguar-el-tamano-de-una-lista/</link>
                <guid isPermaLink="false">63f4a00b22450a0629add3b4</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Cristina Padilla ]]>
                </dc:creator>
                <pubDate>Tue, 14 Mar 2023 20:53:30 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/02/18.-length-of-list.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/python-length-of-list-how-to-find-the-size-of-a-list/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Python Length of List – How to Find the Size of a List</a>
      </p><p>Una lista en Python es una estructura de datos que contiene múltiples elementos en un orden determinado. En ocasiones es necesario saber el tamaño de una lista. En este artículo te enseñaré cómo hacerlo.</p><h2 id="c-mo-crear-una-lista-en-python">Cómo crear una lista en Python</h2><p>Puedes crear listas en Python usando paréntesis. Dentro de estos tienes que especificar los elementos (o valores) separados por comas.</p><p>Estos valores pueden ser cadenas, números, listas, etc.: </p><pre><code class="language-python">items = ["python", True, [50, 30], 80]

print(items)
# ['python', True, [50, 30], 80]

print(items[2][0])
# 30
</code></pre><p>Aquí tenemos una lista anidada.</p><p>Entonces, ¿cómo podemos averiguar el tamaño de una lista? En una lista que contenga pocos elementos, resulta sencillo contarlos manualmente. Sin embargo, en una lista más larga, la situación se complica.</p><p>Con Python puedes averiguarlo fácilmente. Te enseñaré dos formas de hacerlo: la versión más larga y la más corta.</p><p>También tengo un <a href="https://youtu.be/Ao9P6zTGMgQ">breve vídeo sobre este tema</a> que puedes consultar.</p><h2 id="c-mo-averiguar-el-tama-o-de-una-lista-usando-for-loop-en-python">Cómo averiguar el tamaño de una lista usando <code>for loop</code> en Python</h2><p>Puedes averiguar el tamaño de una lista con un bucle que vaya iterando a través de la lista y haga un seguimiento del tamaño usando una variable. A continuación puedes ver a lo que me refiero:</p><pre><code class="language-python">lenguajes = ["python", "javascript", "ruby", "java", "go"]

# inicializar el tamaño de la variable
size = 0

for value in lenguajes:
  # incrementar la variable en cada bucle
  size = size + 1

print(size)
# 5
</code></pre><p>En este ejemplo, tenemos un arreglo con cinco valores. Primero, inicializamos la variable <code>size</code> con 0. Después declaramos el bucle <code>for</code>, el cual itera a través de cada valor del arreglo. Cada iteración incrementa la variable <code>size</code> en 1. Al final, la variable <code>size</code> contendrá el tamaño total de la lista.</p><p>Echemos un vistazo a la versión corta.</p><h2 id="c-mo-averiguar-el-tama-o-de-una-lista-usando-la-funci-n-len-en-python">Cómo averiguar el tamaño de una lista usando la función <code>len</code> en Python</h2><p>La función <code>len</code> devuelve el número de valores de un elemento iterable en Python. Es una función muy simple y eficiente para este propósito. Un elemento iterable puede ser una lista o un diccionario.</p><p>Veamos un ejemplo de cómo conseguir el tamaño de una lista:</p><pre><code class="language-python">lenguajes = ["python", "javascript", "ruby", "java", "go"]

length = len(lenguajes)

print(length)
# 5
</code></pre><p>Si pasamos la lista <code>lenguajes</code> como argumento a <code>len</code>, la función devolverá el número de valores en ella, el cual es 5.</p><p>Como mencioné anteriormente, la función <code>len</code> no es solo útil con listas. También puedes usarla con diccionarios y cadenas:</p><pre><code class="language-python">dicc = {
  "nombre": "Dillion",
  "edad": 70,
  "lenguaje": "python"
}

print(len(dicc))
# 3

frase = "Soy Dillion"

print(len(dicc))
# 11
</code></pre><p>En cuanto al diccionario <code>dict</code>, <code>len</code> devuelve el número de propiedades. Para la cadena <code>frase</code>, <code>len</code> devuelve el número de caracteres.</p><h2 id="resumiendo">Resumiendo</h2><p>En este artículo, hemos visto cómo saber el tamaño de una lista usando una versión larga - la declaración <code>for loop</code> - y una versión más corta y eficiente - la función <code>len</code>.</p><p>Si te ha gustado el artículo, por favor compártelo. :)</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Explicación de Gitignore: Qué es Gitignore y cómo añadirlo a tu repositorio ]]>
                </title>
                <description>
                    <![CDATA[ El archivo .gitignore es un archivo de texto que le dice a Git qué otros archivos y carpetas de un proyecto debe ignorar. Un archivo .gitignore local se coloca normalmente en el directorio de origen de un proyecto. También puedes crear un archivo .gitignore global y cualquier entrada que contenga ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/gitignore-que-es-gitignore-y-como-anadirlo-a-tu-repositorio/</link>
                <guid isPermaLink="false">632466f570a5cb0907d689e9</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Cristina Padilla ]]>
                </dc:creator>
                <pubDate>Fri, 21 Oct 2022 00:07:51 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/10/5f9c9e43740569d1a4ca3c32.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/gitignore-what-is-it-and-how-to-add-to-repo/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Gitignore Explained: What is Gitignore and How to Add it to Your Repo</a>
      </p><p>El archivo <code>.gitignore</code> es un archivo de texto que le dice a Git qué otros archivos y carpetas de un proyecto debe ignorar.</p><p>Un archivo <code>.gitignore</code> local se coloca normalmente en el directorio de origen de un proyecto. También puedes crear un archivo <code>.gitignore</code> global y cualquier entrada que contenga será ignorada en todos tus repositorios Git por igual.</p><p>Para crear un archivo <code>.gitignore</code> local, crea un archivo de texto y llámalo <code>.gitignore</code> (recuerda incluir el <code>.</code> al principio). Después edita el archivo como sea necesario. Cada línea nueva debería contener el archivo o carpeta que quieres que Git ignore.</p><p>Las entradas en este archivo también pueden seguir un modelo similar.</p><ul><li><code>*</code> se usa para encontrar coincidencias</li><li><code>/</code> se usa para ignorar nombres de ruta relacionados con el archivo <code>.gitignore</code></li><li><code>#</code> se usa para añadir comentarios al archivo <code>.gitignore</code></li></ul><p>Este es un ejemplo de cómo se vería un archivo <code>.gitignore</code>:</p><pre><code class="language-text"># Ignorar archivos del sistema de Mac
.DS_store

# Ignorar carpeta node_modules
node_modules

# Ignorar todos los archivos de texto
*.txt

# Ignorar archivos relacionados con claves de una API
.env

# Ignorar archivos de configuración SASS
.sass-cache</code></pre><p>Para añadir o cambiar tu archivo .gitignore global, ejecuta el siguiente comando:</p><pre><code class="language-bash">git config --global core.excludesfile ~/.gitignore_global</code></pre><p>Esto creará el archivo &nbsp;<code>~/.gitignore_global</code>. Ahora puedes editar ese archivo de la misma manera que un archivo <code>.gitignore</code> local. Todos tus repositorios Git ignorarán los archivos y carpetas que aparecen enumerados en el archivo <code>.gitignore</code> global.</p><h3 id="c-mo-dejar-de-rastrear-archivos-previamente-confirmados-en-gitignore">Cómo dejar de rastrear archivos previamente confirmados en Gitignore </h3><p>Para dejar de seguir <em>un único</em> archivo, es decir, dejar de rastrear el archivo, pero no eliminarlo del sistema puedes usar:</p><p><code>git rm --cached filename</code></p><p>Para dejar de rastrear todos los archivos en <code>.gitignore</code>:</p><p>Primero <strong>confirma</strong> cualquier cambio pendiente en el código y después ejecuta:</p><p><code>git rm -r --cached</code></p><p>Esto elimina cualquier archivo modificado del área de staging, después ejecuta:</p><p><code>git add .</code></p><p>Confírmalo:</p><p><code>git commit -m ".gitignore is now working"</code></p><p>Para deshacer <code>git rm --cached filename</code>, use <code>git add filename</code></p><h3 id="m-s-informaci-n-"><strong>Más información:</strong></h3><ul><li>Documentación sobre Git: <a href="https://git-scm.com/docs/gitignore" rel="nofollow">gitignore</a></li><li>Ignorar archivos: <a href="https://docs.github.com/es/get-started/getting-started-with-git/ignoring-files">GitHub</a></li><li>Plantillas útiles de <code>.gitignore</code>: <a href="https://github.com/github/gitignore" rel="nofollow">GitHub</a></li></ul> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ JavaScript sincronía vs asincronía - Call Stack, Promesas y más ]]>
                </title>
                <description>
                    <![CDATA[ Permíteme comenzar este artículo preguntando "¿Qué es JavaScript?" Bueno, aquí está la respuesta más confusa pero precisa que he encontrado hasta ahora: > JavaScript es un lenguaje de programación de un solo procesamiento secuencial, no bloqueador, asíncrono, simultáneo y con mucha flexibilidad. Espera un momento - ¿dije de un solo ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/sincrono-vs-asincrono-en-javascript/</link>
                <guid isPermaLink="false">62ecce77b4def508519774a1</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Cristina Padilla ]]>
                </dc:creator>
                <pubDate>Thu, 22 Sep 2022 18:10:02 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/08/freeCodeCamp-Cover-2.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/synchronous-vs-asynchronous-in-javascript/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Synchronous vs Asynchronous JavaScript – Call Stack, Promises, and More</a>
      </p><p>Permíteme comenzar este artículo preguntando "¿Qué es JavaScript?" Bueno, aquí está la respuesta más confusa pero precisa que he encontrado hasta ahora:</p><blockquote>JavaScript es un lenguaje de programación de un solo procesamiento secuencial, no bloqueador, asíncrono, simultáneo y con mucha flexibilidad.</blockquote><p>Espera un momento - ¿dije de un solo procesamiento secuencial y asíncrono al mismo tiempo? Si comprendes lo que significa de un solo procesamiento secuencial, probablemente lo asociarás a operaciones síncronas. Entonces, ¿cómo puede ser JavaScript asíncrono?</p><p>En este artículo, aprenderemos todo sobre las partes síncronas y asíncronas de JavaScript. Normalmente, ambas se usan en la programación web a diario.</p><p>Si prefieres aprender con un vídeo, el contenido de este artículo está disponible también como vídeotutorial aquí: ?</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.25%;" class="fluid-width-video-wrapper">
            <iframe src="https://www.youtube.com/embed/pIjfzjsoVw4?feature=oembed" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" title="Embedded content" loading="lazy" name="fitvid0" frameborder="0" width="256" height="144"></iframe>
          </div>
        </div>
      </figure><h1 id="en-este-art-culo-aprender-s-">En este artículo, aprenderás:</h1><ul><li>Por qué JavaScript es síncrono.</li><li>En qué circunstancias se dan las operaciones asíncronas cuando JavaScript es de un solo procesamiento secuencial.</li><li>Cómo los términos síncrono y asíncrono te ayudarán a comprender mejor las promesas en JavaScript.</li><li>Muchos y sencillos, pero muy potentes ejemplos que muestran estos conceptos en detalle.</li></ul><h1 id="las-funciones-de-javascript-son-ciudadanos-de-primera-clase">Las funciones de JavaScript son ciudadanos de primera clase</h1><p>En JavaScript puedes crear y modificar una función, usarla como argumento, devolverla desde otra función y asignarla a una variable. Todas estas habilidades nos permiten usar las funciones en cualquier parte para colocar una cantidad de código de manera lógica. &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/08/block-function.png" class="kg-image" alt="block-function" width="600" height="400" loading="lazy"><figcaption>Líneas de código organizadas en funciones de manera lógica</figcaption></figure><p>Necesitamos decirle al motor de JavaScript que ejecute las funciones invocándolas. Sería algo como esto:</p><pre><code class="language-js">// Definir una función
function f1() {
    // Hacer algo
    // Hacer algo otra vez
    // Otra vez
    // Etcétera...
}

// Invocar a la función
f1();</code></pre><p>‌‌Por defecto, cada línea de la función se ejecuta secuencialmente, una línea tras otra. Lo mismo ocurre cuando invocas múltiples funciones en tu código. Línea tras línea.</p><h1 id="javascript-s-ncrono-c-mo-funciona-la-ejecuci-n-de-un-conjunto-de-funciones">JavaScript síncrono - Cómo funciona la ejecución de un conjunto de funciones</h1><p>¿Qué sucede cuando defines una función y luego la invocas? El motor de JavaScript mantiene una pila de ejecución de datos llamada <code>function execution stack</code>. El objetivo de esto es hacer un seguimiento de la ejecución de la función. Realiza lo siguiente:</p><ul><li>Cuando el motor de JavaScript invoca la función, la añade a la pila de ejecución y la ejecución comienza.</li><li>Si la función que está siendo ejecutada llama a otra función, el motor añade esta segunda función a la pila y comienza a ejecutarla.</li><li>Una vez terminada la ejecución de la segunda función, el motor la saca de la pila.</li><li>Se vuelve a la ejecución de la primera función desde el punto donde se dejó la última vez.</li><li>Cuando la ejecución de la primera función haya finalizado, el motor la saca de la pila.</li><li>Se continúa de esta manera hasta que no queda nada en la pila.</li></ul><p>También se conoce a la pila de ejecución de funciones como <code>Call Stack</code>.‌</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/09/stack.png" class="kg-image" alt="stack" width="600" height="400" loading="lazy"><figcaption>Pila de ejecución de funciones o Call Stack</figcaption></figure><p>Echémosle un vistazo a un ejemplo de tres funciones que se ejecutan una a una:</p><pre><code class="language-js">function f1() {
  // algo de código
}
function f2() {
  // algo de código
}
function f3() {
  // algo de código
}

// Invoca a las funciones una a una
f1();
f2();
f3();</code></pre><p>Ahora veamos qué sucede con la pila de ejecución de funciones‌:‌</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/09/first-flow.gif" class="kg-image" alt="first-flow" width="600" height="400" loading="lazy"><figcaption>Este ejemplo muestra paso a paso el orden de la ejecución</figcaption></figure><p>¿Has visto lo que sucede aquí? Primero, <code>f1()</code> va a la pila, se ejecuta y sale. Después <code>f2()</code> hace lo mismo y finalmente <code>f3()</code> también. Después de este proceso, la pila se encuentra vacía, sin nada más que ejecutar.</p><p>Ok, vamos a ver ahora un ejemplo más complejo. Aquí la función <code>f3()</code> invoca a la función <code>f2()</code> que a su vez invoca también a la función <code>f1()</code>. &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</p><pre><code class="language-js">function f1() {
  // Algo de código
}
function f2() {
  f1();
}
function f3() {
  f2();
}
f3();</code></pre><p>‌Vamos a ver qué ocurre en la pila de ejecución de funciones:‌</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/09/second-flow.gif" class="kg-image" alt="second-flow" width="600" height="400" loading="lazy"><figcaption>Este ejemplo muestra paso a paso el orden de la ejecución</figcaption></figure><p>Observa cómo <code>f3()</code> va a la pila en primer lugar invocando a la función <code>f2()</code>. Así pues, <code>f2()</code> también se añade a la pila mientras <code>f3()</code> aún está en ella. La función <code>f2()</code>invoca a <code>f1()</code>, la cual se añade a la pila junto con <code>f2()y f3()</code>.</p><p>En primer lugar, <code>f1()</code> termina de ejecutarse y sale de la pila. Justo después <code>f2()</code> termina, y finalmente <code>f3()</code>.</p><p>En resumen, todo lo que sucede dentro de la pila de ejecución de funciones es secuencial. Ésta es la parte síncrona de JavaScript. El procesamiento de JavaScript se asegura de que todo lo que está en la pila se ejecuta antes de comenzar con algo nuevo.</p><p>¡Estupendo! Ahora que comprendemos cómo funcionan las operaciones síncronas en JavaScript, podemos indagar en su lado asíncrono. ¿Estás preparad@?</p><h1 id="javascript-as-ncrono-c-mo-funcionan-las-apis-del-navegador-y-las-promesas">JavaScript asíncrono - Cómo funcionan las APIs del Navegador y las Promesas</h1><p>La palabra asincronía significa que <strong>no sucede al mismo tiempo</strong>. ¿Qué significa esto en el contexto de JavaScript?</p><p>Por lo general, la ejecución de cosas secuencialmente funciona bien. Sin embargo, a veces puede que necesites tomar datos de un servidor o retrasar la ejecución de una función, algo que no prevés que ocurra AHORA. Es decir, quieres que tu código se ejecute de manera <strong>asíncrona</strong>.</p><p>Bajo estas circunstancias, es posible que no quieras que el motor de JavaScript detenga la ejecución de otro código secuencial. Para ello, el motor de JavaScript necesita manejar las cosas un poco más eficientemente en este caso.</p><p>Podemos clasificar la mayoría de las operaciones asíncronas de JavaScript de 2 maneras:</p><ol><li>Eventos o funciones<strong> Browser API/Web API</strong>. Estos incluyen métodos como <code>setTimeout</code>, o controladores de eventos como clic, mouse over, scroll y muchos más.</li><li><strong>Promesas</strong>. Un objeto único en JavaScript que nos permite realizar operaciones asíncronas.</li></ol><p>No te preocupes si las promesas son un concepto nuevo para ti. Por ahora no necesitas saber más para poder seguir este artículo. Al final del artículo, he añadido algunos enlaces para principiantes para que puedas aprender sobre las promesas.</p><h2 id="c-mo-manejar-las-apis-de-un-navegador-web-apis">Cómo manejar las APIs de un navegador/Web APIs</h2><p>Las APIs del navegador como <code>setTimeout</code> y los controladores de eventos dependen de las funciones <code>callback</code> . Una función callback se ejecuta cuando una operación asíncrona se completa. A continuación puedes ver un ejemplo de cómo funciona la función <code>setTimeout</code> :</p><pre><code class="language-js">function printMe() {
  console.log('print me');
}

setTimeout(printMe, 2000);</code></pre><p>La función <code>setTimeout</code> ejecuta una función después de que haya transcurrido un determinado tiempo. En el código anterior, el texto <code>print me</code> se muestra en la consola después de 2 segundos.</p><p>Imagínate que tenemos las siguientes líneas de código después de la función &nbsp;<code>setTimeout</code> :</p><pre><code class="language-js">function printMe() {
  console.log('print me');
}

function test() {
  console.log('test');
}

setTimeout(printMe, 2000);
test();
</code></pre><p>¿Qué esperamos que ocurra aquí? ¿Cuál crees que será el resultado?</p><p>¿Esperará el motor de JavaScript esperará durante 2 segundos para invocar la función <code>test()</code> y el resultado será?:</p><pre><code class="language-shell">printMe
test</code></pre><p>¿O se las arreglará para mantener la función callback <code>setTimeout</code> a un lado y continuará ejecutando el resto? Así que el resultado podría ser el siguiente:</p><pre><code class="language-shell">test
printMe</code></pre><p>Si apostaste por la segunda opción, estás en lo cierto. Ahí es donde entra en juego el mecanismo asíncrono.</p><h2 id="c-mo-funciona-el-callbak-queue-en-javascript-o-la-cola-de-tareas-">Cómo funciona el Callbak Queue en JavaScript (o la cola de tareas )</h2><p>JavaScript mantiene una cola de funciones callback conocida como callback queue o task queue. La cola de una estructura de datos es <code>First-In-First-Out(FIFO)</code>. Es decir, la función callback que se añada primero a la cola tiene la oportunidad de salir primero. Pero la pregunta es:</p><ul><li>¿Cuándo la pone el motor de JavaScript en la cola?</li><li>¿Cuándo la saca el motor de JavaScript de la cola?</li><li>¿A dónde va cuando sale de la cola?</li><li>Y lo que es más importante, ¿cómo relacionamos todo esto con la parte asíncrona de JavaScript?</li></ul><p>¡Vaya, cuántas preguntas! Vamos a averiguar las repuestas con la ayuda de la siguiente imagen:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/09/taskQ.png" class="kg-image" alt="taskQ" width="600" height="400" loading="lazy"></figure><p>La imagen superior muestra el <code>call stack</code> que ya hemos visto. Existen dos secciones más que rastrear si la API de un navegador (como setTimeout) se activa y pone la función callback de la API a la cola.</p><p>El motor de JavaScript sigue ejecutando las funciones en el call stack. Como no pone la función callback directamente en la pila, no hay código alguno esperando ni bloqueando la ejecución en la pila.</p><p>El motor crea un bucle que busca en la cola regularmente para encontrar lo que necesita extraer. Extrae una función callback de la cola a la call stack cuando la pila está vacía. Es entonces cuando la función callback se ejecuta como cualquier otra función en el stack. El bucle continúa. Este bucle se conoce como <code>Event Loop</code>.</p><p>Así que la moraleja de la historia es la siguiente:</p><ul><li>Si la API de un navegador se activa, las funciones callback se quedan en la cola.</li><li>El código se sigue ejecutando de manera normal en la pila.</li><li>El event loop comprueba si hay una función callback en la cola.</li><li>Si es así, pasa la función callback de la cola a la pila y la ejecuta.</li><li>El bucle continúa.</li></ul><p>Ahora vamos a ver cómo funciona el siguiente código:</p><pre><code class="language-js">function f1() {
    console.log('f1');
}

function f2() {
    console.log('f2');
}

function main() {
    console.log('main');
    
    setTimeout(f1, 0);
    
    f2();
}

main();</code></pre><p>El código ejecuta una función <code>setTimeout</code> con una función callback <code>f1()</code>. Ten en cuenta que le hemos asignado un valor de 0 como retraso. Esto significa que esperamos que la función <code>f1()</code> se ejecute inmediatamente. Justo después de setTimeout, ejecutamos la función <code>f2()</code>.</p><p>¿Cuál crees que será el resultado? Aquí lo tienes:</p><pre><code class="language-shell">main
f2
f1</code></pre><p>Podrías estar pensando que <code>f1</code> debería imprimirse antes que <code>f2</code>, ya que no hemos retrasado la ejecución de <code>f1.</code> Sin embargo, ese no es el caso. ¿Recuerdas el mecanismo del <code>event loop</code> mencionado anteriormente? Vamos a ver el código anterior paso a paso:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/09/third-flow.gif" class="kg-image" alt="third-flow" width="600" height="400" loading="lazy"><figcaption>Event loop - observa la ejecución paso a paso</figcaption></figure><p>Aquí tienes los pasos descritos:</p><ol><li>La función <code>main()</code> entra en el call stack.</li><li>Tiene una función console log para imprimir la palabra main. Se ejecuta el <code>console.log('main')</code> y sale del stack.</li><li>Se lleva a cabo la API del navegador setTimeout.</li><li>La función callback entra en el callback queue.</li><li>La ejecución se produce de manera normal en el stack, así que <code>f2()</code> pasa al stack. Se ejecuta el console log de la función <code>f2()</code>y ambos salen del stack.</li><li>La función <code>main()</code> también sale del stack.</li><li>El event loop identifica que el call stack está vacío y que hay una función callback en la cola.</li><li>La función callback <code>f1()</code> pasa al stack. Comienza la ejecución. El console log se ejecuta y <code>f1()</code> también sale del stack.</li><li>En este punto, no hay nada más que ejecutar ni en el stack ni en la cola.</li></ol><p>Espero que ahora comprendas cómo funciona internamente la parte asíncrona de JavaScript. Pero eso no es todo. Aún nos queda echarle un vistazo a las <code>promesas</code>.</p><h2 id="c-mo-maneja-el-motor-de-javascript-las-promesas">Cómo maneja el motor de JavaScript las promesas</h2><p>En JavaScript las promesas son objetos especiales que ayudan a realizar operaciones asíncronas.</p><p>Puedes crear una promesa usando el constructor <code>Promise</code>. Necesitas pasarle una función llamada <code>executor</code>. En esta función defines lo que quieres hacer cuando una promesa devuelva algo con éxito o ,por el contrario, dé error. Puedes hacer esto llamando los métodos<code>resolve</code> y <code>reject</code>.</p><p>Aquí tienes un ejemplo de una promesa en JavaScript:</p><pre><code class="language-js">const promise = new Promise((resolve, reject) =&gt;
        resolve('I am a resolved promise');
);</code></pre><p>Después de que la promesa se ejecute, podemos manejar el resultado con el método <code>.then()</code> y el error con el método <code>.catch()</code>.</p><pre><code class="language-js">promise.then(result =&gt; console.log(result))</code></pre><p>Las promesas se usan cada vez que utilices el método <code>fetch()</code> para tomar datos de una tienda.</p><p>El punto aquí es que el motor de JavaScript no usa el mismo <code>callback queue</code> que vimos anteriormente con las APIs del navegador. Usa otra cola especial llamada cola de trabajo o <code>Job Queue</code>.</p><h2 id="-qu-es-la-job-queue-en-javascript">¿Qué es la Job Queue en JavaScript?</h2><p>Cada vez que una promesa aparece en nuestro código, la función ejecutora entra en la cola de trabajo. El event loop funciona, como siempre, y le da prioridad a los elementos que están en <code>job queue</code> o cola de trabajo por encima de los elementos que se encuentran en la <code>callback queue</code> cuando el <code>stack</code> está libre.</p><p>El elemento en la callback queue se llama <code>macro task</code>, mientras que el elemento en la job queue se llama <code>micro task</code>.</p><p>Así que todo el proceso funciona así:</p><ul><li>Con cada bucle del <code>event loop</code>, se completa una tarea de la <code>callback queue</code>.</li><li>Una vez que una tarea se haya completado, el event loop visita la <code>job queue</code>. Completa todas las <code>micro tasks</code> en la cola de trabajo antes de pasar a otra cosa.</li><li>Si ambas colas tienen algo esperando, la <code>job queue</code> tiene prioridad sobre la <code>callback queue</code>.</li></ul><p>La imagen inferior muestra la inclusión de la job queue o cola de trabajo junto con otros elementos existentes.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/09/JObQ.png" class="kg-image" alt="JObQ" width="600" height="400" loading="lazy"></figure><p>Ahora, veamos un ejemplo para entender mejor esta secuencia: </p><pre><code class="language-js">function f1() {
    console.log('f1');
}

function f2() {
    console.log('f2');
}

function main() {
    console.log('main');
    
    setTimeout(f1, 0);
    
    new Promise((resolve, reject) =&gt;
        resolve('I am a promise')
    ).then(resolve =&gt; console.log(resolve))
    
    f2();
}

main();</code></pre><p>En el código superior, tenemos una función <code>setTimeout()</code> como antes pero hemos introducido una promesa justo después. Recuerda todo lo que hemos aprendido hasta ahora y adivina el resultado.</p><p>Si tu respuesta coincide con esta, estás en lo cierto:</p><pre><code class="language-shell">main
f2
I am a promise
f1</code></pre><p>Ahora veamos el proceso de las acciones: </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/09/fourth-flow.gif" class="kg-image" alt="fourth-flow" width="600" height="400" loading="lazy"><figcaption>Callback queue vs. Job queue</figcaption></figure><p>El flujo es casi el mismo que el anterior, pero es muy importante observar cómo los elementos de la cola de trabajo priorizan los elementos de la cola de tareas. Por otra parte, observa cómo no importa si el <code>setTimeout</code> tiene un retraso cero. Se trata de que la job queue que viene antes de el callback queue.</p><p>¡Estupendo!, hemos aprendido todo lo que necesitamos para comprender la ejecución síncrona y asíncrona en JavaScript.</p><h1 id="-una-prueba-para-ti-">¡Una prueba para ti!</h1><p>Pongamos a prueba tus conocimientos con este test. Adivina el resultado del siguiente código aplicando el conocimiento que has adquirido hasta ahora: </p><pre><code class="language-js">function f1() {
 console.log('f1');
}

function f2() { 
    console.log('f2');
}

function f3() { 
    console.log('f3');
}

function main() {
  console.log('main');

  setTimeout(f1, 50);
  setTimeout(f3, 30);

  new Promise((resolve, reject) =&gt;
    resolve('I am a Promise, right after f1 and f3! Really?')
  ).then(resolve =&gt; console.log(resolve));
    
  new Promise((resolve, reject) =&gt;
    resolve('I am a Promise after Promise!')
  ).then(resolve =&gt; console.log(resolve));

  f2();
}

main();</code></pre><p>El resultado esperado sería:</p><pre><code class="language-shell">main
f2
I am a Promise, right after f1 and f3! Really?
I am a Promise after Promise!
f3
f1</code></pre><p>¿Te gustaría realizar más pruebas como esta? <a href="https://github.com/atapas/promise-interview-ready">Dirígete a este repositorio</a> y practica con más ejercicios.</p><p>Si te bloqueas o necesitas alguna aclaración, no dudes en ponerte en contacto conmigo a través de <a href="https://twitter.com/tapasadhikary">Twitter</a>.</p><h1 id="en-resumen">En resumen</h1><ul><li>El motor de JavaScript usa la pila de estructura de datos para realizar un seguimiento de las actuales funciones ejecutadas. La pila es conocida como la function execution stack.</li><li>La function execution stack (es decir, la call stack) ejecuta las funciones de manera secuencial, línea a línea, una por una.</li><li>Las web APIs o APIs del navedagor usan las funciones callback para completar las tareas cuando una operación asíncrona se realiza. La función callback se coloca en la callback queue.</li><li>Las funciones del ejecutor de promesas se colocan en la job queue.</li><li>Con cada bucle del event loop una macro tarea se completa fuera de la callback queue.</li><li>Una vez que la tarea se complete, el event loop visita la job queue y completa todas las micro tareas dentro de la job queue antes de pasar a otra cosa.</li><li>Si ambas colas tienen algo esperando al mismo tiempo, la job queue tiene prioridad sobre la callback queue.</li></ul><h1 id="antes-de-concluir-">Antes de concluir...</h1><p>Eso es todo por ahora. Espero que este artículo te haya parecido útil y te ayude a comprender mejor los conceptos de sincronía y asincronía en JavaScript.</p><p>¡Conectemos! Puedes seguirme en <a href="https://twitter.com/tapasadhikary">Twitter(@tapasadhikary)</a>, en mi canal de <a href="https://youtube.com/c/TapasAdhikary?sub_confirmation=1">Youtube</a> y en <a href="https://github.com/atapas">GitHub(atapas)</a>.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Comandos básicos de Git: Cómo usar Git en un proyecto real ]]>
                </title>
                <description>
                    <![CDATA[ En mi tutorial anterior, hablamos sobre qué es el control de versiones, cómo funcionan Git y GitHub, y cómo configurar una cuenta GitHub. Hoy le echaremos un vistazo a cómo usar algunos comandos básicos en Git en un proyecto real. Para ello he creado un proyecto sencillo que usaremos de ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/comandos-basicos-de-git-como-usar-git-en-un-proyecto-real/</link>
                <guid isPermaLink="false">62e257edb4def508519755ed</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Cristina Padilla ]]>
                </dc:creator>
                <pubDate>Fri, 05 Aug 2022 02:44:09 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/07/git-and-github.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-use-basic-git-and-github-commands/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Basic Git Commands – How to Use Git in a Real Project</a>
      </p><p>En mi tutorial anterior, hablamos sobre qué es el control de versiones, cómo funcionan Git y GitHub, y cómo configurar una cuenta GitHub.</p><p>Hoy le echaremos un vistazo a cómo usar algunos comandos básicos en Git en un proyecto real.</p><p>Para ello he creado un proyecto sencillo que usaremos de ejemplo en este tutorial.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/07/Document---Google-Chrome-7_18_2022-6_54_37-AM.png" class="kg-image" alt="Document---Google-Chrome-7_18_2022-6_54_37-AM" width="600" height="400" loading="lazy"><figcaption>Project interface</figcaption></figure><p>Gracias a este tutorial, aprenderás cómo:</p><ul><li>Crear un repositorio en GitHub</li><li>Inicializar Git en tu proyecto</li><li>Añadir y confirmar tu proyecto</li><li>Cargar los cambios de tu proyecto en GitHub</li><li>Añadir y eliminar un archivo de un repositorio</li></ul><h2 id="c-mo-crear-un-repositorio-en-github">Cómo crear un repositorio en GitHub</h2><p>Creé el proyecto anterior usando HTML y CSS. Para inicializar Git en el proyecto, tengo que crear un nuevo repositorio en mi cuenta de GitHub.</p><p>Puedo hacerlo iniciando sesión en mi cuenta, hago clic en el botón <code>new</code> que se encuentra en la parte superior derecha de la pantalla. Después, introduzco el nombre del repositorio, la descripción y elijo si quiero que mi proyecto tenga acceso público o privado. Luego hago clic en "Create repository."</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2022/07/Create-a-New-Repository---Google-Chrome-7_18_2022-7_43_32-AM.png" class="kg-image" alt="Create-a-New-Repository---Google-Chrome-7_18_2022-7_43_32-AM" width="600" height="400" loading="lazy"></figure><h2 id="c-mo-inicializar-git">Cómo inicializar Git</h2><p>No podemos usar Git en nuestro proyecto si no lo inicializamos primero con el comando <code>git init</code>.</p><p>Por lo tanto, después de crear el repositorio en GitHub, abro mi proyecto en mi editor VSCode, voy al terminal y tecleo el comando <code>git init</code> para inicializarlo.</p><p>Cuando ejecutes este comando en tu terminal, verás algunos cambios en color en tu proyecto. También verás un símbolo <code>U</code> que significa que no se está haciendo un seguimiento de tus archivos.</p><p>Igualmente, cuando abras la carpeta donde tu proyecto está guardado, verás que hay otra carpeta con el nombre de <code>.git</code> que se crea automáticamente después de ejecutar el comando <code>git init</code>.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/07/git-add.jpg" class="kg-image" alt="git-add" width="600" height="400" loading="lazy"><figcaption>git add</figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/07/bandicam-2022-07-18-02-40-08-007.jpg" class="kg-image" alt="bandicam-2022-07-18-02-40-08-007" width="600" height="400" loading="lazy"><figcaption>.git folder</figcaption></figure><h2 id="c-mo-a-adir-y-confirmar-tu-proyecto">Cómo añadir y confirmar tu proyecto</h2><h3 id="c-mo-usar-el-comando-git-add">Cómo usar el comando <code>git add</code></h3><p>Añadir el proyecto al staging area ayuda a que Git haga un seguimiento de tu proyecto con los cambios que has hecho.</p><p>Para añadir tu proyecto al staging area, ejecuta el comando <code>git add .</code> . Cuando ejecutes este comando, verás que el símbolo <code>U</code> cambia automáticamente a <code>A</code>. Esto significa que tus archivos han sido añadidos al staging area y están siendo seguidos por Git, esperando a que sean confirmados.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/07/git-add-1.jpg" class="kg-image" alt="git-add-1" width="600" height="400" loading="lazy"><figcaption>git add</figcaption></figure><h3 id="c-mo-usar-el-comando-git-commit">Cómo usar el comando <code>git commit</code></h3><p>Al ejecutar el comando <code>git commit</code> guardas esta etapa en particular y los cambios en tu proyecto de forma permanente en el repositorio de Git. Y aunque hagas más cambios en tu proyecto en el futuro y los confirmes, esta confirmación en particular que realizaste ahora se guardara en el repositorio de Git y tendrás acceso a ella en cualquier momento. </p><p>Así que después de haber añadido tu proyecto al staging area, lo siguiente que tendrás que hacer es confirmarlo usando el comando <code>git commit –m “first commit”</code>.</p><p>Cuando ejecutes este comando, deberías notar que el símbolo <code>A</code> ya no aparece y tu proyecto se ve de nuevo como esperabas.</p><h2 id="c-mo-cargar-tu-proyecto-en-github">Cómo cargar tu proyecto en GitHub</h2><p>Cargar tu proyecto en GitHub sirve para evitar que tu proyecto se corrompa o se pierda en el almacenamiento local. También te permite acceder al repositorio de GitHub libremente desde cualquier lugar y cualquier ordenador (no necesariamente tu ordenador personal).</p><p>Para cargar tu proyecto al repositorio de GitHub, tendrás que añadir el repositorio remoto a GitHub que creaste al principio.</p><p>Para hacer esto, usarás el comando <code>git remote add origin (nombre del repositorio)</code>. En mi caso, el nombre de mi repositorio es <code><a href="https://github.com/Derekvibe/FoodResturant.git">https://github.com/Derekvibe/FoodResturant.git</a></code>. Escribiéndolo en el terminal se vería así:</p><p><code>git remote add origin <a href="https://github.com/Derekvibe/FoodResturant.git">https://github.com/Derekvibe/FoodResturant.git</a></code></p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2022/07/bandicam-2022-07-19-20-32-00-790.jpg" class="kg-image" alt="bandicam-2022-07-19-20-32-00-790" width="600" height="400" loading="lazy"></figure><p>Si no estás seguro/a de cuál es la rama en la que estás trabajando, utiliza el comando <code>git branch</code>. &nbsp;Si muestra la rama <code>master</code>, cambiaremos a la rama <code>main</code> ejecutando el comando <code>git branch –M main</code>.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/07/git-branch.jpg" class="kg-image" alt="git-branch" width="600" height="400" loading="lazy"><figcaption>(my git branch)</figcaption></figure><p>En mi caso, ya tenía configurada la rama <code>branch main</code> por defecto cuando instalé Git en mi ordenador al ejecutar el comando <code>git config –global init.default branch main</code>. Por lo tanto, no necesito ejecutar el comando <code>git branch –M main</code> otra vez.</p><p>Por último, después de añadir el repositorio remoto donde quieres subir tu proyecto y cambiar la rama a <code>main</code>, tendrás que cargar tu proyecto en GitHub.</p><p>Para conseguir esto, ejecuta el comando <code>git push –u origin main</code> y espera a que se cargue completamente.</p><p>Una vez hecho esto, ve al repositorio de Git que creaste en GitHub y actualiza la página. Verás que todos tus proyectos del repositorio local se han subido al repositorio de GitHub.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2022/07/git-push-image.jpg" class="kg-image" alt="git-push-image" width="600" height="400" loading="lazy"></figure><p>A partir de aquí, después de hacer cambios al proyecto, solo tienes que añadir los cambios al staging area ejecutando el comando <code>git add .</code>. Despues, puedes confirmarlos usando el comando <code>git commit –m “(commit name)”</code> y cargarlos al repositorio de Git con el comando <code>git push –u origin main</code>.</p><h2 id="c-mo-a-adir-y-eliminar-un-archivo-de-un-repositorio">Cómo añadir y eliminar un archivo de un repositorio</h2><p>A continuación te mostraré cómo añadir y eliminar un archivo nuevo del repositorio de GitHub.</p><h3 id="c-mo-a-adir-un-archivo-nuevo-a-un-repositorio-existente">Cómo añadir un archivo nuevo a un repositorio existente</h3><p>Si recapitulamos: añadí un archivo nuevo a mi proyecto con el nombre <code>newfile.txt</code>, el cual añadí a la staging area ejecutando el comando <code>git add newfile.txt</code>, después lo confirmé con el comando <code>git commit –m “new commit”</code> y lo cargué en GitHub de la misma manera que lo hicimos cuando subimos todo el proyecto a GitHub.</p><p>Cuando actualicé mi página de GitHub, pude comprobar que el archivo que creé aparecía en GitHub.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2022/07/bandicam-2022-07-18-07-14-54-352-1.jpg" class="kg-image" alt="bandicam-2022-07-18-07-14-54-352-1" width="600" height="400" loading="lazy"></figure><h3 id="c-mo-eliminar-un-archivo-de-un-repositorio-existente">Cómo eliminar un archivo de un repositorio existente</h3><p>Si quiero eliminar/borrar un archivo de mi proyecto en GitHub, puedo hacerlo ejecutando el siguiente comando <code>git rm newfile.txt</code>. </p><p>Cuando ejecuto este comando en mi terminal, añado los cambios al staging area usando <code>git add .</code>, y después los confirmo y los cargo en el repositorio de GitHub.</p><p>Si actualizo la página de GitHub, veré que el archivo ha sido eliminado de mi repositorio de GitHub. Igualmente, si compruebo mi almacenamiento local, veré que el archivo también ha sido eliminado.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2022/07/bandicam-2022-07-18-07-02-35-474.jpg" class="kg-image" alt="bandicam-2022-07-18-07-02-35-474" width="600" height="400" loading="lazy"></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2022/07/bandicam-2022-07-18-07-10-12-196.jpg" class="kg-image" alt="bandicam-2022-07-18-07-10-12-196" width="600" height="400" loading="lazy"></figure><h2 id="conclusi-n">Conclusión</h2><p>Con este tutorial has aprendido cómo usar los comandos básicos de Git para manejar tus proyectos.</p><p><a href="https://github.com/Derekvibe/FoodResturant">Haz clic aquí </a>para acceder al repositorio de mi proyecto en GitHub para que puedas practicar por tu cuenta.</p><p>Espero que este tutorial te haya sido de ayuda.</p><p><strong>¡Disfruta programando!</strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Tutorial de CSS de Consulta de medios CSS: Resoluciones estándar, breakpoints CSS y adaptar a tamaños de teléfonos ]]>
                </title>
                <description>
                    <![CDATA[ Crear una página web era mucho más sencillo antes. Ahora el diseño de una página web ha de adaptarse no solo a los ordenadores, sino también a las tablets, móviles e incluso los televisores. Crear una página web con un diseño flexible se llama Diseño Web Responsivo y las consultas ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/tutorial-de-css-de-consultas-de-medios-resoluciones-y-mas/</link>
                <guid isPermaLink="false">62deaa0cb4def50851974862</guid>
                
                    <category>
                        <![CDATA[ Diseño responsivo ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Cristina Padilla ]]>
                </dc:creator>
                <pubDate>Mon, 01 Aug 2022 03:00:26 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/07/5f9c9bb5740569d1a4ca2d74.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/css-media-queries-breakpoints-media-types-standard-resolutions-and-more/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Media Query CSS Tutorial – Standard Resolutions, CSS Breakpoints, and Target Phone Sizes</a>
      </p><p>Crear una página web era mucho más sencillo antes. Ahora el diseño de una página web ha de adaptarse no solo a los ordenadores, sino también a las tablets, móviles e incluso los televisores.</p><p>Crear una página web con un diseño flexible se llama Diseño Web Responsivo y las consultas de medios CSS son uno de los elementos más importantes del Diseño Responsivo. En este artículo profundizaremos en las consultas de medios y cómo usarlas en CSS.</p><h2 id="-qu-es-una-consulta-de-medios">¿Qué es una consulta de medios?</h2><p>Una consulta de medios es un componente de CSS3 que hace que una página web adapte su diseño a diferentes tamaños de pantalla y tipos de medios.</p><h3 id="sintaxis">Sintaxis</h3><pre><code class="language-css">@media media type and (condition: breakpoint) {
  // reglas CSS
}</code></pre><p>Podemos establecer diferentes tipos de medios bajo una variedad de condiciones. Si la condición y/o el tipo de medio se cumplen, la regla dentro de la consulta de medios se aplicará.</p><p>La sintaxis pueda parecer un poco complicada al principio, así que vamos a explicar cada parte en más detalle...</p><h3 id="la-regla-media">La regla @ media</h3><p>Comenzamos definiendo la consulta de medios con la regla @media y después incluimos las reglas CSS entre los paréntesis. La regla @media también se usa para especificar los tipos de medios.</p><pre><code class="language-css">@media () {
  // reglas CSS
}</code></pre><h3 id="par-ntesis">Paréntesis</h3><p>Dentro de los paréntesis establecemos una condición. Por ejemplo, quiero aplicar un tamaño de fuente mayor en los teléfonos móviles. Para hacer esto, necesitamos establecer un ancho máximo que compruebe el ancho de un dispositivo:</p><pre><code class="language-css">.texto {
  font-size: 14px;
}

@media (max-width: 480px) {
  .texto {
    font-size: 16px;
  }
}</code></pre><p>El tamaño del texto es de 14px. Sin embargo, como hemos aplicado una consulta de medios, el tamaño del texto será de 16px cuando el ancho máximo del dispositivo sea de 480px o menos.</p><p><strong>Importante: añade tus consultas de medios siempre al final de tu documento CSS.</strong></p><h3 id="tipo-de-medios">Tipo de medios</h3><p>Si no establecemos ningún tipo de medio, la regla @media selecciona todos los dispositivos por defecto. Los tipos de medios se aplican justo a continuación de la regla @media. Existen muchos tipos de dispositivos, pero podemos agruparlos en 4 categorías:</p><ul><li>all — para todo los tipos de medios</li><li>print — para impresoras</li><li>screen — para pantallas de ordenador, tablets y smartphones</li><li>speech — para lectores de pantalla que "leen" la página en voz alta</li></ul><p>Por ejemplo, si quiero seleccionar solo pantallas, usaré la palabra <code>screen</code> justo después de la regla <code>@media</code>. También tengo que unir ambas reglas con la palabra "and":</p><pre><code class="language-css">@media screen and (max-width: 480px) {
  .texto {
    font-size: 16px;
  }
}</code></pre><h3 id="breakpoints">Breakpoints</h3><p>El breakpoint es quizás uno de los conceptos que escuches y uses más a menudo. Un breakpoint es esencial a la hora de determinar cuándo cambiar el diseño y adaptar las reglas dentro de las consultas de medios. Volvamos a nuestro ejemplo del principio:</p><pre><code class="language-css">@media (max-width: 480px) {
  .texto {
    font-size: 16px;
  }
}</code></pre><p>Aquí el breakpoint es 480px. La consulta de medios sabe cuándo establecer o sobreescribir la nueva clase. Básicamente, si el ancho de un dispositivo es menos de 480px, la clase texto se aplicará, si no, no.</p><h4 id="breakpoints-comunes-existe-una-resoluci-n-est-ndar">Breakpoints comunes: ¿existe una resolución estándar?</h4><p>Una de las cuestiones que más se pregunta es “¿Qué breakpoint tengo que usar?”. Existen una gran cantidad de dispositivos en el mercado, con lo que no podemos ni debemos definir breakpoints fijos para cada uno de ellos.</p><p>Por ello, no podemos decir que existe una resolución estándar para todos los dispositivos, sino breakpoints de uso común en el día a día de la programación. Si estás utilizando un framework CSS (como Bootstrap, Bulma, etc.) también puedes usar sus breakpoints.</p><p>Vamos a ver ahora los breakpoints comunes según el ancho de los dispositivos:</p><ul><li>320px — 480px: Dispositivos móviles</li><li>481px — 768px: iPads, tablets</li><li>769px — 1024px: pantallas pequeñas, ordenadores portátiles</li><li>1025px — 1200px: pantallas grandes, ordenadores de escritorio</li><li>1201px y más —  pantallas extra-grandes, televisores</li></ul><p>Como menciono anteriormente, estos breakpoints son flexibles, ya que no existe una definición estándar, sino algunos de uso común.</p><h2 id="conclusi-n">Conclusión</h2><p>El diseño responsivo es actualmente imprescindible en el mundo del diseño y desarrollo web. Las consultas de medios son una de las partes más importantes para crear diseños responsivos. Espero que mi artículo te ayude a comprender cómo funcionan las consultas de medios.</p><p><strong>Si quieres aprender más sobre desarrollo web, <a href="https://www.youtube.com/channel/UC1EgYPCvKCXFn8HlpoJwY3Q?view_as=subscriber">suscríbete gratis a mi canal</a>.</strong></p><p>¡Gracias por leer mi artículo!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Aclaremos la confusión en torno a los métodos slice(), splice() y split() en JavaScript ]]>
                </title>
                <description>
                    <![CDATA[ Los métodos incorporados de JavaScript son una gran ayuda a la hora de programar, una vez los hayamos entendido correctamente. Me gustaría explicar tres de ellos en este artículo: Los métodos slice(), splice() y split(). Ya que sus nombres son tan similares, pueden llevar a confusión, incluso entre desarrolladores expertos. ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/aclaremos-la-confunsion-en-torno-a-los-metodos-slice-splice-split-en-javascript/</link>
                <guid isPermaLink="false">62d570c0b4def5085197388d</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Cristina Padilla ]]>
                </dc:creator>
                <pubDate>Mon, 25 Jul 2022 03:35:36 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/07/0-QaNtLL7jbyw3062_.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/lets-clear-up-the-confusion-around-the-slice-splice-split-methods-in-javascript-8ba3266c29ae/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Let’s clear up the confusion around the slice( ), splice( ), &amp; split( ) methods in JavaScript</a>
      </p><p>Los métodos incorporados de JavaScript son una gran ayuda a la hora de programar, una vez los hayamos entendido correctamente. Me gustaría explicar tres de ellos en este artículo: Los métodos <strong><code>slice()</code></strong>, <strong><code>splice()</code></strong> y <strong><code>split()</code></strong>. Ya que sus nombres son tan similares, pueden llevar a confusión, incluso entre desarrolladores expertos.</p><p><strong>Recomiendo a los estudiantes y desarrolladores junior leer este artículo con atención, porque en las ENTREVISTAS DE TRABAJO se suele preguntar sobre estos tres métodos.</strong></p><p>Puedes encontrar un resumen de cada método al final del artículo. </p><p>¡Vamos a por ello!</p><h3 id="arreglos-de-javascript">Arreglos de JavaScript</h3><p>Primeramente, necesitas entender cómo funcionan los <strong>arreglos de JavaScript</strong>. Como en cualquier otro lenguaje de programación, utilizamos los arreglos de JavaScript para almacenar múltiples datos. Sin embargo, la diferencia en JavaScript es que <strong>los arreglos pueden contener diferentes tipos de datos a la vez</strong>. </p><p>A veces necesitamos realizar alguna tarea en esos arreglos. Para ello usamos los métodos <strong>slice() y splice()</strong>. Puedes ver debajo cómo declarar un arreglo en JavaScript:</p><p><code>let definicionDeArreglo = []; &nbsp; // Declaración de arreglo en JS </code></p><p>Vamos a declarar ahora otro arreglo con diferentes tipos de datos. Lo haré con los siguientes ejemplos: </p><p><code>let arreglo = [1, 2, 3, "hola mundo", 4.12, true];</code></p><p>Este uso es <strong>válido</strong> en JavaScript. Un arreglo con diferentes tipos de datos: cadenas, números y un booleano.</p><h3 id="slice-">Slice ( )</h3><p>El método <strong>slice()</strong> <strong>copia</strong> una parte de un arreglo y devuelve esa copia como un nuevo arreglo. <strong>No cambia el arreglo original</strong>.</p><p><code>arreglo.slice(desde, hasta);</code></p><ul><li><strong>Desde<strong>:</strong></strong> Corta un arreglo empezando <strong>desde</strong> el índice de un elemento </li><li><strong>Hasta<strong>:</strong></strong> Corta un arreglo <strong>hasta</strong> el índice de otro elemento</li></ul><p>Por ejemplo, quiero cortar los tres primeros elementos del arreglo del ejemplo de arriba. Como el índice del primer elemento de un arreglo es 0, comenzaré cortando <strong>"desde"</strong> 0.</p><p><code>arreglo.slice(0, hasta);</code></p><p>Aquí viene la parte engorrosa. Si quiero cortar los tres primeros elementos, tengo que incluir hasta <strong>"hasta"</strong> el parámetro 3. <strong>El método slice() no incluye este último elemento</strong>.</p><pre><code>arreglo[0] --&gt; 1              // incluido
arreglo[1] --&gt; 2              // incluido
arreglo[2] --&gt; 3              // incluido
arreglo[3] --&gt; "hello world"  // no incluido</code></pre><p>Esto puede llevar a la confusión. Por eso, llamo al segundo parámetro <strong><strong>“</strong>hasta<strong>”.</strong></strong></p><p><code>let nuevoArreglo = arreglo.slice(0, 3); &nbsp; // Devuelve también un arreglo </code></p><p>Finalmente, asigno el arreglo cortado a la variable <strong>nuevoArreglo</strong>. Veamos el resultado:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/07/Screen-Shot-2022-07-24-at-10.52.21-PM.png" class="kg-image" alt="1*UECVH_JWknae04kVqTr1gg" width="577" height="117" loading="lazy"><figcaption>Slice <strong class="markup--strong markup--figure-strong" style="font-weight: 700;">array</strong> and assign the members to&nbsp;<strong class="markup--strong markup--figure-strong" style="font-weight: 700;">newArray</strong></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/07/Screen-Shot-2022-07-24-at-10.53.03-PM.png" class="kg-image" alt="nuevoArreglo es ahora un arreglo, y el original sigue siendo el mismo arreglo" width="554" height="132" loading="lazy"><figcaption><strong class="markup--strong markup--figure-strong" style="font-weight: 700;">newArray</strong> variable is an array now, and the original one remains the&nbsp;same</figcaption></figure><blockquote><em>Nota importante: el método <strong><strong>Slice( )</strong></strong> se puede usar también con <strong>cadenas<strong>.</strong></strong></em></blockquote><h3 id="splice-">Splice( )</h3><p>El nombre de esta función es muy parecida a <strong>slice()</strong>. Esta similitud confunde a los desarrolladores a menudo. El método <strong>splice() cambia</strong> un arreglo añadiendo o eliminando elementos del mismo. Veamos cómo añadir y eliminar elementos con <strong>splice()</strong>:</p><h4 id="eliminar-elementos">Eliminar elementos</h4><p>Para eliminar elementos necesitamos indicar el <strong>índice</strong> y el <strong>número de elementos</strong> a eliminar:</p><p><code>arreglo.splice(índice, número de elementos);</code></p><p>El índice es el <strong>punto de comienzo</strong> para eliminar elementos. Los elementos que tengan un índice <strong>menor</strong> que el índice indicado no serán eliminados:</p><p><code>arreglo.splice(2); &nbsp;// Cualquier elemento a partir del índice 2 será eliminado </code></p><p>Si no definimos el segundo parámetro, cualquier elemento a partir del índice indicado será eliminado del arreglo:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/07/Screen-Shot-2022-07-24-at-10.59.34-PM.png" class="kg-image" alt="1*OGTbYRkU4C_5iMF5Sw9lBA" width="440" height="115" loading="lazy"><figcaption><strong class="markup--strong markup--figure-strong" style="font-weight: 700;">only index 0 and 1 are still&nbsp;there</strong></figcaption></figure><p>En el segundo ejemplo, indico 1 como segundo parámetro, por lo que los elementos a partir del índice 2 serán eliminados uno a uno cada vez que llamemos el método <strong>splice()</strong>.</p><p><code>arreglo.splice(2, 1);</code></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/07/Screen-Shot-2022-07-24-at-11.05.50-PM.png" class="kg-image" alt="1*uCZHAfeq46dG182y6oHrpg" width="494" height="30" loading="lazy"><figcaption>Array at beginning</figcaption></figure><p><strong>Después de la primera llamada<strong>:</strong></strong></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/07/Screen-Shot-2022-07-24-at-11.06.31-PM.png" class="kg-image" alt="1*gMh3g8RLvpAjMGxgfanB8w" width="453" height="57" loading="lazy"><figcaption><strong class="markup--strong markup--figure-strong" style="font-weight: 700;">3</strong> is removed so <strong class="markup--strong markup--figure-strong" style="font-weight: 700;">“hello world”</strong> has now index&nbsp;2</figcaption></figure><p><strong>Después de la segunda llamada<strong>:</strong></strong></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/07/Screen-Shot-2022-07-24-at-11.07.07-PM.png" class="kg-image" alt="1*6YWBPU0UsPeoJTcwn8-gWg" width="361" height="57" loading="lazy"><figcaption>This time, <strong class="markup--strong markup--figure-strong" style="font-weight: 700;">“hello world”</strong> is removed as <strong class="markup--strong markup--figure-strong" style="font-weight: 700;">index:&nbsp;2</strong></figcaption></figure><p>Esto puede seguir así hasta que no haya ningún índice 2.</p><h4 id="a-adir-elementos">Añadir elementos</h4><p>Para añadir elementos, necesitamos indicar el tercer, cuarto, quinto parámetro (depende de cuántos añadamos) en el método <strong>splice()</strong>:</p><p>arreglo.splice(índice, número de elementos, elemento, elemento);</p><p>Por ejemplo, añado <strong>a</strong> y <strong>b</strong> al comienzo del arreglo y no elimino nada:</p><p><code>arreglo.splice(0, 0, 'a', 'b');</code></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/07/Screen-Shot-2022-07-24-at-11.09.59-PM.png" class="kg-image" alt="1*E7TMFWTYGJDkuhG3VrTCKw" width="570" height="110" loading="lazy"><figcaption><strong class="markup--strong markup--figure-strong" style="font-weight: 700;">a </strong>and<strong class="markup--strong markup--figure-strong" style="font-weight: 700;"> b</strong> added to the beginning of array, no elements&nbsp;removed</figcaption></figure><h3 id="split-">Split ( )</h3><p>Los métodos<strong> s<strong>lice( ) </strong></strong>y<strong><strong> splice( ) </strong></strong>se usan con arreglos. El método <strong><strong>split( )</strong></strong> se usa con <strong>cadenas</strong>. Divide una cadena en subcadenas y los devuelve como un arreglo. Toma 2 parámetros y ambos son <strong>opcionales</strong>.</p><p><code>cadena.split(separador, límite);</code></p><ul><li><strong><strong>Separa</strong>d<strong>or:</strong></strong> Define cómo separar una cadena... con coma, un símbolo, etc. </li><li><strong><strong>Lí</strong>mite<strong>:</strong></strong> Limita el número de cortes con el número indicado.</li></ul><p>El método <strong>split()</strong> no funciona directamente con los <strong>arreglos</strong>. Sin embargo, podemos primero convertir los elementos de nuestro arreglo en una cadena y después usar el método <strong>split()</strong>. </p><p>Veamos cómo funciona.</p><p>Primero convertimos nuestro arreglo en una cadena con el método <strong>toString()</strong>:</p><p><code>let miCadena = arreglo.toString();</code></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/07/Screen-Shot-2022-07-24-at-11.12.15-PM.png" class="kg-image" alt="1*JW9u0vQSmZM6wQ540w3eTg" width="445" height="104" loading="lazy"></figure><p>A continuación separamos <strong>miCadena</strong> con <strong>comas</strong>, lo limitamos a <strong>tres</strong> subcadenas y lo devolvemos como un arreglo:</p><p><code>let nuevoArreglo = miCadena.split(",", 3);</code></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/07/Screen-Shot-2022-07-24-at-11.14.14-PM.png" class="kg-image" alt="1*v53Ct4WVDXNsCjzDAtpc_g" width="335" height="56" loading="lazy"><figcaption><strong class="markup--strong markup--figure-strong" style="font-weight: 700;">Only the first 3 elements are&nbsp;returned</strong></figcaption></figure><p>Como podemos ver, <strong>miCadena</strong> está separado por comas. Ya que hemos limitado el número de cortes a 3, se devolverán los primeros 3 elementos.</p><blockquote><strong><strong><em>NOT</em></strong><em>A</em><strong><em>:</em></strong></strong><em> Si usamos esto: <code><em>arr</em>eglo<em>.split("");</em></code> &nbsp;cada caracter de la cadena se dividirá en subcadenas:</em></blockquote><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/07/Screen-Shot-2022-07-24-at-11.17.47-PM.png" class="kg-image" alt="1*s7RYTgCHVGzZKXDJZYyjaQ" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/07/Screen-Shot-2022-07-24-at-11.17.47-PM.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2022/07/Screen-Shot-2022-07-24-at-11.17.47-PM.png 754w" sizes="(min-width: 720px) 720px" width="754" height="73" loading="lazy"><figcaption><strong class="markup--strong markup--figure-strong" style="font-weight: 700;">Each character split one by&nbsp;one</strong></figcaption></figure><h3 id="resumen-">Resumen:</h3><h4 id="slice--1">Slice( )</h4><ul><li>Copia elementos de un arreglo</li><li>Los devuelve como un arreglo nuevo</li><li>No cambia el arreglo original</li><li>Comienza cortando desde... hasta el índice indicado: <strong>arreglo<strong>.slice (</strong>desde<strong>, </strong>hasta<strong>)</strong></strong></li><li>Slice no incluye el parámetro con el índice <strong><strong>“</strong>hasta<strong>”</strong></strong></li><li>Se puede usar tanto con arreglos como con cadenas</li></ul><h4 id="splice--1">Splice( )</h4><ul><li>Sirve para añadir/eliminar elementos de un arreglo</li><li>Devuelve un arreglo con elementos eliminados</li><li>Cambia el arreglo</li><li>Para añadir elementos: <strong>arreglo<strong>.splice(índ</strong>ice<strong>, núm</strong>ero de elementos<strong>, element</strong>o<strong>)</strong></strong></li><li>Para eliminar elementos: <strong>arreglo<strong>.splice(índ</strong>ice<strong>, núm</strong>ero de elementos<strong>)</strong></strong></li><li>Solo se puede usar con arreglos</li></ul><h4 id="split--1">Split( )</h4><ul><li>Divide una cadena en subcadenas</li><li>Los devuelve en un arreglo</li><li>Toma 2 parámetros, ambos opcionales: <strong>cadena<strong>.split(</strong>separador<strong>, límit</strong>e<strong>)</strong></strong></li><li>No modifica la cadena original</li><li>Solo se puede usar con cadenas</li></ul><p>Existen muchos otros objetos estándar integrados para arreglos y cadenas de texto, que facilitan la programación en JavaScript. </p><p><strong>Si quieres aprender más sobre desarrollo web, <a href="https://www.youtube.com/channel/UC1EgYPCvKCXFn8HlpoJwY3Q">¡sígueme en Youtube!</a></strong></p><p>¡Gracias por leer mi artículo!</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
