Определение переменной JavaScript: запятые против точек с запятой - PullRequest
83 голосов
/ 23 сентября 2010

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

Например:

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

против

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

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

Ответы [ 10 ]

68 голосов
/ 23 сентября 2010

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

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


Обновление:

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

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

26 голосов
/ 22 мая 2014

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

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

На:

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

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

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

15 голосов
/ 11 августа 2016

Я предпочитаю запись 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

7 голосов
/ 23 сентября 2010

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

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

3 голосов
/ 23 сентября 2010

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

С другой стороны, тот же автор, Дуглас Крокфорд , говорит помещать каждую переменную в отдельной строке в своих соглашениях по кодированию .Поэтому вы можете снять флажок «All one var per function» в JSLint, если вы его используете.; -)

2 голосов
/ 07 февраля 2014

Поскольку я не вижу ссылок на него, здесь является ссылкой на спецификацию 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

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

1 голос
/ 23 сентября 2010

Если вы минимизируете свой 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

1 голос
/ 23 сентября 2010

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

1 голос
/ 23 сентября 2010

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

1 голос
/ 23 сентября 2010

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

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

var 
   one
  ,two
  ,three
  ,four
;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...