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

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

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

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

 Blorgbeard25 янв. 2011 г., 19:29
Вы можете думать о проблеме, описанной вэтот ответ
 Tower25 янв. 2011 г., 21:14
@Blorgbeard: нет, я действительно ответил на этот ответ некоторое время назад.
 Blorgbeard25 янв. 2011 г., 22:45
Ха, так я вижу. Тогда не важно :)
 Kris Ivanov25 янв. 2011 г., 19:28
Примечание: только первый оператор принимает область видимости, даже если у вас есть несколько операторов в одной строке, так что это не «операторы из одной строки», а скорее один оператор

Ответы на вопрос(18)

Решение Вопроса
нет

они вам понадобятся.

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

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

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

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

if (cond) 
{
    alert("Condition met!")
}
else
{
    alert("Condition not met!")
}
 Sirs03 окт. 2012 г., 13:50
Мой личный опыт показывает, что не размещение браслетов может привести к большим ошибкам при работе в команде.
 Keenan Lidral-Porter06 янв. 2015 г., 20:56
Рекомендуется всегда использовать фигурные скобки {}. Как сказал @Arx, есть гораздо больше места для ошибок, если вы их пропустите. Apple даже имелЖук в iOS / SSL / TLS, потому что они не используют фигурные скобки
 Josh K25 янв. 2011 г., 19:22
@Kirk: Дуглас Крокфорд рекомендует это. Я согласен с тем, что это субъективное личное решение, но при работе в группе легче просто набрать скобки.
 Jakob25 янв. 2011 г., 19:21
+1, информативный ответ. Лично я никогда не считал полезным делать эту «рекомендованную» вещь. Я никогда не кодировал Python, поэтому я не просто вставляю вещи и ожидаю, что отступ будет иметь значение. Если я добавлю заявление, я также добавлю фигурные скобки. Всегда. Не могу вспомнить ни одного раза, когда это укусило меня. Не в C, не в C #, не в JavaScript.
 Kirk Woll25 янв. 2011 г., 19:27
@ Джош, ну, Крокфорд сказал это. Это должно быть последнее слово. ;) (шучу) Проблема в том, что субъективность этой точки распространяется на все C-подобные языки, и во всем можно найти сильные мнения (для обеих позиций).

Это сводится только к предпочтениям кодеров и удобочитаемости.

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

что вы также можете оставить фигурные скобки от всего остального. Как видно вэта статья Джона Резига.

if(2 == 1){
    if(1 == 2){
        console.log("We will never get here")
    }
} else 
    console.log("We will get here")
 pixelgrease23 июн. 2015 г., 19:50
[Стиль Qt фигурных скобок] [1] требует блоков по обе стороны отelse чтобы соответствовать использованию фигурных скобок - этот пример потребует фигурных скобок наelse заблокировать, чтобы пройти проверку кода. [1]:wiki.qt.io/Qt_Coding_Style#Braces

Всегда находил, что

if(valid) return;

легче на мой взгляд, чем

if(valid) {
  return;
}

также условно, такие как

(valid) ? ifTrue() : ifFalse();

легче читать (мое личное мнение), чем

if(valid) {
  ifTrue();
} else {
  ifFalse();
}

но я думаю, что все сводится к стилю кодирования

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

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

 if (condition) statement;

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

 if (condition)
   statement;

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

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

 if (condition) {
   statement;
 }

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

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

 senderle10 сент. 2015 г., 20:35
Я всегда чувствовал, что нужно всегда включать фигурные скобки ... но я переосмысливаю это сейчас. У тебя естьAirbnb руководство по стилю на вашей стороне!
 Kim23 нояб. 2017 г., 02:11
И все же вы забываете, что большинство форматеров кода изменяют его на двухстрочный формат, и вы возвращаетесь к проблемному коду. Аргумент вертикального пространства просто глуп. Читаемость всегда выигрывает, а сегодняшние экраны огромны.
 Maciej Tokarz24 янв. 2018 г., 12:49
Две строки, добавленные для каждой скобки, чтобы окружить ваши однострочные операторы, не являются большими затратами по сравнению с потенциальным ущербом, который может быть нанесен - даже очень осторожным разработчиком - поддержанием вашего кода. Вы сами можете быть отличным разработчиком с мифическими навыками, но вы не можете предполагать, что ваши коллеги. ПОЦЕЛУЙ, оберни вещи контекстом и сделай его как можно более легким для других, иначе у тебя будут неприятности.

поэтому решил ответить на него своим опытом.

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

По состоянию на 26 февраля 2018 года это утверждение работает в Pale Moon, но не в Google Chrome.

function foo()
   return bar;

упомянутой @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;
}

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

 Cees Timmerman29 апр. 2017 г., 23:43
Все эти примеры кажутся мне ужасными, если только авторы не являются временными и оплачиваются по линии или пока это не работает.

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

if(someVal)
    alert("True");

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

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

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

 Gerrit B13 авг. 2015 г., 23:21
Это не правильно, вы пропускаете 'else': if (someVal) alert ("True"); остальное предупреждение ("Кроме того"); было бы правильно. Я бы не стал его использовать, потому что мне нравится {}, потому что он гораздо лучше читается.
 Amir Raminfar15 авг. 2015 г., 00:00
А? У меня не было другого заявления. Я говорил, что без фигурных скобок это может привести к ошибкам, если кто-то добавит новую строку. Я думаю, вы не поняли мою точку зрения.
 PostCodeism17 июн. 2016 г., 18:35
