Estoy un poco confundido acerca de Javascript indefinido y nulo.
No te confundas null
. Por lo general, tiene sentido y se comporta de manera similar a los conceptos de otros lenguajes de script de los objetos 'nulo', 'nulo' o 'Ninguno' fuera de banda.
undefined
, por otro lado, es una peculiaridad extraña de JavaScript. Es un objeto singleton que representa valores fuera de banda, esencialmente un segundo similar pero diferente null
. Surge:
Cuando llama a una función con menos argumentos que la lista de argumentos en las function
listas de instrucciones, los argumentos no pasados se establecen en undefined
. Puede probar eso con, por ejemplo:
function dosomething(arg1, arg2) {
if (arg2===undefined)
arg2= DEFAULT_VALUE_FOR_ARG2;
...
}
Con este método no se puede distinguir entre dosomething(1)
y dosomething(1, undefined)
; arg2
será el mismo valor en ambos. Si necesita distinguir la diferencia que puede ver arguments.length
, pero hacer argumentos opcionales como ese generalmente no es muy legible.
Cuando una función no tiene return value;
, regresa undefined
. En general, no es necesario usar un resultado de devolución de este tipo.
Cuando declara una variable al tener una var a
declaración en un bloque, pero aún no le ha asignado un valor, lo es undefined
. De nuevo, en realidad nunca deberías necesitar confiar en eso.
El typeof
operador espeluznante regresa 'undefined'
cuando su operando es una variable simple que no existe, en lugar de arrojar un error como sucedería normalmente si intentara referirse a él. (También puede darle una variable simple entre paréntesis, pero no una expresión completa que involucre una variable no existente). Tampoco es muy útil para eso.
Este es el controvertido. Cuando accede a una propiedad de un objeto que no existe, no obtiene inmediatamente un error como en cualquier otro idioma. En cambio, obtienes un undefined
objeto. (Y luego, cuando intente usar ese undefined
objeto más adelante en el script, saldrá mal de una manera extraña que es mucho más difícil de rastrear que si JavaScript hubiera arrojado un error de inmediato).
Esto se usa a menudo para verificar la existencia de propiedades:
if (o.prop!==undefined) // or often as truthiness test, if (o.prop)
...do something...
Sin embargo, porque puede asignar undefined
como cualquier otro valor:
o.prop= undefined;
eso no detecta realmente si la propiedad está allí de manera confiable. Es mejor usar el in
operador, que no estaba en la versión original de Netscape de JavaScript, pero ahora está disponible en todas partes:
if ('prop' in o)
...
En resumen, undefined
es un desastre específico de JavaScript, que confunde a todos. Además de los argumentos de funciones opcionales, donde JS no tiene otro mecanismo más elegante, undefined
debe evitarse. Nunca debería haber sido parte del lenguaje; null
habría funcionado bien para (2) y (3), y (4) es un error que solo existe porque al principio JavaScript no tenía excepciones.
¿Qué hace if (!testvar)
realmente? ¿Prueba para indefinido y nulo o simplemente indefinido?
Tal 'truthiness' prueba comprueba contra false
, undefined
, null
, 0
, NaN
y cadenas vacías. Pero en este caso, sí, es realmente undefined
lo que le preocupa. En mi opinión, debería ser más explícito al respecto y decir if (testvar!==undefined)
.
una vez que se define una variable, ¿puedo volver a borrarla a indefinida (por lo tanto, eliminar la variable)?
Ciertamente puede asignarle undefined
, pero eso no eliminará la variable. Solo el delete object.property
operador realmente elimina las cosas.
delete
está realmente destinado a propiedades en lugar de variables como tales. Los navegadores le permitirán salirse con la suya delete variable
, pero no es una buena idea y no funcionará en el modo estricto de ECMAScript Fifth Edition. Si desea liberar una referencia a algo para que se pueda recolectar basura, sería más habitual decirlo variable= null
.
¿Puedo pasar indefinido como parámetro?
Si.