Eu sempre tive que colocar null
nas outras condições que não têm nada. Existe alguma maneira de contornar isso? Por exemplo
condition ? x = true : null;
Basicamente, existe uma maneira de fazer:
condition ? x = true;
Agora ele aparece como um erro de sintaxe
Para sua informação, aqui estão alguns exemplos de códigos reais:
!defaults.slideshowWidth ? defaults.slideshowWidth = obj.find('img').width()+'px' : null;
javascript
optimization
syntax-error
Oscar Godson
fonte
fonte
condition ? x = true : null;
provavelmente deve ser escrito comox = (condition ? true : null);
. Como um aparte, em javascript énull
avaliado como falso, portanto, neste caso, você poderiax = (condition);
e obter o mesmo resultado.if (!defaults.slideshowWidth) defaults.slideshowWidth = obj.find('img').width()+'px'
Respostas:
Antes de tudo, uma expressão ternária não substitui uma construção if / else - é equivalente a uma construção if / else que retorna um valor. Ou seja, uma cláusula if / else é código, uma expressão ternária é uma expressão , o que significa que ela retorna um valor.
Isso significa várias coisas:
=
qual será atribuído o valor de retornox = true
retorna true, pois todas as expressões retornam o último valor, mas também altera x sem que x tenha efeito sobre o valor retornado)Em resumo - o uso "correto" de uma expressão ternária é
Em vez do seu exemplo
condition ? x=true : null ;
, onde você usa uma expressão ternária para definir o valor dex
, pode usar o seguinte:Essa ainda é uma expressão e, portanto, pode não ser aprovada na validação; portanto, uma abordagem ainda melhor seria
O último passará na validação.
Mas, novamente, se o valor esperado for um booleano, basta usar o resultado da própria expressão de condição
ATUALIZAÇÃO Em relação à sua amostra, isso provavelmente é mais apropriado:
fonte
i/else
erros de digitação, pois não há caracteres suficientes.void()
. obrigado.Não, ele precisa de três operandos. É por isso que eles são chamados de operadores ternários .
No entanto, para o que você tem como exemplo, você pode fazer o seguinte:
Embora seja mais seguro usar chaves, se você precisar adicionar mais de uma instrução no futuro:
Editar: agora que você mencionou o código real no qual sua pergunta se aplica a:
fonte
Com mais frequência, as pessoas usam operadores lógicos para reduzir a sintaxe da instrução:
Mas, no seu caso particular, a sintaxe pode ser ainda mais simples
Este código retornará o
defaults.slideshowWidth
valor sedefaults.slideshowWidth
for avaliado como true e,obj.find('img').width()+'px'
caso contrário, será valor.Consulte a Avaliação de curto-circuito de operadores lógicos para obter detalhes.
fonte
fonte
(defaults.slideshowWidth) || (defaults.slideshowWidth = obj.find('img').width()+'px')
oudefaults.slideshowWidth = defaults.slideshowWidth || (obj.find('img').width()+'px')
Você poderia escrever
Portanto, x não é modificado quando a condição é falsa.
Isso então é equivalente a
EDITAR:
Existem algumas alternativas - não estou dizendo que são melhores / piores - apenas alternativas
Passar nulo como o terceiro parâmetro funciona porque o valor existente é nulo. Se você refatorar e alterar a condição, existe o risco de que isso não seja mais verdade. Passando o valor existente como a segunda opção nas proteções ternárias contra isso:
Mais seguro, mas talvez não tão agradável de se olhar, e mais digitado. Na prática, eu provavelmente escreveria
fonte
No seu caso, vejo o operador ternário como redundante. Você pode atribuir a variável diretamente à expressão, usando os operadores ||, &&.
se tornará :
É mais claro, é mais estilo "javascript".
fonte
Que tal simplesmente
fonte
Para usar um Operador Ternário sem mais dentro de uma declaração de matriz ou objeto, você pode usar o operador de dispersão ES6
...()
E para objetos:
fonte original
fonte