Сокращение Javascript

#javascript #shorthand

#javascript #сокращение

Вопрос:

Если я могу сказать:

 var big = (x > 10) ? true : false;
  

вместо:

 var big;
if (x > 10) {
    big = true;
}
else {
    big = false;
}
  

как мне сделать это аналогичным образом короче?

 var now = new Date

if (now.getHours() < 5) {
    return "late night pick me up";
}
else if (now.getHours() < 9) {
    return "breakfast";
}
else if (now.getHours() < 13) {
    return "lunch";
}
else if (now.getHours() < 17) {
    return "afternoon snak";
}
else {
    return "dinner";
}
  

Огромное спасибо!

Комментарии:

1. Это то, что я подумал .. если вы удалите свой комментарий и сделаете его ответом, я отмечу вас

Ответ №1:

 var now = new Date().getHours();

return now < 5 ? "late night pick me up" :
       now < 9 ? "breakfast" :
       now < 13 ? "lunch" :
       now < 17 ? "afternoon snak" : "dinner";
  

Комментарии:

1. Почему за это не проголосовали? Это наиболее общее сокращение для такого рода задач, достаточно простое в использовании. И даже если вам придет в голову, что троичный оператор может быть соединен в цепочку, вам, вероятно, не придет в голову, если вы им не пользовались, что скобки можно убрать из a ? b : (c ? d : e) .

Ответ №2:

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

Комментарии:

1. прошу прощения у всех. Все в значительной степени правы, так что первый ответ получил галочку.

Ответ №3:

Вы не можете сокращать это конкретно, лично я бы просто написал это так:

 if (now.getHours() < 5) return "late night pick me up";
else if (now.getHours() < 9) return "breakfast";
else if (now.getHours() < 13) return "lunch";
else if (now.getHours() < 17) return "afternoon snak";
else return "dinner";
  

Это не так уж плохо, не так ли?

Комментарии:

1. Небольшое изменение: вы можете полностью удалить все «другие», оставив только «если», поскольку каждое из них приводит к оператору return. Помимо меньшего количества кода / ввода текста, все ваши условные операторы будут выстраиваться вертикально, что еще больше упростит визуальное сравнение между ними.

2. Это верно в данном конкретном случае, особенно из-за оператора ‘return’, но некоторые могут возразить, что ‘else’ улучшает разборчивость и это не должно быть потеряно необязательно

Ответ №4:

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

 var now = (now.getHours() < 5) ? "late night pick me up" : ((now.getHours() < 9) ? "breakfast" : ((now.getHours() < 13) ? "lunch" : ((now.getHours() < 17) ? "afternoon snack" : "dinner")))));
  

Я надеюсь, вы понимаете, почему это плохая идея!

Для более длинного и сложного условия, подобного этому, обычно требуется несколько строк и хорошее разделение блоков, чтобы быть легко понятным — и хотя вы, возможно, могли бы добавить разрывы строк, стандартные if-else блоки в конечном итоге выйдут победителями при четком выражении вашего намерения.

Комментарии:

1. да, я понимаю, почему 🙂 это страшно

Ответ №5:

Сначала попробуйте var big = x > 10; вместо var big = (x > 10) ? true : false;

Во-вторых, вам не нужен параметр if-else при возврате.

 //looks  a little confusing, but you can move the return to line after ifs
var now = new Date  
if (now.getHours() < 5)  return "late night pick me up"; 
if (now.getHours() < 9)  return "breakfast";
if (now.getHours() < 13) return "lunch";
if (now.getHours() < 17) return "afternoon snak";
return "dinner"; 
  

Ответ №6:

Это будет выглядеть довольно грязно:

 return ((now.getHours() < 5)?"late night pick me up":
         ((now.getHours() < 9)?"breakfast":
            ((now.getHours() < 13)?"lunch":
               ((now.getHours() < 17)?"afternoon snack":
                  "dinner"
               )
            )
          )
       );
  

Вы должны помнить, что должны соответствовать скобкам.

Комментарии:

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

2. @Satish, последний раз, когда мне приходилось сопоставлять скобки, было в cLisp классе

Ответ №7:

Вы всегда можете использовать оператор switch:

 switch(true)
{
case (now.getHours() < 5):
  return "late night pick me up";
  break;
case (now.getHours() < 9):
  return "breakfast";
  break;  //etc...
default:
  return "dinner";
}
  

Комментарии:

1. Как раз собирался написать в точности то же самое.

2. 1 — спасибо за исправление, я внес правки, чтобы исправить эту проблему.

Ответ №8:

Я наткнулся на это в поисках чего-то другого. Вот небольшой прием сокращения с использованием логических операторов и злоупотреблением тем фактом, что строковые литералы являются правдивыми =]

 var hr = new Date().getHours();

return hr < 5 amp;amp; 'late night pick me up' 
    || hr < 9 amp;amp; 'breakfast' 
    || hr < 13 amp;amp; 'lunch' 
    || hr < 17 amp;amp; 'afternoon snack' 
    || 'dinner';
  

Ответ №9:

Вы всегда можете использовать таблицу для репликации функциональности:

 var now = new Date();
var meals = [
    "late night pick me up",
    "breakfast",
    "lunch",
    "afernoon snack",
    "dinner"];
return meals[parseInt(now.getHours()-4)/4];
  

Комментарии:

1. мне это тоже нравится, но это больше похоже на альтернативное представление и делает вещи короче

2. и если now.getHours() == 13 , у вас не может быть десятичных ключей в массиве ( hours[9/4] )

3. Забыл о поведении JS при разделении. Обновлено и исправлено.

4. Даже у меня был соблазн написать подобный код, но я понял, что это не работает.