¿Cuál es la diferencia entre nulo e indefinido en JavaScript?

Resuelto asked hace 13 años • 39 respuestas

¿ Cuál es la diferencia entre nully undefineden JavaScript?

 avatar Feb 22 '11 17:02
Aceptado

undefinedsignifica 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
Expandir fragmento

nulles 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
Expandir fragmento

De los ejemplos anteriores, queda claro que undefinedy nullson dos tipos distintos: undefinedes un tipo en sí mismo (indefinido) mientras que nulles 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)
Expandir fragmento

y

null = 'value' // Uncaught SyntaxError: invalid assignment left-hand side
undefined = 'value' // 'value'
sebastian avatar Feb 22 '2011 10:02 sebastian

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.

Sebastian Norr avatar Jul 29 '2019 08:07 Sebastian Norr

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.

ayush avatar Feb 22 '2011 10:02 ayush