Определение переменной JavaScript: запятые или точка с запятой

88

Каковы различия и / или преимущества использования запятых при объявлении группы переменных вместо точки с запятой, если таковые имеются.

Например:

var foo = 'bar', bar = 'foo';

против

var foo = 'bar';
var bar = 'foo';

Я знаю, что если вы укажете varключевое слово для первой переменной в первом примере, оно будет сохраняться во всех переменных, так что обе они дают одинаковый конечный результат в отношении области действия. Это просто личные предпочтения или есть ли преимущество в производительности в любом случае?

Коллин Клопфенштейн
источник

Ответы:

72

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

Первая версия просто более лаконична.


Обновить:

С точки зрения количества данных, передаваемых по сети, конечно, лучше меньше, однако вам понадобится чертовски много удаленных varобъявлений, чтобы увидеть реальное влияние.

Минификация была упомянута как то, что первый пример поможет с лучшей минификацией, однако, как указывает Даниэль Вассалло в комментариях, хороший минификатор в любом случае автоматически сделает это за вас, так что в этом отношении никакого воздействия не будет.

Одед
источник
8
При минимизации вашего javascript есть преимущество в производительности.
Райан Кинал,
1
@Ryan Kinal - где именно в вопросе упоминается минификация?
Oded
2
@Oded - минификация соответствует проблемам производительности. Следовательно, если какой-то стиль поддается лучшей минификации, то он косвенно влияет на производительность
STW
7
@Ryan: Хорошие минификаторы, такие как Google Closure Compiler, объединят несколько операторов var в один: img840.imageshack.us/img840/3601/closurecompilerservice.jpg
Даниэль Вассалло
2
Да ты прав. Из любопытства я создал тест ( jsperf.com/… ), прогнал его 5 раз и получил 5 разных ответов. Итак, да, все дело в стиле и личных предпочтениях, а не в производительности.
Дерек Хендерсон
29

Прочитав Крокфорда и других, я начал связывать свои переменные исключительно запятыми. Позже меня действительно раздражал отладчик Chrome DevTools, который не останавливался на определениях переменных через запятую. Для отладчика определения переменных, объединенные запятой, представляют собой один оператор, а несколько операторов var - это несколько операторов, на которых отладчик может остановиться. Поэтому я вернулся с:

var a = doSomethingA,
    b = doSomethignB,
    c = doSomethingC;

Кому:

var a = doSomethingA;
var b = doSomethignB;
var c = doSomethingC;

К настоящему времени я считаю второй вариант намного чище, не говоря уже о его преимуществе в решении проблемы отладчика.

Аргумент «меньше кода по сети» неубедителен, поскольку есть минификаторы.

Феликс
источник
1
Я действительно испытал это на себе. Обычно я просто разделяю объявление, где мне нужно что-то проверить, и вставляю debuggerтуда, затем добавляю еще одно varи продолжаю их связывать запятыми. Затем, когда я закончу отладку, я возвращаюсь и удаляю debuggerи лишнее var.
Коллин Клопфенштейн
7
Второй вариант также делает историю git чище. Вместо того, чтобы заменять конечную точку с запятой на запятую перед добавлением другой переменной или рисковать созданием глобальной переменной, вы просто добавляете полный оператор var.
payne8
Следует отметить, что первая форма может ошибочно заставить вас думать, что b или c являются глобальными.
garg10may
18

Я предпочитаю var-per-variableобозначения:

var a = 2
var b = 3

потому что у других comma-instead-of-another-varобозначений есть эти три недостатка:

1. Трудно поддерживать.
Рассмотрим этот код:

var a = 1,
    b = mogrify(2),
    c = 3

Но эй, а что делает могрифи? Напечатаем b, чтобы узнать:

var a = 1,
    b = mogrify(2),
    console.log(b)
    c = 3

ломает вещи

2. Трудно читать

Переменная в начале строки ясно сообщает, что будет инициирована новая переменная.

var get_all_unicorn_promise = db.get_all_unicorns((unicorn) => {
        unicorn.legs.map((leg) => {
            leg.log('yes')
        })
    }).sort(),
    c = 3

Что, черт возьми, там c = 3делаешь?

3. Не соответствует

Учти это:

var a = 1,
    b = 2,
    c = 3

С var-per-variableкаждым объявлением следуйте одной и той же структуре. При comma-instead-of-another-varэтом первая переменная объявляется иначе, чем другие. Если вы решите, скажем, переместить первую переменную внутри цикла for, вам нужно будет добавить var в середину объявлений.

Помимо предпочтений, похоже, что большинство известных проектов используют var-per-variableнотацию

Мартин Готвайс
источник
пример того, как этот уродливый стиль (запятая вместо другого-var) делает это и сбивает людей с толку, см. stackoverflow.com/questions/37332155/…
Скотт Уивер
7

Я согласен с другими ответчиками, что это в основном вопрос личного стиля. Но чтобы внести в обсуждение «авторитетное» мнение, вот что говорит Дуглас Крокфорд на веб-сайте популярного инструмента JSLint :

Но поскольку JavaScript не имеет области видимости блока, разумнее объявить все переменные функции в верхней части функции. Рекомендуется использовать один оператор var для каждой функции. Это может быть выполнено с помощью onevarопции.

Даниэль Вассалло
источник
6
Может быть , стоит отметить , что Mozilla Javascript ( с помощью letконструкции) делает иметь блок сферы.
BlackVegetable 02
3
@BlackVegetable letможно использовать не только в Mozilla JS ( см. Здесь ). Это часть спецификации ES6 , но большинство браузеров все еще работают над реализацией функций ES6.
mbomb007
3

