25

Один мой коллега очень любит при определении константных Javascript-объектов оставлять висячие запятые:

var myObj = {
    prop1: 'smth',
    prop2: 'smthElse', // <--- Висячая запятая!
}

Мотивирует он это тем, что при исправлении такого объекта программист получит более релевантный вывод в диффе (1 строчку вместо двух).

Мне такой стиль очень не нравится, но по причинам также чисто эстетическим:
1. JSLint на такое ругается
2. Неподдержка в старых IE (8-). Но под них мы все равно не пишем.

Стандарт вообще говоря такое разрешает.

Внимание, вопрос: известны ли вам еще причины по которым висячие запятые стоит/не стоит использовать? Например положительное/отрицательное влияние на сборщики-оптимизаторы или что-нибудь в этом духе

  • В качестве плюса - можно безболезненно добавлять/удалять новые поля объекта без необходимости следить за запятой. – Vladimir Gamalyan May 16 '16 at 09:01
  • 1
    Ещё удобно для автоматической генерации кода, не нужно обрабатывать отдельно последнюю строку. – Vladimir Gamalyan May 16 '16 at 09:01
  • @VladimirGamalian, ну первое так себе аргумент, любой валидатор будет гореть на это куда сильнее чем на висячую запятую. – Утка Учится Укрываться May 16 '16 at 09:03
  • Про автогенерацию кода не думал, действительно аргумент (не наш кейс впрочем) – Утка Учится Укрываться May 16 '16 at 09:04
  • @VladimirGamalian, если нормально генерировать автоматически последнюю строку и не надо обрабатывать: в большинстве случаев есть функции объединяющие массив в строку. – Grundy May 16 '16 at 09:14
  • 2
    Поддерживаю вашего коллегу в плане удобства чтения diffa. Кроме того, с висячими запятыми blame сразу находит оригинальную ревизию, а не ту, в которой запятую дописали. –  May 16 '16 at 09:24
  • @Grundy в простых случаях да, но что если например комментарий стоит после запятой, как в примере ru_volt – Vladimir Gamalyan May 16 '16 at 09:38
  • @VladimirGamalian, ну и что? :-) – Grundy May 16 '16 at 09:39
  • @Grundy наверное я неправильно понял, думал вы предлагаете делать что-то вроде .join(',\n') для массива строк. – Vladimir Gamalyan May 16 '16 at 09:42
  • @VladimirGamalian, да я примерно это и имел ввиду, как простой случай – Grundy May 16 '16 at 09:47
  • @Grundy в случае с комментарием придется отдельно обрабатывать последнюю строку (исключить запятую), либо просто оставлять её (обычная склейка джойном не поможет в такой ситуации). – Vladimir Gamalyan May 16 '16 at 09:51
  • @VladimirGamalian, на самом деле все зависит от метода генерации, можно обрабатывать первую строку например, кроме того, ящитаю, в сгенерированном коде комментарии не нужны – Grundy May 16 '16 at 09:53
  • 1
    @Grundy т.е. логика генератора так или иначе усложняется для варианта без последней запятой. На счет ненужности комментариев не соглашусь, более того, на мой взгляд сгенерированный код также должен быть правильно отформатирован для удобства чтения. – Vladimir Gamalyan May 16 '16 at 09:57
  • @VladimirGamalian, генератор сам по себе довольно сложная штука, кроме того комментарии не относятся к форматированию, следовательно при отсутствии комментариев вполне хватит .join(',\n') и результат будет тем же без дополнительных затрат, ну и в крайнем случае проверка одного условия не так уж и сильно усложнит код одного простого цикла – Grundy May 16 '16 at 10:09
  • @PashaPash, а чтобы объединить удобство чтения diff-а с синтаксисом (произвольного) языка программирования, можно запятую ставить в начале строки с очередным элементом списка (кроме первой такой строки, разумеется). – aleksandr barakin May 17 '16 at 08:05

1 Answers1

14

Строго говоря: стандарт не запрещает использование висячих запятых в инициализаторе объекта

ObjectLiteral[Yield] :  
    { }
    { PropertyDefinitionList[?Yield] }
    { PropertyDefinitionList[?Yield] , }

Таким образом ставить или не ставить запятую целиком на совести разработчика.

В итоге, все решается договоренностью внутри группы разработчиков, чтобы код был однообразным.

Так как это допустимый вариант инициализации - никаких влияний на оптимизацию(минимизацию) оказываться не должно, но зависит от реализации оптимизатора/минификатора.

Что касается проверяльщиков: все зависит от правил, которые довольно гибко могут настраиваться.


UPD: июль 2017

Добавлю, что, на июль 2017 года, один из самых популярных стайлгайдов - стайлгайд от airbnb не просто не запрещает висячие запятые, а требует их.

Grundy
  • 81,538
  • Так как это допустимый вариант инициализации - никаких влияний на оптимизацию(минимизацию) оказываться не должно. - Утверждение представляется мне неверным. – Утка Учится Укрываться May 16 '16 at 09:55
  • А то что стандарт не запрещает да и правила можно настроить, это итак понятно) – Утка Учится Укрываться May 16 '16 at 09:56
  • @ru_volt, Утверждение представляется мне неверным - почему же? там кстати приписка есть, что может зависеть от реализации :) кроме того более чем уверен, что если не все, то большинство минификаторов просто отбросят данную запятую, как не важную часть – Grundy May 16 '16 at 09:58
  • Раз стандарт такую штуку разрешает, то оптимизаторы-минификаторы должны ее прожевать, с этим я согласен. Но при этом может случиться такое что прожевывать они могут ее с соверешенно разным трудом. Это раз. – Утка Учится Укрываться May 16 '16 at 10:03
  • 1
    @ru_volt, ну это будет уже проблема конкретного оптимизатора/минификатора – Grundy May 16 '16 at 10:03
  • Для минификаторов же существуют небезопасные режимы. Это два. – Утка Учится Укрываться May 16 '16 at 10:04
  • Ну ладно, я понял, ваш ответ на мой вопрос "мне о различиях неизвестно" =) – Утка Учится Укрываться May 16 '16 at 10:04
  • @ru_volt Для минификаторов же существуют небезопасные режимы. Это два. - в данном случае без разницы, так как запятая находится внутри инициализатора, и не влияет ни на порядок свойств, ни на свойства объявленного объекта – Grundy May 16 '16 at 10:08
  • 4
    @ru_volt, если ваш оптимизатор не в состоянии оптимизировать код, валидный по стандарту -- грош ему цена и место в помойке. В экосистеме JS существует достаточно инструментов работающих так, как следует – Dmitriy Simushev May 16 '16 at 11:11
  • Я и спрашиваю, не известно ли о наличии проблем у каких-либо известных инструментов с такими конструкциями. Мой тезис "я вполне допускаю что некоторые распространенные инструменты могут здесь лажать, не слышали ли Вы о таком?". Я не говорю что они должны лажать. – Утка Учится Укрываться May 16 '16 at 11:22