#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. Даже у меня был соблазн написать подобный код, но я понял, что это не работает.