<?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/zh-tw/categories/javascript/</link><description>Recent content in JavaScript on Commentary of Takao</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Commentary of Takao</copyright><lastBuildDate>Wed, 15 Jul 2026 22:01:08 +0900</lastBuildDate><atom:link href="https://takao.blog/zh-tw/categories/javascript/index.xml" rel="self" type="application/rss+xml"/><item><title>Replacing 地方Storage: Dynamic IndexedDB wrapper localForage</title><link>https://takao.blog/zh-tw/web/js-indexeddb-localforage-localstorage/</link><pubDate>Fri, 20 Feb 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/zh-tw/web/js-indexeddb-localforage-localstorage/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-indexeddb-localforage-localstorage-zh-tw.png" alt="Featured image of post Replacing 地方Storage: Dynamic IndexedDB wrapper localForage" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Client-side storage is a fundamental requirement for modern web applications — offline caches, user preferences, draft data, and session state all need to persist in the browser. For years, &lt;strong&gt;localStorage&lt;/strong&gt; has been the simplest go-to solution, but its limitations become painful as applications grow. This article compares localStorage, raw IndexedDB, and the &lt;strong&gt;localForage&lt;/strong&gt; wrapper library, providing practical guidance for choosing the right storage engine.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="the-limits-of-localstorage"&gt;The Limits of localStorage
&lt;/h2&gt;&lt;p&gt;localStorage offers a straightforward synchronous key-value API — &lt;code&gt;setItem(key, value)&lt;/code&gt; and &lt;code&gt;getItem(key)&lt;/code&gt; — but it comes with hard constraints:&lt;/p&gt;</description></item><item><title>使用 v 標誌解鎖 JavaScript RegExp 功能</title><link>https://takao.blog/zh-tw/web/js-regex-v-flag/</link><pubDate>Wed, 15 Oct 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/zh-tw/web/js-regex-v-flag/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-regex-v-flag-zh-tw.png" alt="Featured image of post 使用 v 標誌解鎖 JavaScript RegExp 功能" /&gt;&lt;h2 id="介紹"&gt;介紹
&lt;/h2&gt;&lt;p&gt;JavaScript 中的正規表示式已經有了顯著的發展。 ES2024 引入了 &lt;strong&gt;&lt;code&gt;v&lt;/code&gt; 標誌&lt;/strong&gt; — &lt;code&gt;u&lt;/code&gt; 標誌的超集，可解鎖強大的集合表示法、字符類減法、交集和正確的 Unicode 表情符號匹配。如果您一直在努力應對複雜的字元類邏輯或表情符號正規表示式模式，那麼 &lt;code&gt;v&lt;/code&gt; 標誌將改變遊戲規則。&lt;/p&gt;</description></item><item><title>ECMAScript 2025 (ES16) 中令人興奮的功能</title><link>https://takao.blog/zh-tw/web/js-es2025-new-features/</link><pubDate>Thu, 15 May 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/zh-tw/web/js-es2025-new-features/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-es2025-new-features-zh-tw.png" alt="Featured image of post ECMAScript 2025 (ES16) 中令人興奮的功能" /&gt;&lt;h2 id="介紹"&gt;介紹
&lt;/h2&gt;&lt;p&gt;每年，TC39 委員會都會更新 ECMAScript 規範，為 JavaScript 生態系引進新的語言功能和 API。&lt;/p&gt;
&lt;p&gt;對於即將推出的 &lt;strong&gt;ECMAScript 2025 (ES16)&lt;/strong&gt; 標準，一些提案已達到第 3 階段或第 4 階段，表明它們正處於瀏覽器實施和採用的最後階段。&lt;/p&gt;</description></item><item><title>JavaScript 非同步/等待應避免的模式</title><link>https://takao.blog/zh-tw/web/javascript-async-await-tips/</link><pubDate>Sat, 15 Feb 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/zh-tw/web/javascript-async-await-tips/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/javascript-async-await-tips-zh-tw.png" alt="Featured image of post JavaScript 非同步/等待應避免的模式" /&gt;&lt;h2 id="介紹"&gt;介紹
&lt;/h2&gt;&lt;p&gt;自從 ES2017 中引入 &lt;code&gt;async/await&lt;/code&gt; 以來，編寫非同步 JavaScript 變得更加直觀。它允許開發人員以看起來同步的結構表達非同步邏輯，與嵌套的 Promise 鏈 (&lt;code&gt;.then().catch()&lt;/code&gt;) 相比，大大提高了程式碼庫的可讀性。&lt;/p&gt;</description></item><item><title>JavaScript Array Methods: From 基礎 to 進階 Patterns</title><link>https://takao.blog/zh-tw/web/js-array-methods/</link><pubDate>Thu, 12 Dec 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/zh-tw/web/js-array-methods/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-array-methods-zh-tw.png" alt="Featured image of post JavaScript Array Methods: From 基礎 to 進階 Patterns" /&gt;&lt;p&gt;JavaScript arrays are the backbone of data manipulation in modern web development. With the ES2023 specification introducing immutable alternatives to long-standing mutating methods, now is the perfect time to revisit how we work with arrays. This article covers the full landscape of array methods, from the familiar &lt;code&gt;map&lt;/code&gt;, &lt;code&gt;filter&lt;/code&gt;, and &lt;code&gt;reduce&lt;/code&gt; to cutting-edge additions, with practical examples and performance insights.&lt;/p&gt;
&lt;h2 id="the-array-method-landscape"&gt;The Array Method Landscape
&lt;/h2&gt;&lt;p&gt;Array methods 秋季 into two broad categories: mutating and non-mutating. Methods like &lt;code&gt;push&lt;/code&gt;, &lt;code&gt;pop&lt;/code&gt;, &lt;code&gt;splice&lt;/code&gt;, &lt;code&gt;sort&lt;/code&gt;, and &lt;code&gt;reverse&lt;/code&gt; modify the array in place, while &lt;code&gt;map&lt;/code&gt;, &lt;code&gt;filter&lt;/code&gt;, &lt;code&gt;slice&lt;/code&gt;, and the ES2023 additions create new arrays. The industry trend is shifting toward immutability, which reduces bugs caused by unintended side effects.&lt;/p&gt;</description></item><item><title>JavaScript 類型數組：瀏覽器中的二進位資料處理</title><link>https://takao.blog/zh-tw/web/js-typed-arrays/</link><pubDate>Tue, 10 Sep 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/zh-tw/web/js-typed-arrays/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-typed-arrays-zh-tw.png" alt="Featured image of post JavaScript 類型數組：瀏覽器中的二進位資料處理" /&gt;&lt;p&gt;JavaScript 的原生 &lt;code&gt;Number&lt;/code&gt; 類型（IEEE 754 雙精度浮點數）對於二進位資料來說效率低。早期的解決方案涉及在普通數組中手動打包字節，這種方法速度慢且容易出錯。 ECMAScript 2015 正式化了型別數組，為 JavaScript 帶來了類似 C 的記憶體管理。這種三層架構 — &lt;code&gt;ArrayBuffer&lt;/code&gt;、TypedArray 視圖和 &lt;code&gt;DataView&lt;/code&gt; — 支援在瀏覽器和 Node.js 中進行高效能二進位資料處理。&lt;/p&gt;</description></item><item><title>JavaScript 代理程式與 Reflect API：元程式模式</title><link>https://takao.blog/zh-tw/web/js-proxy-reflect/</link><pubDate>Tue, 04 Jun 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/zh-tw/web/js-proxy-reflect/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-proxy-reflect-zh-tw.png" alt="Featured image of post JavaScript 代理程式與 Reflect API：元程式模式" /&gt;&lt;p&gt;JavaScript 的 &lt;code&gt;Proxy&lt;/code&gt; 和 &lt;code&gt;Reflect&lt;/code&gt; API 是該語言中最強大的元程式設計工具之一。它們允許開發人員攔截和自訂物件的基本操作——屬性存取、賦值、枚舉、函數調用，甚至建構函數調用。本文探討了所有 13 個代理陷阱、互補的 &lt;code&gt;Reflect&lt;/code&gt; API 以及 Vue 3、MobX 和 Immer 等生產框架中使用的真實模式。&lt;/p&gt;</description></item><item><title>ES2024 新功能：JavaScript 的新功能</title><link>https://takao.blog/zh-tw/web/es2024-new-features/</link><pubDate>Tue, 12 Mar 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/zh-tw/web/es2024-new-features/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/es2024-new-features-zh-tw.png" alt="Featured image of post ES2024 新功能：JavaScript 的新功能" /&gt;&lt;p&gt;ECMAScript 2024 (ES15) 為 JavaScript 引進了幾個期待已久的功能。本文透過實際範例和採用時間表指南介紹了新功能。&lt;/p&gt;
&lt;h2 id="陣列分組objectgroupby-和-mapgroupby"&gt;陣列分組：Object.groupBy 和 Map.groupBy
&lt;/h2&gt;&lt;p&gt;最受歡迎的 JavaScript 功能之一終於到來了。 &lt;code&gt;Object.groupBy&lt;/code&gt; 和 &lt;code&gt;Map.groupBy&lt;/code&gt; 根據回呼將陣列元素分割為群組：&lt;/p&gt;</description></item><item><title>JavaScript 事件循環深入探討：微任務、巨集任務及其他</title><link>https://takao.blog/zh-tw/web/js-event-loop/</link><pubDate>Mon, 19 Feb 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/zh-tw/web/js-event-loop/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-event-loop-zh-tw.png" alt="Featured image of post JavaScript 事件循環深入探討：微任務、巨集任務及其他" /&gt;&lt;p&gt;JavaScript 事件循環是該語言中最重要但又被誤解的概念之一。儘管 JavaScript 是單線程的，但它的事件循環通過複雜的隊列系統實現了非阻塞並發。本文建構了 JavaScript 如何處理非同步執行的完整心智模型，從呼叫堆疊到微任務佇列以及其間的所有內容。&lt;/p&gt;</description></item><item><title>進階 JavaScript Promise Patterns: Async Control 流程 Mastery</title><link>https://takao.blog/zh-tw/web/js-promise-patterns/</link><pubDate>Tue, 05 Dec 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/zh-tw/web/js-promise-patterns/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-promise-patterns-zh-tw.png" alt="Featured image of post 進階 JavaScript Promise Patterns: Async Control 流程 Mastery" /&gt;&lt;p&gt;Promises are fundamental to modern JavaScript, but mastering asynchronous control flow requires going beyond basic &lt;code&gt;.then()&lt;/code&gt; chains. This article explores advanced Promise patterns that intermediate to senior developers need for production applications, from concurrency control to error handling and cancellation.&lt;/p&gt;
&lt;h2 id="the-promise-landscape-beyond-basics"&gt;The Promise Landscape Beyond Basics
&lt;/h2&gt;&lt;p&gt;JavaScript provides four static methods on Promise for composing async operations, each suited to different scenarios:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Method&lt;/th&gt;
					&lt;th&gt;Resolves When&lt;/th&gt;
					&lt;th&gt;Rejects When&lt;/th&gt;
					&lt;th&gt;Use Case&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Promise.all&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;All promises resolve&lt;/td&gt;
					&lt;td&gt;Any promise rejects&lt;/td&gt;
					&lt;td&gt;Parallel API calls, all required&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Promise.allSettled&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;All promises settle&lt;/td&gt;
					&lt;td&gt;Never&lt;/td&gt;
					&lt;td&gt;Mixed results, log all outcomes&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Promise.race&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;First promise settles&lt;/td&gt;
					&lt;td&gt;First promise rejects&lt;/td&gt;
					&lt;td&gt;Timeout race conditions&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Promise.any&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;First promise resolves&lt;/td&gt;
					&lt;td&gt;All promises reject&lt;/td&gt;
					&lt;td&gt;First-successful-response pattern&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&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;results&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; Promise.&lt;span style="color:#a6e22e"&gt;allSettled&lt;/span&gt;([
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;fetch&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;/api/users&amp;#34;&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;then&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;r&lt;/span&gt; =&amp;gt; &lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;json&lt;/span&gt;()),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;fetch&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;/api/posts&amp;#34;&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;then&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;r&lt;/span&gt; =&amp;gt; &lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;json&lt;/span&gt;()),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;fetch&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;/api/comments&amp;#34;&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;then&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;r&lt;/span&gt; =&amp;gt; &lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;json&lt;/span&gt;()),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&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;successful&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;results&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;r&lt;/span&gt; =&amp;gt; &lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;status&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;fulfilled&amp;#34;&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;map&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;r&lt;/span&gt; =&amp;gt; &lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;value&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Promise.allSettled&lt;/code&gt; is particularly useful when you need to process partial results even if some operations fail, such as batch data synchronization where individual record failures should not abort the entire batch.&lt;/p&gt;</description></item></channel></rss>