2012-07-19 11 views
20

Así que estoy usando una taquigrafía Javascript if/else declaración (Leí en alguna parte que se llaman declaraciones ternarios?)Javascript abreviada si la declaración, sin la porción demás

this.dragHandle.hasClass('handle-low') ? direction = "left" : direction = "right"

Esto funciona muy bien, pero ¿Y si luego quiero usar solo una abreviatura if, sin la parte else? Al igual que:

direction == "right" ? slideOffset += $(".range-slide").width()

es esto posible?

+3

El término técnico para estos fragmentos son _expresiones condicionales_, que utilizan el operador condicional_ '?:'. Como este operador toma tres operandos, se llama operador ternario. –

+2

2 veces más rápido http://jsperf.com/speed-test-for-conditions –

Respuesta

32

puede utilizar && operador - segunda expresión operando se ejecuta sólo si primero es cierto

direction == "right" && slideOffset += $(".range-slide").width() 

en mi opinión if(conditon) expression es más legible que condition && expression

+0

probablemente se quede con la expresión 'if (condition)' - pero es bueno saber que el operador '&&' funciona en esta situación. – ahren

+1

mira '&&' es más rápido para mí http://jsperf.com/speed-test-for-conditions –

+0

He usado antes comillas dobles y funcionó ... algo así como >>> dirección == "right"? slideOffset + = $ (". range-slide"). width(): "" .... ¿Esto hace que haya algún problema? – hsobhy

2

No, esto no es posible, ya que el operador ternario requiere tres operandos con él.

first-operand ? second-operand (if first evaluates to true) : third-operand (if false) 
2

Lo que tiene no funcionará, pero ¿por qué no usar una línea de instrucción if en su lugar?

if(direction == "right") slideOffset += $(".range-slide").width();

Esto implica teclear menos que el método sugerido Ray. Por supuesto, su respuesta es válida si realmente quiere apegarse a ese formato.

0

Esto no responde exactamente a su pregunta, pero ternarios le permiten escribir menos de lo que has mostrado:

direction = this.dragHandle.hasClass('handle-low') ? "left" : "right"; 

Y ahora que lo pienso, sí, usted puede hacer su pregunta también:

slideOffset + direction == "right" ? = $(".range-slide").width() : = 0; 

Esta es una teoría. La próxima vez que tenga la oportunidad de += un ternario intentaré esto. ¡Déjame saber cómo funciona!

+0

Lo curioso es que podría funcionar. Estoy empezando a no me gusta este sitio – Dale

+0

La línea superior funciona absolutamente – Dale

9

No piense en ello como un control- bloque (es decir, un if-else o un interruptor). No es realmente para ejecutar código dentro de él.

Puedes. Simplemente se pone muy feo, muy rápido, lo que frustra el propósito.

Lo que realmente quiere utilizarlo para es la asignación de valores.

Tomando su ejemplo inicial y convertirlo en su cabeza un poco, se obtiene:

direction = (this.dragHandle.hasClass("handle-low")) ? "left" : "right"; 

Sede. Ahora lo que hice fue tomar algo que hubiera requerido un if/else o un switch, que se habría usado para asignar ese valor, y lo he limpiado bonito y bonito.

Incluso se puede hacer una cosa: si el tipo de ternario:

y = (x === 2) ? 1 : (x === 3) ? 2 : (x === 4) ? 7 : 1000; 

También se puede utilizar para disparar código, si lo desea, pero se hace muy difícil después de un tiempo, saber lo que está donde va (véase el ejemplo anterior para ver cómo incluso asignación puede comenzar a mirar raro de un vistazo) ...

((this.dragHandle.hasClass("...")) ? fireMe(something) : noMe(somethingElse)); 

... esto normalmente funcionará.

Pero en realidad no es más bonita ni más útil que una función if o de bifurcación e invocación inmediata (y los programadores no JS, o los programadores JS no entrenados se van a fastidiar tratando de mantener el código).

+1

"los programadores JS sin entrenamiento se van a cagar tratando de mantener su código" No podría haberlo dicho mejor – ajax333221

2

El operador condicional es no una abreviatura de la declaración if. Es un operador, no una declaración.

Si lo usa, debe usarlo como operador, no como una declaración.

Sólo tiene que utilizar un valor cero para el tercer operando:

slideOffset += direction == "right" ? $(".range-slide").width() : 0; 
0

que tenía un caso similar en el que quería sólo para llamar la porción if. Logrado utilizando el operador lógico & & (y).

var name = "michael"; 

var doSomething = function() { 
    return (name === "michael") && console.log("name is valid"); 
}; 

doSomething(); // will log name is valid else returns undefined but is disposed of since we never store it. 
Cuestiones relacionadas