【PHP、JavaScript】三種實用的符號運算子 ?:、??、??=

【PHP、JavaScript】三種實用的符號運算子 ?:、??、??=

本篇重點

  • 介紹 ?:????= 的使用方式
  • JavaScript 沒有 ?: 符號相鄰的簡化用法,但可以使用 || 來達到類似效果
  • PHP 和 JavaScript 判斷假值標準不完全相同
  • 了解符號運算子的可使用版本

在開發中,常常會遇到要檢查變數是否有值、是否被設定的情況。為了讓程式碼更簡潔,PHP 和 JavaScript 提供了三種「簡化條件運算子」:

  • ?:(三元運算子)
  • ??(Null 合併運算子)
  • ??=(Null 合併賦值運算子)

?: 三元運算子

PHP

常見用法(PHP 4+)

?: 是條件運算子(if...else...)的簡寫

php
1
條件式 ? 成立時的值 : 不成立時的值;

範例:

php
1
$age = isset($_POST['age']) && intval($_POST['age']) > 0 ? intval($_POST['age']) : 0;
  • 如果使用者有傳入 age,且值大於 0,就使用該值
  • 否則預設為 0

簡化用法(PHP 5.3+)

當「條件」與「成立時的值」相同時可省略重複語句

php
1
條件式 ?: 不成立時的值;

範例:

php
1
2
3
4
5
6
7
8
9
// $nickname 未設定值
$nickname = '';
$name = $nickname ?: '訪客';
echo $name; // 訪客

// $nickname 有設定值
$nickname = 'John';
$name = $nickname ?: '訪客';
echo $name; // John
  • 如果 $nickname 的值存在,返回 $nickname
  • 如果 $nickname 的值為假值(falsy,如空字串、0、null、false),返回後方的 '訪客'

等同於:

php
1
$name = $nickname ? $nickname : '訪客'

JavaScript

?: 是條件運算子(if...else...)的簡寫

js
1
條件式 ? 成立時的值 : 不成立時的值;

範例:

js
1
2
3
4
5
6
7
let inputAge = null;
let age = inputAge > 0 ? inputAge : 0;
console.log(age); // 0

inputAge = 10;
age = inputAge > 0 ? inputAge : 0;
console.log(age); // 10
  • 如果使用者有傳入 age,且值大於 0,就使用該值
  • 否則預設為 0

健忘筆記

JavaScript 沒有 ?: 符號相鄰的簡化用法,但可以使用 || 來達到類似效果

let nickname = inputNickname || '訪客';

不過 JavaScript 假值的定義和 PHP 不完全相同,詳情可見【MDN】JavaScript 假值介紹

?? Null 合併運算子

PHP( 7+)

用來檢查變數是否「被設定」且「不為 null」,如果條件不符,則使用後方預設值,和 isset() 的判斷結果相同

php
1
$變數 ?? $預設值;

範例:

php
1
2
$user = $_GET['user_name'] ?? 'noName';
echo $user;
  • 如果 $_GET['user_name'] 存在且不為 null,就返回 $_GET['user_name']
  • 否則返回 'noName'

等同於:

php
1
$user = isset($_GET['user']) ? $_GET['user'] : '預設使用者';

?:?? 的差異比較

?:?? 兩者都有檢查變數是否有值、是否被設定的功用,但判斷標準不完全相同

php
1
2
3
4
5
6
7
8
$value1 = 0 ?: 100; // 100 (因為 0 是假值)
$value2 = 0 ?? 100; // 0 (因為 0 不是 null)

$value1 = '' ?: 100; // 100 (因為 '' 是假值)
$value2 = '' ?? 100; // '' (因為 '' 不是 null)

$value1 = null ?: 100; // 100 (因為 null 是假值)
$value2 = null ?? 100; // 100 (因為是 null)

JavaScript(ES2020+)

用來檢查變數是否「被設定」且「不為 null 或 undefined」,如果條件不符,則使用後方預設值

js
1
$變數 ?? $預設值;

範例:

js
1
2
3
4
5
6
7
let inputUserName = null;
let user = inputUserName ?? "noName";
console.log(user); // noName

inputUserName = "John";
user = inputUserName ?? "noName";
console.log(user); // John
  • 如果 inputUserName 存在且不為 nullundefined,就返回 inputUserName
  • 否則返回 'noName'

??= Null 合併賦值運算子

PHP(7.4+)

?? 的延伸寫法,如果變數未設定或為 null 自動賦予預設值,否則賦予原值

php
1
$變數 ??= $預設值;

範例:

php
1
2
$_GET['user_name'] ??= 'noName';
echo $_GET['user_name'];
  • 如果 $_GET['user_name'] 未設定或為 null,就賦值為 'noName'
  • 如果已經有設定值(例如 'John'),則不做任何改變

等同於:

php
1
2
3
if (!isset($_GET['user_name'])) {
$_GET['user_name'] = 'noName';
}

JavaScript(ES2021+)

?? 的延伸寫法,如果變數為 nullundefined 自動賦予預設值,否則賦予原值

js
1
$變數 ??= $預設值;

範例:

js
1
2
3
4
5
6
7
let user_name = null;
user_name ??= "noName";
console.log(user_name);

user_name = "John";
user_name ??= "noName";
console.log(user_name);
  • 如果 user_namenullundefined,就賦值為 'noName'
  • 如果已經有設定值(例如 'John'),則不做修改

結論

在 PHP 和 JavaScript 中,可以使用 ?:????= 提升程式的簡潔性和可讀性,適合應用在表單接收、API 處理等場景!

延伸閱讀

【PHP、JavaScript】三種實用的符號運算子 ?:、??、??=

https://forgetfulengineer.github.io/Backend/PHP/Three-Useful-Symbol-Operators/

作者

健忘工程師

發表於

2025-04-29

更新於

2025-04-29

許可協議


你可能也想看

【PHP、JavaScript】陣列自定義排序
【Tool】Unix 時間戳(Unix timestamp)轉換
【PHP】4種判斷變數或陣列是否存在的方法

評論

複製完成