Нужны ли скобки в однострочных операторах в JavaScript? - PullRequest
133 голосов
/ 25 января 2011

Однажды я услышал, что оставлять фигурные скобки в однострочных операторах может быть вредно для JavaScript. Я больше не помню причины, и поиск в Google не сильно помог.

Есть ли что-нибудь, что делает хорошей идеей заключать все выражения в фигурные скобки в JavaScript?

Я спрашиваю, потому что, кажется, все так делают.

Ответы [ 18 ]

171 голосов
/ 25 января 2011
нет

Нет

Но они рекомендуются. Если вы когда-нибудь расширите утверждение, они вам понадобятся.

Это совершенно верно

if (cond) 
    alert("Condition met!")
else
    alert("Condition not met!")

Однако настоятельно рекомендуется всегда использовать фигурные скобки, потому что если вы (или кто-то еще) когда-либо расширяете утверждение, это потребуется.

Эта же практика применяется во всех языках стилей синтаксического языка Си со связями. C, C ++, Java и даже PHP поддерживают оператор одной строки без фигурных скобок. Вы должны понимать, что вы сохраняете только два символа , а с помощью бодрящих стилей некоторых людей вы даже не сохраняете строку. Я предпочитаю полный стиль скобок (как следует), поэтому он имеет тенденцию быть немного длиннее. Компромисс очень хорошо сочетается с тем фактом, что у вас предельно четкая читаемость кода.

if (cond) 
{
    alert("Condition met!")
}
else
{
    alert("Condition not met!")
}
87 голосов
/ 25 января 2011

Есть аспект читабельности - в том, что когда у вас есть составные операторы, это может очень запутать. (Отступ помогает, но ничего не значит для компилятора / интерпретатора)

var a;
var b;
var c;

//Indenting is clear
if (a===true)
  alert(a); //On on IF
alert(b); //Always

//Indenting is bad
if (a===true)
  alert(a); //On on IF
  alert(b); //Always but expected?

//Nested indenting is clear
if (a===true)
  if (b===true)
    alert(a); //Only on if-if
alert (b); //Always

//Nested indenting is misleading
if (a===true)
  if (b===true)
    alert(a); //Only on if-if
  alert (b); //Always but expected as part of first if?

//Compound line is misleading
//b will always alert, but suggests it's part of if
if (a===true) alert(a);alert(b); 
else alert(c); //Error, else isn't attached

И еще есть аспект расширяемости:

//Problematic
if (a===true)
  alert(a);
  alert(b); //We're assuming this will happen with the if but it'll happen always
else       //This else is not connected to an if anymore - error
  alert(c);

//Obvious
if (a===true) {
  alert(a); //on if
  alert(b); //on if
} else {
  alert(c); //on !if
} 

(Думается, что если у вас всегда есть квадратные скобки, то вы знаете, чтобы вставить другие операторы внутри этого блока).

50 голосов
/ 06 января 2013

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

Например, вопрос спрашивает, нормально ли это:

 if (condition) statement;

Это не так.спросите, нормально ли это:

 if (condition)
   statement;

Я думаю, что оставить скобки предпочтительнее, потому что это делает код более читабельным с меньшим лишним синтаксисом.код является блоком.И никогда не использовать несколько операторов в одной строке (разделенных точкой с запятой).Я нахожу это легко читаемым и понятным, и у меня никогда не возникало проблем с формулировками «если».В результате, использование скобок для одного оператора условия потребует 3 строки.Например:

 if (condition) {
   statement;
 }

Использование одной строки, если оператор предпочтительнее, поскольку он использует меньше вертикального пространства и код более компактен.

Я бы не стал заставлять других использовать этот метод,но это работает для меня, и я не могу не согласиться с приведенными примерами того, как пропуск скобок ведет к ошибкам кодирования / определения области видимости.

13 голосов
/ 23 февраля 2017

Технически нет, но в остальном абсолютно Да !!!

Забудьте о «Это личные предпочтения», «код будет работать нормально», «он работал нормально для меня»"это более читабельно" Яда Яда Б.С.Это может легко привести к очень серьезным проблемам, если вы допустите ошибку и поверите мне, что очень легко ошибиться, когда вы кодируете (Не верьте ?, посмотрите знаменитую ошибку Apple go to fail ).