Я думаю, что он говорит, что 2-я строка будет выполнена, несмотря ни на что. Оператор If без фигурных скобок может выполнять только 1 строку.

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

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

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

 Anish Gupta19 мая 2012 г., 12:34
Разве вы не имеете в видуif, else а такжеalert и нетIf, Else а такжеAlert?
 Simon07 окт. 2014 г., 17:22
Хотя это работает в JavaScript, я не могу понять, почему вы захотите это сделать. Я рискну предположить, что большинство разработчиков не знают об этом (включая меня, прежде чем читать это), что, как я подозреваю, могло бы быстро стать проблемой поддерживаемости среди разработчиков. Иногда самый умный путь не самый лучший.
 Victor F17 авг. 2015 г., 16:28
Я предпочитаю«Хемингуэйский» подход: Очень чистый. И без пробела междуif а также(, любитьif(true) doSomething();
 Ingo Bürk25 янв. 2015 г., 09:53
Это ужасно Если кто-то добавляет оператор и забывает превратить точку с запятой в запятую в текущем втором в последнем выражении в блоке, у вас есть ошибка, которая может бытьдействительно Трудно определить, потому что запятая и точка с запятой в конце строки выглядят слишком похожими.
 xrDDDD15 февр. 2014 г., 02:50
Я никогда не видел этого раньше, используя запятые для нескольких утверждений !!!!!!

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

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
} 

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

 João Pimentel Ferreira13 мар. 2019 г., 23:16
Вот почему мы всегда должны использовать его как одну строку:if (a===true) alert(a);, Теперь понятно!

тых скобок над ним. (исключая заключенные в кавычки или закомментированные скобки или скобки в директивах препроцессора)

В противном случае K & R будет хорошим стилем отступов. Чтобы исправить их стиль, я рекомендую помещать короткие простые операторы if в одну строку.

if (foo) bar();    // I like this. It's also consistent with Python FWIW

вместо

if (foo)
   bar();   // not so good

Если бы я писал редактор, я бы заставил его кнопку автоматического форматирования сосать строку до той же строки, что и foo, и я бы сделал так, чтобы она вставляла фигурные скобки вокруг бара, если вы нажмете клавишу возврата перед этим следующим образом:

if (foo) {
  bar();    // better
}

Тогда легко и последовательно добавлять новые операторы выше или ниже бара в теле оператора if

if (foo) {
  bar();    // consistent
  baz();    // easy to read and maintain
}

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

Пример:

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

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

var i=true;
i && dosomething();

если операторы .. (Вау, что английский ..), но это своего рода тедий:

if(true)
   funcName();
else
   return null;


function funcName(){
  //Do Stuff Here...
}
 phobos08 сент. 2016 г., 14:30
Вы не должны иметь так много новых строк, когда пропускаете фигурные скобки. Выше также можно записать в две строки:if (true) funcName() а такжеelse return null

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

Есть много проблем в JavaScript. Взгляни наОб этом говорит архитектор JavaScript Дуглас Крокфорд если утверждение, кажется, хорошо, новернуть Заявление может привести к проблеме.

return
{
    ok:false;
}
//silent error (return undefined)

return{
    ok:true;
}
//works well in javascript

на двух огромных сценариях. Экспериментально я выяснил: Вы можете удалить фигурные скобки позади для if, else, while, функции *, если фигурные скобки не содержат ';', 'return', 'for', 'if', 'else', «а», «делать», «функция». Независимо от переноса строки.

function a(b){if(c){d}else{e}} //ok  
function a(b){if(c)d;else e}   //ok

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

Функция не должна заканчиваться запятой.

var a,b=function()c;  //ok *but not in Chrome
var b=function()c,a;  //error  

Проверено на Chrome и FF.

но вчера мне пришло в голову сессия Firebug (недавний Firefox 22.0), что

if (! my.condition.key)
    do something;

выполненныйсделай что-нибудь несмотря наmy.condition.key былправда, Добавление брекетов:

if (! my.condition.var) {
    do something;
}

исправил это дело. Есть множество примеров, когда это, очевидно, работает без скобок, но в этом случае это определенно не работает.

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

if (condition)
    do something; do something else;

трудно найти.

 Tobias11 июл. 2014 г., 17:23
Боюсь, не легко. Это было почти год назад ...
 gitsitgo10 июл. 2014 г., 17:53
Мне любопытно, в каком сценарии отсутствие скобок сделало условие if верным, вы можете вспомнить или привести реальный пример этого?
 Semicolon12 апр. 2015 г., 22:13
Условное выражение всегда вычисляется перед оператором. Мне также очень любопытно увидеть реальный пример этого, потому что это представляет ошибку в интерпретаторе.

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

Забудьте о «Это личные предпочтения», «код будет работать нормально», «он работал нормально для меня», «это более читабельно» yada yada BS. Это может легко привести к очень серьезным проблемам, если вы допустите ошибку и поверите мне, что очень легко совершить ошибку, когда вы кодируете (Не верьте?Apple, чтобы потерпеть неудачу ошибка).

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

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

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

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

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

В моей карьере я видел так много ошибок, созданных из-за этой проблемы. Вы, вероятно, не помните, сколько раз вы прокомментировали'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: Бонусные баллы идут тому, кто заметил ошибку в приведенном выше примере.

 rocketsarefast19 июл. 2018 г., 17:36
хорошо очевидная ошибка - DoSomethingMore (); Но есть и другая ошибка. если a равно нулю, а b равно нулю, вы получите только «ошибку b», но никогда не получите «ошибку a».

Ваш ответ на вопрос