validthis true sublime sintaxis react online cant javascript optimization syntax-error

javascript - true - npm jshint



Operadores ternarios en JavaScript sin un "otro" (6)

Siempre he tenido que poner null en las demás condiciones que no tienen nada. ¿Hay alguna manera de evitarlo? P.ej

condition ? x = true : null;

Básicamente, ¿hay una manera de hacerlo?

condition ? x = true;

Ahora aparece como un error de sintaxis

FYI, aquí hay un código de ejemplo real:

!defaults.slideshowWidth ? defaults.slideshowWidth = obj.find(''img'').width()+''px'' : null;


Con mayor frecuencia las personas usan los operadores lógicos para acortar la sintaxis de la declaración:

!defaults.slideshowWidth && (defaults.slideshowWidth = obj.find(''img'').width()+''px'');

Pero en su caso particular, la sintaxis puede ser aún más simple

defaults.slideshowWidth = defaults.slideshowWidth || obj.find(''img'').width()+''px'';

Este código devolverá el valor defaults.slideshowWidth si defaults.slideshowWidth se evalúa como true y obj.find(''img'').width()+''px'' value en caso contrario.

Consulte la Evaluación de cortocircuito de operadores lógicos para obtener más detalles.


En primer lugar, una expresión ternaria no reemplaza a una construcción if / else; es equivalente a una construcción if / else que devuelve un valor. Es decir, una cláusula if / else es un código, una expresión ternaria es una expresión , lo que significa que devuelve un valor.

Esto significa varias cosas:

  • use expresiones ternarias solo cuando tenga una variable en el lado izquierdo de = que deba asignarse el valor de retorno
  • solo use expresiones ternarias cuando el valor devuelto sea uno o dos valores (o use expresiones anidadas si corresponde)
  • cada parte de la expresión (después de? y después de) debe devolver un valor sin efectos secundarios (la expresión x = true devuelve verdadero ya que todas las expresiones devuelven el último valor, pero también cambia x sin que x tenga ningún efecto sobre el valor devuelto)

En resumen, el uso "correcto" de una expresión ternaria es

var resultofexpression = conditionasboolean ? truepart: falsepart;

En lugar de tu condition ? x=true : null ; ejemplo condition ? x=true : null ; condition ? x=true : null ; , donde usa una expresión ternaria para establecer el valor de x , puede usar esto:

condition && (x = true);

Esta sigue siendo una expresión y, por lo tanto, podría no pasar la validación, por lo que un enfoque aún mejor sería

void(condition && x = true);

El último pasará la validación.

Pero, de nuevo, si el valor esperado es un booleano, simplemente use el resultado de la expresión de condición misma

var x = (condition); // var x = (foo == "bar");

ACTUALIZACIÓN En relación con su muestra, esto probablemente sea más apropiado:

defaults.slideshowWidth = defaults.slideshowWidth || obj.find(''img'').width()+''px'';


En su caso, veo al operador ternario como redundante. Puede asignar la variable directamente a la expresión, usando operadores ||, &&.

!defaults.slideshowWidth ? defaults.slideshowWidth = obj.find(''img'').width()+''px'' : null ;

se convertirá :

defaults.slideshowWidth = defaults.slideshowWidth || obj.find(''img'').width()+''px'';

Está más claro, es más estilo "javascript".


No, necesita tres operandos. Es por eso que se llaman operadores ternarios .

Sin embargo, por lo que tiene como ejemplo, puede hacer esto:

if(condition) x = true;

Aunque es más seguro tener llaves si necesita agregar más de una declaración en el futuro:

if(condition) { x = true; }

Editar: Ahora que mencionas el código real al que se aplica tu pregunta:

if(!defaults.slideshowWidth) { defaults.slideshowWidth = obj.find(''img'').width()+''px''; }


Podrías escribir

x = condition ? true : x;

Entonces, x no se modifica cuando la condición es falsa.

Esto entonces es equivalente a

if (condition) x = true

EDITAR:

!defaults.slideshowWidth ? defaults.slideshowWidth = obj.find(''img'').width()+''px'' : null

Hay un par de alternativas, no estoy diciendo que sean mejores / peores, simplemente alternativas

Pasar nulo como el tercer parámetro funciona porque el valor existente es nulo. Si refactorizas y cambias la condición, entonces existe el peligro de que esto ya no sea cierto. Pasando en el valor existente como la segunda opción en los guardias ternarios contra esto:

!defaults.slideshowWidth = ? defaults.slideshowWidth = obj.find(''img'').width()+''px'' : defaults.slideshowwidth

Más seguro, pero quizás no tan agradable de ver, y más tipeo. En la práctica, probablemente escribiría

defaults.slideshowWidth = defaults.slideshowWidth || obj.find(''img'').width()+''px''


var x = condition || null;