Skip to main content

合法的尾逗号

尾逗号(即终止逗号)在向 JavaScript 代码添加元素、参数、属性时十分有用。

如果想添加新的属性,并且上一行已经使用了尾逗号,可以仅仅添加新的一行,而不需要修改上一行。

一、数组的尾逗号

JS 数组字面量的尾逗号会被忽略:

var arr = [
1,
2,
3,
];
arr; // [1, 2, 3]
arr.length; // 3

var arr = [1, 2, 3, , ,];
arr.length; // 5

为什么数组的尾逗号会被省略?有两个好处:

  • 重新排列元素项比较简单,如果要改变最后一个元素项的位置,不必添加和删除逗号。
  • 帮助版本控制系统跟踪实际发生的变化。

例如:

[
'foo'
]

修改为:

[
'foo',
'bar'
]

这么做,版本控制系统会标记 foo 行和 bar 行为已更改,尽管唯一真正的变化是添加了后面的一行。

二、对象的尾逗号

从 ECMAScript 5 开始,对象字面值中的尾逗号也符合语法:

var obj = {
foo: "bar",
baz: "qwerty",
age: 42,
};

三、函数中的尾逗号

ES 8(ECMAScript 2017)支持函数参数中的尾逗号。

1、函数参数定义

下面的两个函数定义都是合法的,并且互相等价。

function f(p) { }
function f(p,) { }

(p) => { };
(p,) => { };

尾逗号并不影响函数定义,或者其 arguments 对象的 length 属性。

尾逗号也可用于类或对象的方法定义:

class C {
one(a,) { },
two(a, b,) { },
}

var obj = {
one(a,) { },
two(a, b,) { },
};

2、函数调用

下面的两个函数调用都是合法的,并且互相等价。

f(p);
f(p,);

Math.max(10, 20);
Math.max(10, 20,);

3、函数不合法的尾逗号

仅仅包含逗号的函数参数定义或者函数调用会抛出 SyntaxError

而且,当使用剩余参数时,并不支持尾逗号。

举个例子:

function f(,) { }     // SyntaxError: missing formal parameter
(,) => { }; // SyntaxError: expected expression, got ','
f(,) // SyntaxError: expected expression, got ','
function f(...p,) { } // SyntaxError: parameter after rest parameter
(...p,) => { } // SyntaxError: expected closing parenthesis, got ','

四、解构中的尾逗号

在使用解构赋值时,尾逗号也可以用于左侧:

// 带有尾后逗号的数组解构
[a, b,] = [1, 2];

// 带有尾后逗号的对象解构
var o = {
p: 42,
q: true,
};
var { p, q, } = o;

同样地,在使用剩余参数时,会抛出 SyntaxError

var [a, ...b,] = [1, 2, 3];
// SyntaxError: rest element may not have a trailing comma

五、JSON 中的尾逗号

JSON 中不允许尾逗号。

下面两行都会抛出 SyntaxError

JSON.parse('[1, 2, 3, 4, ]');
JSON.parse('{"foo" : 1, }');
// SyntaxError JSON.parse: unexpected character
// at line 1 column 14 of the JSON data

去掉尾逗号就行了:

JSON.parse('[1, 2, 3, 4 ]');
JSON.parse('{"foo" : 1 }');