2011-03-17 20 views
6

Quiero proteger mis funciones contra valores nulos y solo continuar si hay un valor "definido".¿Cómo se implementa una cláusula de guardia en JavaScript?

Después de lookingaround las soluciones sugirieron doblar igual a indefinido: if (something == undefined). El problema con esta solución es que puede declarar una variable indefinida.

Así que mi solución actual es comprobar nulo if(something == null) que implícitamente comprueba si no está definido. Y si quiero ver los valores falsy adicionales verifico if(something).

Consultad las pruebas aquí: http://jsfiddle.net/AV47T/2/

Ahora me estoy perdiendo algo aquí?

Matthias

Respuesta

6

El protector estándar JS es:

if (!x) { 
    // throw error 
} 

!x presionen ningún undefined, null, false, 0, o una cadena vacía.

Si desea comprobar si un valor es válida, entonces usted puede hacer esto:

if (Boolean(x)) { 
    // great success 
} 

En esta pieza, se ejecuta el bloque si x es una peroundefined, null, false , 0, o cadena vacía.

-tjw

+0

¿Y cómo se protegería de nulos e indefinidos? ¡Y nada más! – luebken

+0

Debería comprobar explícitamente esos dos casos, por ejemplo, '(x! == undefined && x! == null)'. Siempre que marque null/undefined, asegúrese de usar el '!== 'operador (identidad) y no el operador'! = '(igualdad). –

+0

y por qué no 'if (x == null)' funciona como protección contra indefinido y nulo? – luebken

6

La única forma segura que yo sepa para protegerse contra realmente variables no definidas (lo que significa que tenían el nombre variable que nunca se define en cualquier lugar) es comprobar la typeof:

if (typeof _someUndefinedVarName == "undefined") { 
    alert("undefined"); 
    return; 
} 

Cualquier otra cosa (incluido if (!_someUndefinedVarName)) fallará.

Ejemplo básico: http://jsfiddle.net/yahavbr/Cg23P/

Retire el primer bloque y obtendrá:

_someUndefinedVarName no se define

+1

jQuery asegura que 'undefined' realmente es' undefined' y no una variable al hacer esto: 'function (undefined) {...})()'. Dentro de ese cierre, 'undefined' es seguro. Como no se pasan argumentos a esta función pero tiene una firma de un parámetro, el argumento 'undefined' siempre estará indefinido, de verdad. Recomiendo esta técnica sobre la tuya tanto para la limpieza como para la eficiencia. Si el programador es lo suficientemente tonto como para meterse con 'undefined' dentro de ese cierre y luego se pregunta por qué no funciona, es su culpa ... –

1

Sólo recientemente descubierto usando '& &' como operador de guardia en JS. ¡No más si las declaraciones!

var data = { 
    person: { 
    age: 22, 
    name: null 
    } 
}; 

var name = data.person.name && doSomethingWithName(data.person.name); 
0

Ternary to the rescue!

(i) => 
    i == 0 ? 1 : 
    i == 1 ? 2 : 
    i == 2 ? 3 : 
    null 
+0

Ternary puede ser útil, pero anidado tiende a disminuir la legibilidad. En muchos lugares es una buena práctica evitar las operaciones terciarias de anidación. Dicho eso, puedes explicar cómo responde esto a la pregunta. – PJProudhon