Как отмечали другие, это предпочтение стиля. JSLint может сказать вам иметь только одну varфункцию для каждой (если вы используете «Хорошие части»). Таким образом, если вы используете JSLint для проверки вашего кода (неплохая идея, IMHO), вы в конечном итоге будете использовать первый формат больше, чем второй.

С другой стороны, тот же автор, Дуглас Крокфорд , советует помещать каждую переменную в отдельную строку в своих соглашениях о кодировании . Так что вы можете снять флажок «Все по одному varна функцию» в JSLint, если вы его используете. ;-)

Обезьяна-еретик
источник
1
Он прав. Размещение переменных в отдельных строках рекомендуется на большинстве языков, потому что алгоритмы слияния системы управления версиями обычно работают, сравнивая каждую строку как обычный текст (а не лексические операторы внутри строки). Если два человека редактируют одну и ту же функцию, объявление нескольких переменных в одной строке почти наверняка вызовет конфликт слияния, тогда как отдельные строки почти всегда можно объединить автоматически. (Независимо от того, были ли они объявлены как отдельные varутверждения или заключены в цепочку запятыми.)
Ричард Дингуолл,
2

Я не думаю, что есть какая-то заметная разница, насколько я понимаю, это просто личные предпочтения.

Я ненавижу иметь несколько объявлений var, поэтому обычно делаю:

var 
   one
  ,two
  ,three
  ,four
;

Поскольку он короче и, возможно, более читабелен, varшума нет .

Медер Омуралиев
источник
22
ключевое слово на "возможно". Если бы я нашел этот образец у нас, он бы var one, two, three four;очень быстро стал . Добавление строк ради строк в Javascript может быть опасным (интерпретаторы JS могут вставлять свои собственные - ;если вы этого не ожидаете, вы быстро обнаружите побочные эффекты. Кроме того, ведущая ,ошибка меня , ключевые слова, получающие отдельную строку, меня беспокоят, отдельная строка вызывает у меня ошибку ;. Вам платят за линию?
STW,
8
@STW - автоматическая вставка точки с запятой звучит как случайная вещь, зависящая от прихотей отдельных браузеров, но на самом деле это происходит только в соответствии с четко определенным набором правил, и вам не нужно беспокоиться о том, что это может произойти в в середине вашего varобъявления. (Хотя я согласен с вами в том, что первые запятые, а varтакже последняя точка с запятой находятся на отдельных строках - все три меня тоже
вызывают
1
Я не думаю, что это действительно ответ на вопрос, поскольку вопрос не в личных предпочтениях.
Keith Pinson
2

Поскольку я не вижу на него ссылок, вот ссылка на спецификацию ECMA-262, которая является базовой спецификацией для JavaScript. Грамматика с этой страницы гласит:

12.2 Variable Statement

Syntax

  VariableStatement :
    var VariableDeclarationList ;

  VariableDeclarationList :
    VariableDeclaration
    VariableDeclarationList , VariableDeclaration

  VariableDeclarationListNoIn :
    VariableDeclarationNoIn
    VariableDeclarationListNoIn , VariableDeclarationNoIn

  VariableDeclaration :
    Identifier Initialiseropt

  VariableDeclarationNoIn :
    Identifier InitialiserNoInopt

  Initialiser :
    = AssignmentExpression
  InitialiserNoIn :
    = AssignmentExpressionNoIn

То, что вы можете извлечь из этого, использовать запятые или нет, не имеет значения. В любом случае он анализируется как a VariableDeclarationи обрабатывается точно так же. Не должно быть разницы в том, как обработчик сценариев обрабатывает эти два объявления. Единственными отличиями могут быть те, которые уже упоминались в других ответах - экономия места и практически неизмеримые различия в количестве времени, необходимом для применения грамматики, чтобы найти все, VariableDeclarationsкогда скрипт скомпилирован.

Скотт Мермельштейн
источник
1

Первый сохраняет несколько символов - так что это очень небольшая экономия с точки зрения размера файла JS и, следовательно, потребления полосы пропускания. Единственный раз, когда это станет заметным, - это крайний случай.

STW
источник
Это предполагает, что вы не уменьшаете свои файлы - и серьезно, кто не минифицирует свои файлы в наши дни?
Keith Pinson
1

Я предпочитаю второй вариант (у каждого свой var). Я думаю, это потому, что я вырос в C ++. В C ++ вы можете объявлять переменные, как в первом примере, но это не одобряется (это легко приводит к ошибкам, когда вы пытаетесь создать указатели таким образом).

Rmeador
источник
1
Интересный момент, но я не уверен, что он отвечает на вопрос о реальных преимуществах и недостатках этого синтаксиса JavaScript .
Keith Pinson
1

Если вы уменьшаете свой javascript, это дает довольно большое преимущество:

var one, two, three, four;

становится

var a, b, c, d;

В то время как

var one;
var two;
var three;
var four;

становится

var a;
var b;
var c;
var d;

Это еще три экземпляра var, которые со временем могут накапливаться.

См. Серию статей "A List Apart" "Лучшая минификация Javascript", часть 1 и часть 2.

Райан Кинал
источник
6
Хорошие минификаторы, такие как Google Closure Compiler, объединят несколько операторов var в один: img840.imageshack.us/img840/3601/closurecompilerservice.jpg . Следовательно, этот аргумент актуален только в том случае, если вы используете менее умный минификатор ... что вам не следует :)
Даниэль Вассалло
2
И если вы выполняете сжатие, повторение var s не приведет к заметному увеличению размера сжатого файла (если я правильно понимаю gzip).
Пол Д. Уэйт,