¿Cuál es la diferencia entre nulo e indefinido en JavaScript?
¿ Cuál es la diferencia entre null
y undefined
en JavaScript?
undefined
significa que se ha declarado una variable pero aún no se le ha asignado un valor:
var testVar;
console.log(testVar); //shows undefined
console.log(typeof testVar); //shows undefined
null
es un valor de asignación. Se puede asignar a una variable como una representación sin valor:
var testVar = null;
console.log(testVar); //shows null
console.log(typeof testVar); //shows object
De los ejemplos anteriores, queda claro que undefined
y null
son dos tipos distintos: undefined
es un tipo en sí mismo (indefinido) mientras que null
es un objeto.
Prueba :
console.log(null === undefined) // false (not the same type)
console.log(null == undefined) // true (but the "same value")
console.log(null === null) // true (both type and value are the same)
y
null = 'value' // Uncaught SyntaxError: invalid assignment left-hand side
undefined = 'value' // 'value'
La diferencia se puede explicar con el porta papel higiénico:
Un valor distinto de cero es como un soporte con un rollo de papel higiénico y todavía hay papel en el tubo.
Un valor cero es como un soporte con un tubo de papel higiénico vacío.
Un valor nulo es como un soporte que ni siquiera tiene un tubo de pañuelos.
Un valor indefinido es similar a que falta el propio titular.
Elegí esto de aquí
El valor indefinido es un valor primitivo que se utiliza cuando a una variable no se le ha asignado un valor.
El valor nulo es un valor primitivo que representa la referencia nula, vacía o inexistente.
Cuando declaras una variable mediante var y no le das un valor, tendrá el valor indefinido. Por sí solo, si intenta WScript.Echo() o alert() este valor, no verá nada. Sin embargo, si le agrega una cadena en blanco, de repente aparecerá:
var s;
WScript.Echo(s);
WScript.Echo("" + s);
Puede declarar una variable, establecerla como nula y el comportamiento es idéntico excepto que verá impreso "nulo" frente a "indefinido". De hecho, esta es una pequeña diferencia.
Incluso puedes comparar una variable que no está definida con nula o viceversa, y la condición será verdadera:
undefined == null
null == undefined
Sin embargo, se consideran dos tipos diferentes. Si bien indefinido es un tipo en sí mismo, nulo se considera un valor de objeto especial. Puedes ver esto usando typeof() que devuelve una cadena que representa el tipo general de una variable:
var a;
WScript.Echo(typeof(a));
var b = null;
WScript.Echo(typeof(b));
La ejecución del script anterior dará como resultado el siguiente resultado:
undefined
object
Independientemente de que sean de diferentes tipos, seguirán actuando igual si intentas acceder a un miembro de cualquiera de ellos, es decir, generarán una excepción. Con WSH verás el temido "'varname' es nulo o no es un objeto" y eso si tienes suerte (pero ese es un tema para otro artículo).
Puede establecer explícitamente una variable para que no esté definida, pero lo desaconsejo. Recomiendo solo configurar las variables como nulas y dejar sin definir el valor de las cosas que olvidó configurar. Al mismo tiempo, te recomiendo que siempre establezcas todas las variables. JavaScript tiene una cadena de alcance diferente a la de los lenguajes de estilo C, lo que confunde fácilmente incluso a los programadores veteranos, y establecer variables en nulo es la mejor manera de evitar errores basados en él.
Otro caso en el que verá una ventana emergente indefinida es cuando utiliza el operador de eliminación. Aquellos de nosotros que pertenecemos a un mundo C podríamos interpretar incorrectamente que esto es la destrucción de un objeto, pero no es así. Esta operación lo que hace es eliminar un subíndice de un Array o un miembro de un Objeto. Para las matrices, no afecta la longitud, sino que el subíndice ahora se considera indefinido.
var a = [ 'a', 'b', 'c' ];
delete a[1];
for (var i = 0; i < a.length; i++)
WScript.Echo((i+".) "+a[i]);
El resultado del script anterior es:
0.) a
1.) undefined
2.) c
También obtendrá un resultado indefinido al leer un subíndice o miembro que nunca existió.
La diferencia entre nulo e indefinido es: JavaScript nunca establecerá nada en nulo, eso es normalmente lo que hacemos. Si bien podemos establecer variables como indefinidas, preferimos null porque nunca lo hacemos por nosotros. Cuando estás depurando, esto significa que cualquier cosa establecida en nulo es obra tuya y no de JavaScript. Más allá de eso, estos dos valores especiales son casi equivalentes.