JavaScript 運算子全解:一元、二元、三元運算子一次搞懂!

Published April 20, 2025 by 徐培鈞
JavaScript

在 JavaScript 中,「運算子(Operator)」是用來處理資料、變數、值的符號。

你可以把它們想像成程式碼中的「動作執行者」,負責做加法、比較、邏輯運算、條件判斷……等工作。

JavaScript 的運算子可依操作的運算元(operand)數量分成三大類:

  • 🧍‍♂️ 一元運算子(Unary Operator) 👉 只需要一個運算元
  • 🧍‍♂️🧍‍♀️ 二元運算子(Binary Operator)👉 需要兩個運算元
  • 🎭 三元運算子(Ternary Operator)👉 特別的條件判斷用法

這篇文章將帶你完整了解這三類運算子的差別、用途與常見語法範例!


一元運算子(Unary Operators)

📌 定義:一個就夠,動作照做

在 JavaScript 中,「一元運算子」是指只需要一個操作對象(operand)就能執行的運算符號

你可以把它想像成:「只要你給我一個值,我就可以馬上做事」,不像二元或三元運算子需要更多參與者。

常見一元運算子整理

功能將字串轉為數字(正號)
範例+"123" ➜ 123
說明將字串或其他可轉型的值變成數字。常用於處理表單輸入值
功能取負值
範例-5 ➜ -5,-"7" ➜ -7
說明將數值變成負數,也可將字串轉成負數
功能遞增(加 1)
範例count++ 或 ++count
說明增加變數值,前置與後置語意不同
功能遞減(減 1)
範例count-- 或 --count
說明減少變數值,常用於迴圈控制
功能布林反轉
範例!true ➜ false、!0 ➜ true
說明非運算,用來判斷真假值
功能取得資料型別
範例typeof "hi" ➜ "string"
說明可判斷變數目前的型別,像是 number、object、undefined
功能刪除物件屬性
範例delete obj.key
說明移除物件上的某個屬性(key),但不適用於變數或陣列元素
功能忽略運算結果
範例void 0 ➜ undefined
說明執行但不關心結果。用在立即函式或超連結阻止跳轉時

重點解釋與實務範例

+:字串轉數字的快速技巧

let x = "42";
console.log(+x); // 42

這是一個超實用的小技巧,在表單輸入(通常是字串)轉數字時常用。

例如:

let price = document.getElementById("price").value;
let total = +price * 3; // 將字串轉成數字再運算

++--:前置 vs 後置

let a = 5;
console.log(++a); // 6(先加再印出)
console.log(a--); // 6(先印再減)
console.log(a);   // 5(上一行已減 1)
行為先運算再傳回結果
行為先傳回原值再運算

這在 for 迴圈中非常常見:

for (let i = 0; i < 5; i++) {
  console.log(i);
}

!:真假反轉的好幫手

console.log(!true);   // false
console.log(!0);      // true
console.log(!"hello"); // false(非空字串為真)

更常見的做法是連用兩次 !!,將任意值「強制轉成布林值」:

const input = "123";
console.log(!!input); // true(因為不是空值)

typeof:快速看資料型別

console.log(typeof 123);        // "number"
console.log(typeof "hello");    // "string"
console.log(typeof true);       // "boolean"
console.log(typeof undefined);  // "undefined"
console.log(typeof null);       // "object"(這是歷史遺留問題)
console.log(typeof {});         // "object"
console.log(typeof []);         // "object"
console.log(typeof (() => {})); // "function"

delete:從物件中移除屬性

const person = { name: "Amy", age: 25 };
delete person.age;
console.log(person); // { name: "Amy" }

注意:delete 不能刪變數,也不會移除陣列中的元素,只會變成 empty slot

void:忽略回傳值的特殊用法

console.log(void 0); // undefined

用在不想要函式有回傳值的地方,例如:

<a href="javascript:void(0)">不跳轉的連結</a>

也會在一些立即執行函式中看到:

void function () {
  console.log("這是 IIFE");
}();

小提醒:你可能會混淆的幾件事

正確觀念除非是字串,+ 會轉數字
正確觀念錯,是 "object"(歷史 bug)
正確觀念不行,只能刪「物件屬性」
正確觀念執行時機不同,要特別注意

二元運算子(Binary Operators)

📌 定義:兩個值之間的橋樑

二元運算子是 JavaScript 中最常見的運算子形式,它需要兩個操作對象(operand),一前一後,來完成一個運算或比較的動作。

👉 你可以這樣理解它:

左邊的值 <運算子> 右邊的值

常見分類與詳細解說

📏 1️⃣ 算術運算子(Arithmetic Operators)

用於進行數值的加減乘除等數學運算。

功能加法
範例2 + 3
結果5
功能減法
範例10 - 7
結果3
功能乘法
範例4 * 5
結果20
功能除法
範例10 / 2
結果5
功能餘數(取模)
範例10 % 3
結果1
功能次方
範例2 ** 3
結果8(2 的 3 次方)

📌 小提醒:

  • 除法 / 的結果會是浮點數(即使能整除)。
  • % 常用於判斷偶數、奇數(x % 2 === 0 ➜ 偶數)。
  • ** 是 ES2016(ES7)才加入的新語法,舊版瀏覽器可能不支援。

🧮 2️⃣ 指派運算子(Assignment Operators)

將某個值「指定(assign)」給變數,並支援進一步做運算再指定。

功能指派
範例x = 10
等同於指定值為 10
功能加後指派
範例x += 1
等同於x = x + 1
功能減後指派
範例x -= 1
等同於x = x - 1
功能乘後指派
範例x *= 2
等同於x = x * 2
功能除後指派
範例x /= 2
等同於x = x / 2
功能餘數後指派
範例x %= 3
等同於x = x % 3

