2012-08-12 28 views
5

Tome una función de ejemplo aquí:Comprobación de los parámetros pasados ​​utilizando nula - JavaScript

function a(b){ 
    console.log(b != null ? 1 : 2); 
} 

Ese código funciona bien, mediante la impresión de 1 si pasa un parámetro, y 2 si no lo hace.

Sin embargo, JSLint me da una advertencia, diciéndome que use estrictas igualdades, es decir, !==. Independientemente de si se pasa un parámetro o no, la función imprimirá 1 cuando se usa !==.

Entonces mi pregunta es, ¿cuál es la mejor manera de verificar si se ha pasado un parámetro? No quiero usar arguments.length, o de hecho utilizar el objeto arguments.

He intentado utilizar esto:

function a(b){ 
    console.log(typeof(b) !== "undefined" ? 1 : 2); 
} 

^que parecía funcionar, pero es el mejor método?

+2

Si pasa 'undefined' entonces obtendrá un falso negativo. 'arguments.length' (o variantes) es la única forma de ver si se pasó el argumento. – Esailija

+0

@Esailija Si no es la intención de la función trabajar explícitamente con un valor indefinido, esto debería estar bien. No es responsabilidad de las funciones detectar todas las fallas de usuario posibles. – Christoph

+0

@Christoph Si realmente necesita saber si se aprobó un argumento, entonces no está bien. Si solo quieres saber si el argumento está vacío o lo que sea, entonces '! = Null''! == undefined' y así sucesivamente son tan frágiles y buenos, no hay nada a prueba de balas en eso. Prefiero '! = Null' para verificar' undefined' y 'null' al mismo tiempo. – Esailija

Respuesta

4

Cuando no se pasa ningún argumento, b es undefined, no null. Por lo tanto, la forma correcta de comprobar la existencia del argumento b es la siguiente:

function a(b){ 
    console.log(b !== undefined ? 1 : 2); 
} 

!== es recomendable porque nula e indefinido se puede forzar a ser igual si utiliza == o !=, pero utilizando !== o === se no haga la coerción de tipo para que pueda decir estrictamente si es undefined o no.

+2

Para completar, es posible deshacerse de 'typeof' dentro de la función, porque estamos en el alcance de la función, y' undefined' no se puede sobrescribir aquí :) En ámbito global , es más seguro usar 'typeof (foo)! ==" undefined "'. –

2

Puede utilizar la naturaleza Falsy de undefined (un parámetro, que no fue aprobada es de hecho undefined, no null) y acaba de escribir:

(!b)?1:2 

Sin embargo, esto también será cierto para 0, null y "" (valores falsy).

Si desea escribir de la manera a prueba de balas, se puede ir:

typeof(b) === "undefined" 
// or thanks to the write protection for undefined in html5 
b === undefined 

Actualización: gracias a EcmaScript 2015, que ahora se puede utilizar default parameters:

function a(b = 1){ 
    console.log(b); 
} 

Si un parámetro no está definido - ya sea omitido o entregado explícitamente (aquí debe usar null) - se usará el valor predeterminado, todos los demás valores permanecerán sin cambios (también falsos). Demonstration

+0

BTW si quieres usar valores predeterminados para las variables que no pasaron a la función, puedes escribir algo como 'b = b || defaultValue'. Es un lenguaje JS común para 'if (! B) {b = defaultValue;}' - con las mismas restricciones que antes ('! B' es verdadero si' b' es '0',' false', 'null ',' undefined' o '" "'). –

+1

@ jakub.g Esa es una mala idea, ya que nunca se puede pasar '0' o' "' 'como un parámetro de esta manera. Cuando trabaje con valores predeterminados, debe verificarlo de manera segura y no usar la naturaleza falsa. – Christoph

+0

Eso es correcto. Sin embargo, tiene más sentido cuando el parámetro esperado debe ser un objeto ('b = b || {}'). –

Cuestiones relacionadas