У меня был немного странный результат в консоли javascript. Я пытался найти альтернативную (более читаемую) версию троичного оператора, просто для удовольствия. Typing:
{ if(3===4) {5} else {6} }
Оценивает в моей консоли до 6, но по какой-то причине я не могу назначить ее переменной, поэтому работает:
let a = { if(3===4) {5} else {6} }
Не позволяет мне сохранить его в переменной напрямую. Поэтому мой главный вопрос: если этот блок что-то возвращает, почему я не могу его назначить?
Тот факт, что возвращаемые значения блоков (и других операторов) недоступны для вашего кода. Консоли могут видеть результат, и он существует на уровне спецификации языка, но не в вашем коде.
Ваши варианты - условный оператор¹ (который вполне читабельен, когда вы привыкли к нему, но вы сказали, что ищете альтернативы ему) или if
/else
назначая a
в обеих частях:
let a;
if (3 === 4) {
a = 5;
} else {
a = 6;
}
Или вы можете использовать встроенную функцию (IIFE):
let a = (() => { if (3 === 4} return 5 else return 6; })();
Существует также предложение, предназначенное для выражения " do
выражения ", которое будет выглядеть следующим образом:
// Currently a proposal, not implemented in engines yet
let a = do { if (3 === 4) 5; else 6; };
Это предложение находится на первом этапе процесса, поэтому оно может или не может прогрессировать, и если оно прогрессирует, оно может заметно измениться до этого.
¹ Хотя вы видите "тройного оператора" много, собственное имя является условным оператором. Это тройная оператор (оператор принимающий три операнда), и в настоящее время JavaScript только троичный оператор, но это может измениться, когда - нибудь. :-)
Причина этого не срабатывает, потому что if
есть, как вы указали, выражение. Для присваивания требуется выражение, содержащее значение, которое должно быть назначено. Заявление не имеет (как таковое) значение - оно просто выполняет некоторый побочный эффект.
То, что вы можете использовать, если вы хотите условно присвоить значение, - это тернарный условный оператор, который является выражением:
let a = (3 === 4? 5: 6)
На данный момент вам, вероятно, интересно, почему консоль печатает значение, если оператор просто выполняет побочные эффекты? Это связано с тем, что операторы имеют значение завершения, которое для оператора if
является значением завершения соответствующей ветки, а для оператора выражения (который является тем, что у 5
и 6
внутри блоков), независимо от выражения. Это в основном полезно, когда вы хотите оценить выражение в консоли и посмотреть, что он производит, без необходимости console.log()
каждый раз, когда вы это делаете.
Используйте тернарный оператор, потому что вы не можете назначить оператор if
:
let a = 3 === 4 ? 5 : 6;
Это ничего не возвращает. if
это не выражение, это утверждение; это не имеет значения.
Точка тернарного оператора должна была предоставить более читаемую версию этого:
let a;
if (condition) {
a = 1;
}
else {
a = 2;
}
a