Встроенный оператор Javascript

1

У меня был немного странный результат в консоли javascript. Я пытался найти альтернативную (более читаемую) версию троичного оператора, просто для удовольствия. Typing:

{ if(3===4) {5} else {6} }

Оценивает в моей консоли до 6, но по какой-то причине я не могу назначить ее переменной, поэтому работает:

let a = { if(3===4) {5} else {6} }

Не позволяет мне сохранить его в переменной напрямую. Поэтому мой главный вопрос: если этот блок что-то возвращает, почему я не могу его назначить?

  • 1
    Вы не можете «назначить» оператор if переменной, с которой нет смысла начинать. Если вы хотите сделать это так, то вы должны присвоить значения внутри тогда и либо еще ветвь блоков кода. a
  • 0
    @CBroe Зависит ли это от смысла или нет, зависит от языка, например, мы делаем это в Ruby все время.
Показать ещё 3 комментария
Теги:

4 ответа

7
Лучший ответ

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

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

1

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

То, что вы можете использовать, если вы хотите условно присвоить значение, - это тернарный условный оператор, который является выражением:

let a = (3 === 4? 5: 6)

На данный момент вам, вероятно, интересно, почему консоль печатает значение, если оператор просто выполняет побочные эффекты? Это связано с тем, что операторы имеют значение завершения, которое для оператора if является значением завершения соответствующей ветки, а для оператора выражения (который является тем, что у 5 и 6 внутри блоков), независимо от выражения. Это в основном полезно, когда вы хотите оценить выражение в консоли и посмотреть, что он производит, без необходимости console.log() каждый раз, когда вы это делаете.

1

Используйте тернарный оператор, потому что вы не можете назначить оператор if:

let a = 3 === 4 ? 5 : 6;
  • 4
    ОП уже знает троичного оператора ...
  • 4
    Цитата из оригинального вопроса: «Я пытался найти альтернативную (более читаемую) версию троичного оператора, просто для удовольствия».
0

Это ничего не возвращает. if это не выражение, это утверждение; это не имеет значения.

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

let a;
if (condition) {
    a = 1;
}
else {
    a = 2;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню