Как добиться троичного присваивания в Javascript?

Я хотел бы переназначить переменную класса в Javascript (или Typescript) с помощью тернарного оператора. Переназначение this.foo зависит от текущего значения this.foo, которое я могу обновить следующим образом:

setFoo = () => {
    this.foo = this.foo ? "" : "foo";
}

Однако мне интересно, могу ли я переназначить this.foo, не написав this.foo дважды. Это было бы полезно, потому что я пытаюсь динамически обновлять классы компонента Angular (написанного на Typescript).

Я хотел бы иметь возможность написать что-то вроде следующего, в котором используются истинные/ложные значения. Если this.foo соответствует действительности, то присваивается ""; в противном случае присваивается "foo":

setFoo = () => {
    this.foo =? "" : "foo";
}

Пробовал искать похожие вопросы, но ответа не нашел. Моей первоначальной мыслью было использовать оператор ??= в Typescript 4.0, но я не думаю, что это сработает. Возможно, моего идеального решения не существует, потому что это может быть плохой привычкой программирования. Спасибо


person Charles Kornoelje    schedule 28.10.2020    source источник
comment
вы должны уточнить, что вы пытаетесь сделать. вы написали, что this.foo является ложным, но код, который вы написали, делает обратное.   -  person Rick    schedule 28.10.2020
comment
@ Рик, я пытаюсь определить, правдив ли this.foo, если this.foo. Это опечатка изначально. Спасибо, что поймали это. Я отредактировал свой вопрос.   -  person Charles Kornoelje    schedule 28.10.2020
comment
Возможны только this.foo = this.foo || "" и this.foo = this.foo && "". Это не совсем соответствует вашим потребностям, но все же короче.   -  person Iyashi    schedule 28.10.2020
comment
тернарный - самый короткий для двух разных значений.   -  person Nina Scholz    schedule 28.10.2020
comment
Почему? Ternary сам по себе достаточно ужасен, хотя сейчас я чаще использую его с const. Не минимизируйте свой код разработки, позвольте минификатору сделать это, когда вы выпускаете код в производство.   -  person Teemu    schedule 28.10.2020
comment
то, как вы написали, работает и достаточно лаконично. Не вижу причин его сокращать.   -  person Rick    schedule 28.10.2020
comment
@Teemu и @Rick, я спросил, потому что писать this.foo дважды избыточно, и мне было любопытно узнать, смогу ли я устранить эту избыточность. Спасибо за ответы; Я согласен, что текущий способ краток.   -  person Charles Kornoelje    schedule 28.10.2020
comment
Я не считаю два this.x избыточными в этом конкретном синтаксисе, поскольку есть два оператора, и обоим операторам нужны свои операнды. Дело просто в том, что в операндах обоих операторов используется одна и та же переменная. Если бы дело было в const x = (y) ? 1 : 2;, вы бы не подумали, что 1 лишнее. Для того, что вам нужно, нам понадобится совершенно новый оператор проверки и назначения...   -  person Teemu    schedule 28.10.2020


Ответы (2)


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

foo = foo || otherCondition;

Так что стенография стенографии, на мой взгляд, не слишком полезная.

Короткий ответ: я бы выбрал обычный тернар.

person jburtondev    schedule 28.10.2020

Вы должны использовать IF ELSE вместо использования тернарного оператора, если else даст вам больше контроля над оператором, написанным под ним, и эффективным для использования.

person Rizwan    schedule 28.10.2020
comment
Я ценю ответ, но это не решает моей проблемы с повторным написанием this.foo. Один раз будет в условии оператора if, а другой будет присваивать переменную. - person Charles Kornoelje; 28.10.2020