Por una parte decirte que ! Simplemente es un operador lógico de negación. Es decir, que niega todo aquello a lo que precede. Así por ejemplo en la condición (2==3-1) que da como resultado TRUE si anteponemos ! Entonces ! (2==3-1) dará como resultado FALSE. En este caso ! Indicaría la negación del resultado de la comparación. En otras ocasiones se emplea para indicar desigualdad (a! =2) que significaría: "a distinto de 2". ¿Por otra parte los otros dos metacaracteres? Y : suelen emplearse juntos para la asignación condicional de variables. Las sintaxis suele ser: var nombreDeVariable=(condicion)? valorTRUE : valorFALSE Donde el valor que tomará la variable nombreDeVariable dependerá de si la condición indicada se cumple o no. Si se cumple tomará el valor indicado por valorTrue y si no se cumple tomará el valor indicado por valorFalse Su análogo con sentencias if sería algo como: if (condicion) { var nombreDeVariable=valorTrue } else { var nombreDeVariable=valorFalse } ValorTrue y valorFalse pueden ser cualquier tipo de expresiones: constantes, variables, cadenas, operaciones,... Ejemplo: valor=3 var menorDiez=(valor<10)? 'menor' : 'mayor' // Compara valor frente a diez, si es menor asigna a menorDiez un valor de 'menor' y si es mayor o igual le asigna el valor 'mayor' Por último decir que puedes encadenar varias sentencias condicionales en la definición de variables, de forma que quedaría algo como: var nombreDeVariable=(condicion1)? valorTRUE : (condicion2)? valorTRUE2 : (condicion3)? valorTRUE3 : valorFalse Por ejemplo: valor=7 var menorDiez=(valor<5)? 'entre 0 y 5' : (valor<10)? 'entre 5 y 10' : (valor==10)? 'justo 10' : 'mayor que 10' // Asignaría a la variable menorDiez el valor 'entre 5 y 10' Dentro de cada una de las condiciones es donde podrás emplear el operador de negación ! Para invertir las condiciones.