Аргумент: «Это личное предпочтение»

Нет, это не так.Если только вы не команда из одного человека, уезжающая на Марс, нет.Большую часть времени будут другие люди, читающие / изменяющие ваш код.В любой серьезной команде разработчиков кода это будет рекомендуемый способ, поэтому он не является «личным предпочтением».

Аргумент: «код будет работать нормально»

Так же как и код спагетти!Означает ли это, что все в порядке, чтобы создать его?

Аргумент: "у меня все работает нормально"

В моей карьере я видел много ошибок, созданных из-заЭта проблема.Вы, вероятно, не помните, сколько раз вы прокомментировали 'DoSomething()' и сбиты с толку тем, почему 'SomethingElse()' вызывается:

if (condition) 
    DoSomething();
SomethingElse();

Или добавили SomethingMore и не заметили, что он не будет вызван(хотя отступ подразумевает иное):

if (condition)
  DoSomething();
  SomethingMore();

Вот пример из реальной жизни, который я имел.Кто-то хотел выключить все журналы, чтобы запустить поиск и замену "console.log" => //"console.log":

if (condition) 
   console.log("something");
SomethingElse();

Увидеть проблему?

Даже если вы думаете, «это так тривиальноЯ бы никогда этого не сделал ";помните, что всегда будет член команды с более низкими навыками программирования, чем вы (надеюсь, вы не худший в команде!)

Аргумент: "это более читабельно"

Если я что-то узнал о программировании, так это то, что простые вещи очень быстро становятся очень сложными.Очень часто это:

if (condition) 
    DoSomething();

превращается в следующее после того, как оно было протестировано с различными браузерами / средами / вариантами использования или добавлены новые функции:

if (a != null)
   if (condition) 
      DoSomething();
   else
      DoSomethingElse(); 
      DoSomethingMore();
else 
    if (b == null)
         alert("error b");
    else 
         alert("error a");

И сравнитеэто с этим:

 if (a != null) {
    if (condition) { 
       DoSomething();
    }
    else {
       DoSomethingElse();
       DoSomethingMore();
    }
 } else if (b == null) {
    alert("error b");
 } else {
    alert("error a");
 }

PS: Бонусные баллы идут к тому, кто заметил ошибку в примере выше.

11 голосов
/ 11 марта 2012

Нет проблем с обслуживаемостью!

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

if (a > 1)
 alert("foo"),
 alert("bar"),
 alert("lorem"),
 alert("ipsum");
else
 alert("blah");

Это правильный код, который будет работать так, как вы ожидаете!

7 голосов
/ 25 января 2011

В дополнение к причине, упомянутой @Josh K (которая также относится к Java, C и т. Д.), В JavaScript есть одна особая проблема: автоматическая вставка точки с запятой .Из примера из Википедии:

return
a + b;

// Returns undefined. Treated as:
//   return;
//   a + b;

Таким образом, это может также привести к неожиданным результатам, если использовать его так:

if (x)
   return
   a + b;

На самом деле не так уж много лучше написать

if (x) {
   return
   a + b;
}

но, может быть, здесь немного легче обнаружить ошибку (?)

6 голосов
/ 25 января 2011

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

3 голосов
/ 25 января 2011

Нет программирования для использования фигурных скобок в одной строке.

Это зависит только от предпочтений кодеров и читабельности.

Ваш код не сломается из-за этого.

2 голосов
/ 25 января 2011

Вот почему это рекомендуется

Допустим, я пишу

if(someVal)
    alert("True");

Затем приходит следующий разработчик и говорит: «О, мне нужно сделать что-то еще», поэтому они пишут

if(someVal)
    alert("True");
    alert("AlsoTrue");

Теперь, как вы видите, «Кроме того» всегда будет верным, потому что первый разработчик не использовал фигурные скобки.

1 голос
/ 25 июня 2018

Непосредственно не отвечая на вопрос, но ниже приведен краткий синтаксис о том, если условие в одной строке

Пример:

var i=true;
if(i){
  dosomething();
}

Можно записать так:

var i=true;
i && dosomething();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...