1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
|
---
title: Висящие запятые
slug: Web/JavaScript/Reference/Trailing_commas
tags:
- ECMAScript2017
- ECMAScript5
- Висящая запятая
- Запятая
- Синтаксис
translation_of: Web/JavaScript/Reference/Trailing_commas
---
<div>{{JsSidebar("More")}}</div>
<p><strong>Висящие запятые</strong> (или "последние запятые") могут быть полезны при добавлении новых элементов, параметров или свойств в код JavaScript. Если вы хотите добавить новое свойство, вы просто добавляете новую строчку без изменения предыдущей, если в ней уже использована висящая запятая. Это делает различия в контроле версий чище и изменение кода может быть менее хлопотным.</p>
<p>JavaScript с самого начала допускает использовать висящих запятых в литералах массива, а затем добавлял их в литералы объекта (ECMAScript 5) и, совсем недавно (ECMAScript 2017), к параметрам функций.</p>
<p>{{Glossary("JSON")}}, однако, не допускает висящих запятых.</p>
<h2 id="Висящие_запятые_в_литералах">Висящие запятые в литералах</h2>
<h3 id="Массивы">Массивы</h3>
<p>JavaScript игнорирует висящие запятые в массивах:</p>
<pre class="brush: js">var arr = [
1,
2,
3,
];
arr; // [1, 2, 3]
arr.length; // 3</pre>
<p>Если использовано больше одной висящей запятой, будут созданы "дырки". Массив с "дырками" называется <em>разреженным </em>(<em>плотный </em>массив не имеет "дырок"). При итерации массива при помощи, например, {{jsxref("Array.prototype.forEach()")}} или {{jsxref("Array.prototype.map()")}}, "дырки" будут пропущены.</p>
<pre class="brush: js">var arr = [1, 2, 3,,,];
arr.length; // 5
</pre>
<h3 id="Объекты">Объекты</h3>
<p>Начиная с ECMAScript 5, висящие запятые в объектах также допустимы:</p>
<pre class="brush: js">var object = {
foo: "bar",
baz: "qwerty",
age: 42,
};</pre>
<h2 id="Висящие_запятые_в_функциях">Висящие запятые в функциях</h2>
<p>ECMAScript 2017 допускает висящие запятые в списке параметров функции.</p>
<h3 id="Определение_параметров">Определение параметров</h3>
<p>Следующие определения параметров функций допустимы и равнозначны друг другу. Висящие запятые не влияют на свойство <code>length</code> функции или их объект <code>arguments</code>.</p>
<pre class="brush: js">function f(p) {}
function f(p,) {}
(p) => {};
(p,) => {};
</pre>
<p>Висящая запятая также работает с <a href="/ru/docs/Web/JavaScript/Reference/Functions/Определиние_методов">определением методов</a> для классов или объектов:</p>
<pre class="brush: js">class C {
one(a,) {},
two(a, b,) {},
}
var obj = {
one(a,) {},
two(a, b,) {},
};
</pre>
<h3 id="Вызов_функции">Вызов функции</h3>
<p>Следующие вызовов функций допустимы и равнозначны друг другу.</p>
<pre class="brush: js">f(p);
f(p,);
Math.max(10, 20);
Math.max(10, 20,);
</pre>
<h3 id="Недопустимые_висящие_запятые">Недопустимые висящие запятые</h3>
<p>Определение параметров функции или вызов функции, содержащих только запятую будет генерировать {{Jsxref("SyntaxError")}}. Кроме того, при использовании <a href="/ru/docs/Web/JavaScript/Reference/Functions/Rest_parameters">оставшихся параметров</a> не допускается использовать висящие запятые:</p>
<pre class="brush: js example-bad">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 ','
</pre>
<h2 id="Висящие_запятые_в_деструктурировании">Висящие запятые в деструктурировании</h2>
<p>Висящие запятые так же можно использовать слева при использовании <a href="/ru/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment">деструктурирующего присваивания</a>:</p>
<pre class="brush: js">// массив деструктурируется с висящей запятой
[a, b,] = [1, 2];
// объект деструктурируется с висящей запятой
var o = {
p: 42,
q: true,
};
var {p, q,} = o;
</pre>
<p>Ещё раз, при использовании оставшихся параметров будет сгенерирована {{jsxref("SyntaxError")}}:</p>
<pre class="brush: js example-bad">var [a, ...b,] = [1, 2, 3];
// SyntaxError: rest element may not have a trailing comma</pre>
<h2 id="Висящие_запятые_в_JSON">Висящие запятые в JSON</h2>
<p>Висящие запятые в объекте допустимы только в ECMAScript 5. Так как JSON основан на синтаксисе JavaScript старше, чем ES5, <strong>висящие запятые не допускаются в JSON</strong>.</p>
<p>Обе строки генерируют <code>SyntaxError</code>:</p>
<pre class="brush: js example-bad">JSON.parse('[1, 2, 3, 4, ]');
JSON.parse('{"foo" : 1, }');
// SyntaxError JSON.parse: unexpected character
// at line 1 column 14 of the JSON data
</pre>
<p>Опустите висящие запятые, чтобы правильно проанализировать JSON:</p>
<pre class="brush: js example-good">JSON.parse('[1, 2, 3, 4 ]');
JSON.parse('{"foo" : 1 }');</pre>
<h2 id="Спецификации">Спецификации</h2>
<table class="standard-table">
<tbody>
<tr>
<th scope="col">Спецификация</th>
<th scope="col">Статус</th>
<th scope="col">Комментарий</th>
</tr>
<tr>
<td>{{SpecName('ES5.1')}}</td>
<td>{{Spec2('ES5.1')}}</td>
<td>Добавлены висящие запятые в объекты.</td>
</tr>
<tr>
<td>{{SpecName('ES6')}}</td>
<td>{{Spec2('ES6')}}</td>
<td>Без изменений.</td>
</tr>
<tr>
<td>{{SpecName('ES2017')}}</td>
<td>{{Spec2('ES2017')}}</td>
<td>Добавлены висящие запятые в список параметров функций и их вызов.</td>
</tr>
<tr>
<td>{{SpecName('ESDraft')}}</td>
<td>{{Spec2('ESDraft')}}</td>
<td></td>
</tr>
</tbody>
</table>
<h2 id="Совместимость_с_браузерами">Совместимость с браузерами</h2>
<div>
<p>{{Compat("javascript.grammar.trailing_commas")}}</p>
</div>
<h2 id="Смотрите_также">Смотрите также</h2>
<ul>
<li>Initial ECMAScript proposal: <a href="https://github.com/tc39/proposal-trailing-function-commas">trailing function commas</a> by Jeff Morrison</li>
</ul>
|