📌 應用技巧:

let total = 100;
total += 50; // total 現在是 150
total *= 2;  // total 現在是 300

這類語法常用於統計、加總、計數等需求中。

🔍 3️⃣ 比較運算子(Comparison Operators)

用來判斷兩個值之間的大小、相等與否,結果會回傳布林值(true 或 false)

功能相等(只比值)
範例5 == '5'
結果true
功能全等(值與型別都要相同)
範例5 === '5'
結果false
功能不等(只比值)
範例5 != '5'
結果false
功能不全等(值或型別不同)
範例5 !== '5'
結果true
功能大於
範例7 > 5
結果true
功能小於
範例3 < 5
結果true
功能大於等於
範例5 >= 5
結果true
功能小於等於
範例4 <= 3
結果false

📌 推薦做法: 永遠使用 ===!==,避免型別自動轉換造成的誤判。

延伸閱讀:初學者指南:深入了解JavaScript 中的== 與=== 比較運算符

🔗 4️⃣ 邏輯運算子(Logical Operators)

用於組合多個條件,在 if 判斷或三元運算子中非常常見。

功能且(AND)
範例a && b
說明若 a 為真,回傳 b;否則回傳 a
功能或(OR)
範例a || b
說明若 a 為真,回傳 a;否則回傳 b
功能Null 合併
範例a ?? b
說明若 a 是 null 或 undefined,則回傳 b

📌 範例與解說:

const name = "Alex";
console.log(name && "Hello"); // "Hello"(因為 name 為真)

const input = "";
const fallback = input || "Default";
console.log(fallback); // "Default"(空字串為 falsy)

const value = null;
console.log(value ?? "Not Found"); // "Not Found"

🔤 5️⃣ 字串連接運算子

除了數值,+ 也能用來合併兩個字串

let first = "Hello";
let last = "World";
console.log(first + " " + last); // Hello World

📌 注意: 如果任一操作數是字串,JavaScript 就會將另外一個也轉成字串:

console.log(100 + ""); // "100元"
console.log("數量:" + 5); // "數量:5"

這是初學者常見的錯誤來源,特別是在計算時意外拼接了字串。

二元運算子全覽

代表運算子+, -, *, /, %, **
功能數值計算
代表運算子=, +=, -= 等
功能指定與累加變數值
代表運算子==, ===, >, < 等
功能比較大小與相等性
代表運算子&&, `
功能
代表運算子+
功能拼接字串

✨ 延伸提醒:運算的型別轉換

在進行二元運算時,JavaScript 常會「偷偷」做型別轉換,這是造成 bug 的元兇之一!

console.log("5" + 1); // "51"(加號觸發字串拼接)
console.log("5" - 1); // 4(減法會自動轉數字)

💡 建議:養成明確轉型的習慣,使用 Number()String() 等函式更安全。


三元運算子(Ternary Operator)

📌 定義:用一句話完成條件判斷

三元運算子是 JavaScript 中唯一一種需要三個運算元(operands)的運算子,語法簡潔,專門用來進行「條件判斷與選擇結果」。

📗 語法格式如下:

條件 ? 成立時執行的結果 : 不成立時執行的結果

可以讀成:「如果條件成立,則回傳前者;否則回傳後者」。

這種寫法可以取代簡單的 if...else 判斷式,讓程式碼更精簡。

使用範例:年齡判斷是否可喝酒

const age = 20;

const canDrink = age >= 18 ? "可以喝酒" : "不能喝酒";

console.log(canDrink); // 可以喝酒

解釋:

  • age >= 18 是條件。
  • 如果條件成立(即年齡 ≥ 18),就回傳 "可以喝酒"
  • 如果不成立,就回傳 "不能喝酒"

多個條件的巢狀三元運算子

三元運算子也可以巢狀寫法,但要小心可讀性:

const score = 85;
const grade = score >= 90 ? "A+" :
               score >= 80 ? "A" :
               score >= 70 ? "B" :
               score >= 60 ? "C" : "F";

console.log(grade); // A

雖然語法短,但過度巢狀會讓人難以理解,建議只在條件不多時使用。

與 if…else 的比較

📄 傳統寫法:

let msg;
if (score > 60) {
  msg = "及格";
} else {
  msg = "不及格";
}

⚡ 三元寫法:

let msg = score > 60 ? "及格" : "不及格";

優勢:

  • 程式碼簡潔,一行搞定
  • 適合用於「值的選擇」,像是指派變數、顯示文字等

缺點:

  • 不適合執行多段邏輯或流程,否則會失去可讀性

什麼時候不要用三元運算子?

避免像這樣的用法:

isAdmin
  ? user.isActive
    ? doSomething()
    : doSomethingElse()
  : anotherAction();

這會讓人一眼看不出邏輯,建議改用 if...else 重構,更容易維護與除錯。


結語:運算子是程式語言的骨幹

三種運算子差異整理

運算元數量1
範例!isOpen, ++x, typeof
典型用途布林反轉、型別查詢、數值變化
運算元數量2
範例x + y, x === y
典型用途數值計算、比較、條件控制
運算元數量3
範例isOpen ? '開' : '關'
典型用途簡單條件下的值選擇

運算子不只是符號,更是程式的邏輯與運作核心。

掌握一元、二元與三元運算子的使用邏輯與差異,能幫助你:

  • 寫出更精簡、好讀的程式碼
  • 理解錯誤訊息與型別轉換問題
  • 實作更有效率的條件邏輯與資料處理

未來不管你是在寫表單驗證、畫面顯示邏輯,還是處理後端資料,運算子都會是你的好幫手!