<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>JavaScript on Commentary of Takao</title><link>https://takao.blog/es/categories/javascript/</link><description>Recent content in JavaScript on Commentary of Takao</description><generator>Hugo -- gohugo.io</generator><language>es</language><copyright>Commentary of Takao</copyright><lastBuildDate>Sun, 12 Jul 2026 04:12:51 +0900</lastBuildDate><atom:link href="https://takao.blog/es/categories/javascript/index.xml" rel="self" type="application/rss+xml"/><item><title>Reemplazando localStorage: localForage como wrapper de IndexedDB</title><link>https://takao.blog/es/web/js-indexeddb-localforage-localstorage/</link><pubDate>Fri, 20 Feb 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/js-indexeddb-localforage-localstorage/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-indexeddb-localforage-localstorage-es.png" alt="Featured image of post Reemplazando localStorage: localForage como wrapper de IndexedDB" /&gt;&lt;h2 id="introducción"&gt;Introducción
&lt;/h2&gt;&lt;p&gt;El almacenamiento del lado del cliente es fundamental. localStorage tiene límites dolorosos: ~5 MB, API síncrona, solo strings.&lt;/p&gt;
&lt;h2 id="indexeddb-potente-pero-complejo"&gt;IndexedDB: Potente pero complejo
&lt;/h2&gt;&lt;p&gt;Ofrece almacenamiento virtualmente ilimitado, API asíncrona, datos estructurados y consultas indexadas. Pero es notoriamente verboso.&lt;/p&gt;
&lt;h2 id="localforage-lo-mejor-de-ambos-mundos"&gt;localForage: Lo mejor de ambos mundos
&lt;/h2&gt;&lt;p&gt;Wrapper ligero que envuelve IndexedDB (con WebSQL y localStorage como respaldo) tras una API simple basada en promesas, inspirada en localStorage.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;localforage&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;setItem&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;user&amp;#39;&lt;/span&gt;, { &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;Alice&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;role&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;admin&amp;#39;&lt;/span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;user&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;localforage&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getItem&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;user&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Detección del mejor driver disponible: 1. IndexedDB, 2. WebSQL, 3. localStorage. Para la mayoría de necesidades de almacenamiento, localForage es la elección pragmática.&lt;/p&gt;</description></item><item><title>Potenciando tus expresiones regulares con el flag v</title><link>https://takao.blog/es/web/js-regex-v-flag/</link><pubDate>Wed, 15 Oct 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/js-regex-v-flag/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-regex-v-flag-es.png" alt="Featured image of post Potenciando tus expresiones regulares con el flag v" /&gt;&lt;h2 id="introducción"&gt;Introducción
&lt;/h2&gt;&lt;p&gt;ES2024 introduce el flag &lt;code&gt;v&lt;/code&gt;, un superconjunto del flag &lt;code&gt;u&lt;/code&gt; que permite notación de conjuntos, resta de clases, intersección y coincidencia de emojis Unicode.&lt;/p&gt;
&lt;h2 id="resta-de-clases---"&gt;Resta de clases (&lt;code&gt;--&lt;/code&gt;)
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;re&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;/[\p{Letter}--[aeiouAEIOU]]/v; // letras excepto vocales&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="intersección-"&gt;Intersección (&lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt;)
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;re&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;/[\p{Letter}&amp;amp;&amp;amp;\p{Script=Greek}]/v; // solo letras griegas&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="clases-anidadas"&gt;Clases anidadas
&lt;/h2&gt;&lt;p&gt;El flag &lt;code&gt;v&lt;/code&gt; permite anidar clases con corchetes, eliminando secuencias de escape confusas.&lt;/p&gt;
&lt;h2 id="coincidencia-de-emojis"&gt;Coincidencia de emojis
&lt;/h2&gt;&lt;p&gt;Nuevas propiedades: &lt;code&gt;\p{RGI_Emoji}&lt;/code&gt;, &lt;code&gt;\p{Basic_Emoji}&lt;/code&gt;, &lt;code&gt;\p{Emoji_Keycap_Sequence}&lt;/code&gt;, etc.&lt;/p&gt;
&lt;h2 id="migración-desde-flag-u"&gt;Migración desde flag u
&lt;/h2&gt;&lt;p&gt;El flag &lt;code&gt;v&lt;/code&gt; es estrictamente un superconjunto pero tiene cambios disruptivos: &lt;code&gt;\d&lt;/code&gt; dentro de clase no está permitido, &lt;code&gt;--&lt;/code&gt; y &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; son operadores.&lt;/p&gt;</description></item><item><title>Novedades emocionantes en ECMAScript 2025 (ES16)</title><link>https://takao.blog/es/web/js-es2025-new-features/</link><pubDate>Thu, 15 May 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/js-es2025-new-features/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-es2025-new-features-es.png" alt="Featured image of post Novedades emocionantes en ECMAScript 2025 (ES16)" /&gt;&lt;h2 id="introducción"&gt;Introducción
&lt;/h2&gt;&lt;p&gt;Cada año, el comité TC39 actualiza las especificaciones ECMAScript. Para ECMAScript 2025 (ES16), varias propuestas han alcanzado Stage 3 o 4.&lt;/p&gt;
&lt;h2 id="promisetry"&gt;Promise.try
&lt;/h2&gt;&lt;p&gt;Unifica el manejo de errores síncronos y asíncronos. Si el callback lanza una excepción síncrona, &lt;code&gt;Promise.try()&lt;/code&gt; la captura y retorna una Promise rechazada, permitiendo un solo &lt;code&gt;.catch()&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="iterator-helpers"&gt;Iterator Helpers
&lt;/h2&gt;&lt;p&gt;Añade &lt;code&gt;.map()&lt;/code&gt; y &lt;code&gt;.filter()&lt;/code&gt; a todos los objetos iterables (Set, Map, etc.). Evaluación perezosa: los elementos se procesan solo cuando se solicitan.&lt;/p&gt;</description></item><item><title>Patrones a evitar con async/await en JavaScript</title><link>https://takao.blog/es/web/javascript-async-await-tips/</link><pubDate>Sat, 15 Feb 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/javascript-async-await-tips/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/javascript-async-await-tips-es.png" alt="Featured image of post Patrones a evitar con async/await en JavaScript" /&gt;&lt;h2 id="introducción"&gt;Introducción
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;async/await&lt;/code&gt; hizo la programación asíncrona más intuitiva, pero puede ocultar problemas de rendimiento y errores.&lt;/p&gt;
&lt;h2 id="antipatrón-1-serialización-innecesaria"&gt;Antipatrón 1: Serialización innecesaria
&lt;/h2&gt;&lt;p&gt;No uses &lt;code&gt;await&lt;/code&gt; secuencial para tareas independientes. Usa &lt;code&gt;Promise.all&lt;/code&gt; para ejecución en paralelo.&lt;/p&gt;
&lt;h2 id="antipatrón-2-bloques-try-catch-anidados"&gt;Antipatrón 2: Bloques try-catch anidados
&lt;/h2&gt;&lt;p&gt;El anidamiento profundo derrota el propósito de async/await. Usa un solo bloque try-catch al más alto nivel.&lt;/p&gt;
&lt;h2 id="antipatrón-3-async-callbacks-en-foreach"&gt;Antipatrón 3: async callbacks en forEach
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;forEach&lt;/code&gt; con async callback ejecuta los callbacks síncronamente. Usa &lt;code&gt;for...of&lt;/code&gt; para secuencial o &lt;code&gt;Promise.all&lt;/code&gt; con &lt;code&gt;map&lt;/code&gt; para paralelo.&lt;/p&gt;</description></item><item><title>Métodos de arrays JavaScript: De básicos a patrones avanzados</title><link>https://takao.blog/es/web/js-array-methods/</link><pubDate>Thu, 12 Dec 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/js-array-methods/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-array-methods-es.png" alt="Featured image of post Métodos de arrays JavaScript: De básicos a patrones avanzados" /&gt;&lt;p&gt;Los arrays de JavaScript son el pilar de la manipulación de datos en el desarrollo web moderno. Con ES2023 introduciendo alternativas inmutables a métodos mutantes, es momento de revisar cómo trabajamos con arrays.&lt;/p&gt;
&lt;h2 id="panorama-de-métodos-de-array"&gt;Panorama de métodos de array
&lt;/h2&gt;&lt;p&gt;Los métodos se dividen en mutantes y no mutantes. ES2023 introdujo cuatro métodos inmutables: &lt;code&gt;toSorted()&lt;/code&gt;, &lt;code&gt;toReversed()&lt;/code&gt;, &lt;code&gt;toSpliced()&lt;/code&gt;, &lt;code&gt;with()&lt;/code&gt;. Estos crean nuevos arrays sin modificar el original, ideal para React o Redux.&lt;/p&gt;
&lt;h2 id="map-filter-y-reduce-en-profundidad"&gt;Map, Filter y Reduce en profundidad
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;map&lt;/code&gt; transforma cada elemento, &lt;code&gt;filter&lt;/code&gt; selecciona elementos, &lt;code&gt;reduce&lt;/code&gt; es el más versátil. Una anti-patrón común es encadenar &lt;code&gt;map&lt;/code&gt; seguido de &lt;code&gt;filter&lt;/code&gt; cuando un solo &lt;code&gt;flatMap&lt;/code&gt; sería suficiente.&lt;/p&gt;</description></item><item><title>Typed Arrays en JavaScript: Procesamiento de datos binarios en el navegador</title><link>https://takao.blog/es/web/js-typed-arrays/</link><pubDate>Tue, 10 Sep 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/js-typed-arrays/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-typed-arrays-es.png" alt="Featured image of post Typed Arrays en JavaScript: Procesamiento de datos binarios en el navegador" /&gt;&lt;p&gt;El tipo &lt;code&gt;Number&lt;/code&gt; nativo de JavaScript es ineficiente para datos binarios. Los Typed Arrays (ES2015) traen gestión de memoria tipo C al navegador.&lt;/p&gt;
&lt;h2 id="arraybuffer"&gt;ArrayBuffer
&lt;/h2&gt;&lt;p&gt;Buffer binario raw de longitud fija. No se puede leer/escribir directamente — debe usarse una vista.&lt;/p&gt;
&lt;h2 id="vistas-typedarray"&gt;Vistas TypedArray
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Int8Array&lt;/code&gt;, &lt;code&gt;Uint8Array&lt;/code&gt;, &lt;code&gt;Float32Array&lt;/code&gt;, etc. Cada vista interpreta los bytes como un tipo numérico específico. &lt;code&gt;subarray()&lt;/code&gt; crea una subvista sin copia.&lt;/p&gt;
&lt;h2 id="dataview-para-estructuras-complejas"&gt;DataView para estructuras complejas
&lt;/h2&gt;&lt;p&gt;Permite lectura/escritura en offsets arbitrarios con tipo y endianness explícitos. Ideal para formatos binarios como BMP, PNG, WAV.&lt;/p&gt;</description></item><item><title>API Proxy y Reflect de JavaScript: Patrones de metaprogramación</title><link>https://takao.blog/es/web/js-proxy-reflect/</link><pubDate>Tue, 04 Jun 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/js-proxy-reflect/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-proxy-reflect-es.png" alt="Featured image of post API Proxy y Reflect de JavaScript: Patrones de metaprogramación" /&gt;&lt;p&gt;&lt;code&gt;Proxy&lt;/code&gt; y &lt;code&gt;Reflect&lt;/code&gt; permiten interceptar y personalizar operaciones fundamentales en objetos: acceso a propiedades, asignación, enumeración, invocación de funciones y llamadas a constructores.&lt;/p&gt;
&lt;h2 id="los-13-traps-de-proxy"&gt;Los 13 traps de Proxy
&lt;/h2&gt;&lt;p&gt;Desde &lt;code&gt;get&lt;/code&gt;/&lt;code&gt;set&lt;/code&gt; (lectura/escritura) hasta &lt;code&gt;apply&lt;/code&gt;/&lt;code&gt;construct&lt;/code&gt; (llamadas de función/constructor). Cada trap debe cumplir invariantes.&lt;/p&gt;
&lt;h2 id="api-reflect"&gt;API Reflect
&lt;/h2&gt;&lt;p&gt;Los métodos de &lt;code&gt;Reflect&lt;/code&gt; reflejan cada trap de Proxy. Usar &lt;code&gt;Reflect&lt;/code&gt; dentro de traps asegura propagación correcta del argumento &lt;code&gt;receiver&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="validación-e-integridad"&gt;Validación e integridad
&lt;/h2&gt;&lt;p&gt;El trap &lt;code&gt;set&lt;/code&gt; puede imponer restricciones de esquema. Proxy de solo lectura bloquea todos los traps de mutación.&lt;/p&gt;</description></item><item><title>Novedades de ES2024 en JavaScript</title><link>https://takao.blog/es/web/es2024-new-features/</link><pubDate>Tue, 12 Mar 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/es2024-new-features/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/es2024-new-features-es.png" alt="Featured image of post Novedades de ES2024 en JavaScript" /&gt;&lt;p&gt;ES2024 (ES15) introduce nuevas funcionalidades al lenguaje, centradas en async, arrays y gestión de datos.&lt;/p&gt;
&lt;h2 id="promisewithresolvers"&gt;Promise.withResolvers()
&lt;/h2&gt;&lt;p&gt;Crea una promesa con sus funciones resolve y reject expuestas externamente. Útil para promisificar APIs callback sin anidar constructores.&lt;/p&gt;
&lt;h2 id="array-grouping"&gt;Array Grouping
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Object.groupBy()&lt;/code&gt; y &lt;code&gt;Map.groupBy()&lt;/code&gt; agrupan elementos de un array según una función callback. Reemplaza implementaciones manuales con reduce.&lt;/p&gt;
&lt;h2 id="well-formed-unicode-strings"&gt;Well-formed Unicode Strings
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;String.prototype.isWellFormed()&lt;/code&gt; y &lt;code&gt;toWellFormed()&lt;/code&gt; para manejar cadenas Unicode mal formadas. Previene errores en APIs que requieren Unicode válido.&lt;/p&gt;</description></item><item><title>Profundizando en el Event Loop de JavaScript: Microtasks, Macrotasks y más</title><link>https://takao.blog/es/web/js-event-loop/</link><pubDate>Mon, 19 Feb 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/js-event-loop/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-event-loop-es.png" alt="Featured image of post Profundizando en el Event Loop de JavaScript: Microtasks, Macrotasks y más" /&gt;&lt;p&gt;El event loop de JavaScript es uno de los conceptos más importantes y menos entendidos. A pesar de ser single-threaded, su event loop permite concurrencia no bloqueante mediante un sistema de colas.&lt;/p&gt;
&lt;h2 id="call-stack"&gt;Call Stack
&lt;/h2&gt;&lt;p&gt;Estructura LIFO. Principio de run-to-completion: cada función se ejecuta hasta completarse antes de que otro código la interrumpa.&lt;/p&gt;
&lt;h2 id="cola-de-macrotasks"&gt;Cola de Macrotasks
&lt;/h2&gt;&lt;p&gt;Origen: &lt;code&gt;setTimeout&lt;/code&gt;, &lt;code&gt;setInterval&lt;/code&gt;, I/O, eventos UI. El event loop toma UNA macrotask por iteración, la ejecuta, luego procesa la cola de microtasks.&lt;/p&gt;</description></item><item><title>Patrones avanzados de Promises en JavaScript: Dominio del flujo asíncrono</title><link>https://takao.blog/es/web/js-promise-patterns/</link><pubDate>Tue, 05 Dec 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/es/web/js-promise-patterns/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-promise-patterns-es.png" alt="Featured image of post Patrones avanzados de Promises en JavaScript: Dominio del flujo asíncrono" /&gt;&lt;p&gt;Las Promises son fundamentales en JavaScript moderno. Más allá de cadenas básicas &lt;code&gt;.then()&lt;/code&gt;, existen patrones avanzados para control de concurrencia, manejo de errores y cancelación.&lt;/p&gt;
&lt;h2 id="combinadores-de-promises"&gt;Combinadores de Promises
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Promise.all&lt;/code&gt; resuelve cuando todas resuelven. &lt;code&gt;Promise.allSettled&lt;/code&gt; cuando todas se settling (nunca rechaza). &lt;code&gt;Promise.race&lt;/code&gt; con la primera que se settling. &lt;code&gt;Promise.any&lt;/code&gt; con la primera que resuelve.&lt;/p&gt;
&lt;h2 id="control-de-concurrencia"&gt;Control de concurrencia
&lt;/h2&gt;&lt;p&gt;Un limitador de concurrencia encola tareas y asegura que solo un número específico se ejecute simultáneamente. El patrón &lt;code&gt;pMap&lt;/code&gt; con &lt;code&gt;Promise.race&lt;/code&gt; soporta contrapresión.&lt;/p&gt;</description></item></channel></rss>