| 語言/格式 | 數組/列表尾逗號 | 對象/字典尾逗號 | 備註 |
|---|---|---|---|
| C / C++ | ✅ 允許 | N/A | C99/C++11 標準化,便於代碼生成與版本控制 |
| Java | ✅ 允許 | N/A | 數組初始化器允許尾逗號 |
| PHP | ✅ 允許 | ✅ 允許 | array(1,2,3,)、['a'=>1,] 均合法 |
| JavaScript | ❌ 禁止 (早期) | ❌ 禁止 (早期) | ES5+ 允許數組尾逗號,對象尾逗號 ES2017 才標準化 |
| JSON | ❌ 嚴格禁止 | ❌ 嚴格禁止 | RFC 8259 規範,解析器必須報錯 |
// C/C++/Java
int a[] = {1, 2, 3}; // ✅
int b[] = {1, 2, 3,}; // ✅ 等價
// PHP
$a = array(1, 2, 3); // ✅
$b = array(1, 2, 3,); // ✅
$c = ['x' => 1, 'y' => 2,]; // ✅ PHP 5.4+ 短語法也支援
好處:多行初始化時新增行無需修改上一行,Git diff 更乾淨,代碼生成器無需特殊處理最後一項。
// 早期 JS / IE 環境
var arr = [1, 2, 3,]; // ❌ SyntaxError
var obj = {a: 1, b: 2,}; // ❌ SyntaxError
// ES5 (2009) 允許數組尾逗號
var arr = [1, 2, 3,]; // ✅ 現代瀏覽器
// ES2017 (ES8) 允許對象尾逗號
var obj = {a: 1, b: 2,}; // ✅ 現代瀏覽器
// 最佳實踐:構建工具 (Babel/TypeScript) 轉譯兼容舊環境
陷阱:IE 11 及以下不支援對象尾逗號,直接報錯導致整腳本失效。
// ✅ 標準 JSON
{"name": "zhao", "age": 12}
// ❌ 非法 JSON(尾逗號)
{"name": "zhao", "age": 12,}
各語言解析器行為:
JSON.parse() (JS) / json_decode() (PHP) / json.loads() (Python) —— 全部拋出語法錯誤尾隨逗號是「代碼寫時爽,解析時受罪」的典型。現代編程語言趨向允許(C++11, Java, PHP, ES2017),但 **JSON 作為數據交換格式堅持極簡嚴格**,任何擴展都會破壞互操作性。開發中務必區分「程序代碼」與「數據格式」兩種語境。