# 【JavaScript 筆記】從零開始的 JS - part 1 [TOC] 歡迎你點入本篇文章,本系列網頁程式設計,主要紀錄我個人自學的軌跡,另外也作為日後個人複習用。若你喜歡本篇文章,歡迎在文章底下點一顆愛心,或是追蹤我的個人公開頁~ --- ## 簡介(Introduction) JavaScript 接下來都簡稱 JS,JS 是一個輕量級的程式語言,也是一個腳本語言,也是一種讓網頁動起來的程式語言。 JS 是一種直譯式(Interpreted)、動態型別、跨平台的腳本語言。 - 直譯式:程式碼不需要事先編譯,瀏覽器直接讀取、直接執行。 - 動態型別:變數的型別不需要事先宣告,執行時自動判斷。 - 跨平台:能在瀏覽器、伺服器(Node.js)、甚至手機 App 上執行。 - 物件導向 + 函式導向:支援多種程式設計風格,彈性非常高。 ### JS 的小故事 JavaScript 是由 Brendan Eich 在 1995 年於 Netscape 公司任職時創造,前後只花了 10 天就設計完成。雖然名字裡有 Java,但和 Java 其實是完全不同的語言,當年取這個名字純粹是行銷噱頭,純粹只是想要蹭而已。 之後 JavaScript 被提交給 ECMA 國際組織制定標準,這個標準規範就叫做 ECMAScript(ES),每年都會更新版本,目前最新為 ES2026。 ### JS 的應用 | 應用領域 | 真實案例 | | --------- | ---------------------------------- | | 網頁互動 | 按鈕點擊、表單驗證、動態更新畫面 | | 前端框架 | React、Vue、Angular 等現代框架 | | 後端伺服器 | Node.js(可以寫 API、後端邏輯) | | 手機 App | React Native(一套程式碼跑 iOS + Android 跨平台) | | 遊戲 | 在瀏覽器裡運行的網頁遊戲 | | AI / 機器學習 | TensorFlow.js 等函式庫 | | IoT 物聯網 | 控制硬體裝置 | ### 為什麼學 JS? 在一份 [Stack Overflow 2025 Survey](https://survey.stackoverflow.co/2025/technology#1-programming-scripting-and-markup-languages) 調查中,JavaScript 仍然是當前最多人使用的程式語言,而第二名為 Python。 主要因為 JS 可以同時做太多事情了,而且靈活性也很高,因此是非常值得學的一門程式語言。 ## 在 HTML 裡面寫 JS ### `<script>` 內部撰寫 放在 `<head>` 裡: ```html= <!DOCTYPE html> <html> <head> <title>My Page</title> <script> function sayHello() { alert("Hello World"); } </script> </head> <body> <button onclick="sayHello()">Print HelloWorld</button> </body> </html> ``` 註:放在 `<head>` 裡的程式碼會在網頁內容載入之前就執行,如果我們設計的 JS 需要操作頁面上的元素(例如找某個按鈕),此時頁面還沒渲染完,會找不到該元素而出錯。 ![image](https://hackmd.io/_uploads/Hko8hW3sbl.png) ### 放在 `</body>` 結尾前 ```html= <!DOCTYPE html> <html> <head> <title>My Page</title> </head> <body> <h1 id="title">原本的標題</h1> <button onclick="changeTitle()">點我改標題</button> <script> function changeTitle() { document.getElementById("title").innerHTML = "標題被改掉了!"; } </script> </body> </html> ``` 把 `<script>` 放在 `</body>` 前,能保證 HTML 全部載入後才執行 JS。 原本的畫面: ![image](https://hackmd.io/_uploads/Byi93bns-x.png) 點擊後: ![image](https://hackmd.io/_uploads/H10o3-hi-x.png) ### 外部 JS 檔案呼叫 當程式碼變多,全塞進 HTML 會非常難維護,正確做法是把 JS 獨立成一個 `.js` 檔案,再用 `<script>` 中的 `src` 屬性引入。 `main.js`: ```javascript= function changeTitle() { document.getElementById("title").innerHTML = "標題被改掉了!"; } ``` `index.html`: ```html= <!DOCTYPE html> <html> <head> <title>My Page</title> </head> <body> <h1 id="title">原本的標題</h1> <button onclick="changeTitle()">點我改標題</button> <script src="main.js"></script> </body> </html> ``` ### 內部 / 外部 js 比較 | | 內部 `<script>` | 外部 `.js` 檔 | | ---- | --------------- | ------------------------ | | 適合情境 | 小型測試、單頁面 | 正式專案、多頁面共用 | | 維護性 | 低(JS 混在 HTML 裡) | 高(JS 與 HTML 分離) | | 重複性 | 無(只能在當前頁面用) | 高(多個 HTML 都能 src 同一支 JS) | | 快取效果 | 無 | 有(瀏覽器會快取 .js 檔) | ## 在 Google Chrome 中執行 JavaScript 首先開啟 DevTools,有以下三種方式: | 方法 | 操作 | | --------- | ----------------------------------- | | 鍵盤快捷鍵 | F12(Windows)或 Cmd + Option + J(Mac) | | 右鍵選單 | 在網頁任意處按右鍵 → 選「檢查」 | | Chrome 選單 | 右上角 ⋮ → 更多工具 → 開發人員工具 | 開啟之後點到 Console: ![image](https://hackmd.io/_uploads/BJFS6hnobg.png) 開啟 Console 頁面後如下所示: ![image](https://hackmd.io/_uploads/r19UTn2j-x.png) 那有了 `>` 的提示後,就代表可以在這裡寫 JavaScript 了,一個簡單的範例如下(印出字串): ![image](https://hackmd.io/_uploads/rylppn2i-e.png) 出現 `undefined` 表示該函式是沒有回傳值的,屬於正常現象。 那在這個 Console 裡面也可以做很多事情,例如改掉網頁標題: ![image](https://hackmd.io/_uploads/rkL7A2hs-g.png) ### Console 的一些函式 #### 1. `console.log()` 最基本、最常用的輸出方法,可以印出任何型別的值。 語法: ```javascript console.log(值1, 值2, ...) ``` 範例: ```javascript= console.log("Hello World!") // Hello World! console.log(42) // 42 console.log(true) // true // 同時印出多個值,用逗號分隔 let name = "LukeTseng" let age = 19 console.log("姓名:", name, "年齡:", age) // 姓名: Luke 年齡: 19 // 也可用樣板字串(Template Literal) console.log(`我是 ${name},今年 ${age} 歲`) // 我是 Luke,今年 19 歲 ``` #### 2. `console.error()` 輸出紅色錯誤訊息,並自動附上 stack trace(呼叫路徑),通常用來表示程式遇到嚴重問題。 語法: ```javascript console.error(訊息) ``` 範例: ```javascript= console.error("找不到使用者資料!") // 例如當 API 請求失敗時 function fetchUser(id) { if (!id) { console.error("錯誤:使用者 ID 不能為空") return } console.log("正在查詢使用者:", id) } fetchUser(null) ``` 實際執行情況: ![image](https://hackmd.io/_uploads/ByExzphs-x.png) #### 3. `console.warn()` 輸出黃色警告訊息,帶有 ⚠️ 圖示,表示這不是錯誤,但要注意。 語法: ``` console.warn(訊息) ``` 範例: ```javascript= console.warn("此功能即將在下一版本移除,請改用新 API!") // 輸入值接近上限時 let diskUsage = 85 if (diskUsage > 80) { console.warn(`磁碟使用量已達 ${diskUsage}%,請注意空間`) } ``` 實際執行情況: ![image](https://hackmd.io/_uploads/r18rzTniWe.png) #### 4. `console.info()` 功能與 `console.log()` 幾乎相同,現代瀏覽器常將 Info 與 Log 顏色統一,所以現在看不到他的藍色了。 語法: ```javascript console.info(訊息) ``` 範例: ```javascript= console.info("程式啟動中,版本:v2.5.0") console.info("資料庫連線成功,共載入 42 筆資料") ``` 實際執行情況: ![image](https://hackmd.io/_uploads/rJCNYp2i-x.png) log、warn、error、info 的差別主要在顏色與語意,方便我們在 Console 的訊息過濾器中快速篩選特定類型的訊息。 #### 5. `console.table()` 這個函式會把陣列(Array)或物件(Object)以表格形式顯示出來。 語法: ``` console.table(陣列或物件) ``` 範例: ```javascript= // 印出陣列 let fruits = ["蘋果", "香蕉", "芒果"] console.table(fruits) // (index) | Values // 0 | 蘋果 // 1 | 香蕉 // 2 | 芒果 // 印出物件陣列 let students = [ { name: "Luke", score: 95 }, { name: "Amy", score: 87 }, { name: "Bob", score: 72 } ] console.table(students) // (index) | name | score // 0 | Luke | 95 // 1 | Amy | 87 // 2 | Bob | 72 ``` 實際執行情況: ![image](https://hackmd.io/_uploads/HyVlJA2jZg.png) #### 6. `console.time()` & `console.timeEnd()` 成對使用,用來測量兩點之間的程式碼執行時間,單位是毫秒(ms)。 語法: ```javascript console.time("計時器名稱") // 開始計時 // ... 要測量的程式碼 ... console.timeEnd("計時器名稱") // 停止計時並印出結果 ``` 註:`time()` 和 `timeEnd()` 的計時器名稱必須一模一樣,才能對應到同一個計時器。 範例: ```javascript= console.time("迴圈計時") let total = 0 for (let i = 0; i < 1000000; i++) { total += i } console.timeEnd("迴圈計時") // 也可以同時跑多個計時器 console.time("任務A") console.time("任務B") // ... 任務A 的程式碼 ... console.timeEnd("任務A") // ... 任務B 的程式碼 ... console.timeEnd("任務B") ``` 實際執行情況: ![image](https://hackmd.io/_uploads/HJqdJAnoZx.png) #### 7. `console.assert()` 斷言(Assert):給定一個條件,如果條件為 `false`,就輸出紅色錯誤訊息;如果條件為 `true`,什麼都不輸出 。 語法: ```javascript console.assert(條件, 錯誤訊息) ``` 範例: ```javascript= let age = 15 // 斷言 age 必須大於等於 18 console.assert(age >= 18, "年齡不符:必須滿 18 歲!") console.assert(age > 0, "年齡不能為負數") function add(a, b) { return a + b } console.assert(add(2, 3) === 5, "add() 計算錯誤!") console.assert(add(2, 3) === 6, "add() 計算錯誤!") ``` 實際執行情況: ![image](https://hackmd.io/_uploads/B1GG3Rhj-g.png) #### 8. `console.group()` & `console.groupEnd()` 把一群相關的 log 訊息縮排收納成一個群組,讓輸出更有層次感,可以折疊/展開。 語法: ```javascript console.group("群組名稱") // ... 群組內的 log ... console.groupEnd() ``` 範例: ```javascript= console.log("=== 程式開始 ===") console.group("使用者資訊") console.log("姓名:XXX") console.log("城市:高雄") console.group("學業資訊") // 巢狀群組(Nested Group) console.log("科系:資訊工程學系") console.log("年級:大一") console.groupEnd() // 關閉內層群組 console.groupEnd() // 關閉外層群組 console.log("=== 程式結束 ===") ``` 實際執行情況: ![image](https://hackmd.io/_uploads/rJngyJ6sbx.png) 註:`console.groupCollapsed("名稱")` 可以讓群組預設折疊,適合資訊量很多時使用。 #### 9. `console.count()` 每次呼叫時,計算並印出該標籤被呼叫了幾次,適合追蹤某段程式碼執行的頻率。 語法: ```javascript console.count("標籤名稱") // 計數 console.countReset("標籤名稱") // 重置計數 ``` 範例: ```javascript= // 基本用法 console.count("點擊") // 點擊: 1 console.count("點擊") // 點擊: 2 console.count("點擊") // 點擊: 3 console.count("登入") // 登入: 1(不同標籤各自計算) console.count("點擊") // 點擊: 4 // 實際情境:追蹤函式被呼叫了幾次 function processData(item) { console.count("processData 呼叫次數") // ... 處理邏輯 } let data = ["A", "B", "C", "D"] data.forEach(processData) // processData 呼叫次數: 1 // processData 呼叫次數: 2 // processData 呼叫次數: 3 // processData 呼叫次數: 4 ``` 實際執行情況: ![image](https://hackmd.io/_uploads/BJdve1Tj-l.png) #### 10. `console.trace()` 輸出目前的 Stack Trace(函式呼叫堆疊路徑),顯示程式是怎麼一步步走到這裡的,是深層除錯的利器。 語法: ```javascript console.trace("標籤(可選)") ``` 範例: ```javascript= function c() { console.trace("追蹤到這裡了!") } function b() { c() } function a() { b() } a() ``` 實際執行情況: ![image](https://hackmd.io/_uploads/S14kWJaj-x.png) 從輸出可以看到 `a()` 呼叫了 `b()`,`b()` 呼叫了 `c()`,最終執行到 `console.trace()` 的那一行 。 ### Console 函式比較 | 方法 | 顏色/圖示 | 主要用途 | | ------------------- | ------- | ---------- | | `console.log()` | 白色(預設) | 一般輸出,最萬用 | | `console.error()` | 紅色 | 嚴重錯誤 | | `console.warn()` | 黃色 | 警告、需注意但不致命 | | `console.info()` | 同 `console.log()` | 系統資訊說明 | | `console.table()` | 表格 | 視覺化陣列、物件 | | `console.time/End()` | 計時器 | 效能測量 | | `console.assert()` | 紅色 | 假設驗證 | | `console.group/End()` | 縮排群組 | 組織大量輸出 | | `console.count()` | 計數 | 追蹤呼叫次數 | | `console.trace()` | 呼叫路徑 | 深層除錯 | ## 總整理 ### 簡介 JS 是一種讓網頁動起來的輕量級腳本語言。 - 四大特性: - 直譯式:不需事先編譯,瀏覽器直接讀取執行。 - 動態型別:不需事先宣告變數型別,執行時自動判斷。 - 跨平台:可運行於瀏覽器、伺服器、手機 App。 - 多重風格:同時支援物件導向與函式導向。 - 冷知識:1995 年 Brendan Eich 僅花 10 天發明。名字裡的 Java 只是行銷蹭熱度,兩者毫無關係。其國際標準規範稱為 ECMAScript (ES)。 - 為什麼要學?Stack Overflow 2025 霸榜第一的語言,用途極廣,涵蓋:前端網頁、後端 (Node.js)、手機 App (React Native)、遊戲、AI (TensorFlow.js) 及 IoT。 ### 如何在 HTML 中寫 JS? 根據載入位置與方式,主要分為三種做法: | 撰寫方式 | 語法範例 | 優缺點與適用情境 | |-------------|-----------------------------------|-----------------------------------------------------| | 放 `<head>` 裡 | `<script>` 程式碼 `</script>` | 不推薦操作畫面:會在 HTML 渲染前執行,容易發生找不到網頁元素的錯誤,適合放純邏輯設定。 | | 放 `</body>` 前 | `<script>` 程式碼 `</script>` | 推薦單頁面:保證 HTML 載入完畢後才執行 JS,適合小型測試。 | | 引入外部 .js | `<script src=""main.js""></script>` | 將 JS 與 HTML 分離,維護性高、多頁面可共用程式碼,且瀏覽器會有快取效果。 | ### Chrome Console 在網頁按 F12 或右鍵選「檢查」即可開啟開發人員工具 (DevTools) 的 Console 面板。 **基礎輸出:** - `console.log()`:最萬用的基本輸出。 - `console.info()`:系統資訊說明(外觀通常與 `log()` 無異)。 - `console.warn()`:黃字警告(需注意但不致命)。 - `console.error()`:紅字錯誤(並附上呼叫路徑)。 **進階視覺化 & 結構化:** - `console.table()`:將陣列(Array)或物件(Object)化為表格,較直觀的函式。 - `console.group()` / `console.groupEnd()`:將多行 `log()` 縮排分群組,還能摺疊收合,讓畫面不雜亂。 **效能與邏輯測試:** - `console.time("標籤")` / `console.timeEnd("標籤")`:測量執行時間(毫秒 ms),標籤名稱必須一致。 - `console.count("標籤")`:紀錄該行程式碼被執行的次數(可用 `countReset()` 重置)。 - `console.assert(條件, "錯誤訊息")`:假設驗證。只有當條件為 `false` 時,才會印出紅色錯誤訊息;`true` 則無反應。 - `console.trace()`:印出目前的函式呼叫堆疊路徑(Stack Trace),用來追蹤程式是怎麼一步步走到這裡的,深層除錯必備。 ## 參考資料 [Introduction to JavaScript - GeeksforGeeks](https://www.geeksforgeeks.org/javascript/introduction-to-javascript/) [Adding JavaScript in HTML Document - GeeksforGeeks](https://www.geeksforgeeks.org/javascript/where-to-put-javascript-in-an-html-document/) [Console in JavaScript - GeeksforGeeks](https://www.geeksforgeeks.org/javascript/console-in-javascript/) [JavaScript 简介 | 菜鸟教程](https://www.runoob.com/js/js-intro.html) [JavaScript 用法 | 菜鸟教程](https://www.runoob.com/js/js-howto.html) [Chrome 浏览器中执行 JavaScript | 菜鸟教程](https://www.runoob.com/js/js-chrome.html) [JavaScript 输出 | 菜鸟教程](https://www.runoob.com/js/js-output.html)