La documentación de JavaScript dice que el tipo de datos Null tiene solo un valor:
El tipo Nulo tiene exactamente un valor: nulo. Consulte nulo y Nulo para obtener más detalles.
Pero no dice que el tipo de datos undefined tenga un solo valor:
Una variable a la que no se le ha asignado un valor tiene el valor indefinido. Consulte indefinido e Indefinido para obtener más detalles.
Entonces, ¿el tipo de datos undefined tiene solo un valor o más de un valor?
Hay exactamente un valor del tipo undefined . Hay varias cosas que pueden evaluarse como undefined , como una variable no asignada, una propiedad faltante o el operador void , entre otras:
let x; const obj = { }; const voidReturn = void 0; console.log(typeof x, x); console.log(typeof obj, obj); console.log(typeof voidReturn, voidReturn); Para mayor claridad, hay un valor undefined pero también existe la propiedad global undefined . A diferencia de null , en realidad es parte de window . Entonces, si el literal undefined se usa en el código, se refiere a esa propiedad:
console.log("undefined" in window) En el pasado era posible cambiarlo directamente window.undefined = 42; que luego produciría un resultado extraño si se usa con undefined === void 0 . La propiedad global se ha vuelto inmutable para evitar esto, sin embargo, todavía es técnicamente posible evitar la inmutabilidad y proporcionar su propio valor para undefined si oculta la propiedad:
function foo(undefined) { console.log(undefined === 42); console.log(typeof undefined); console.log(undefined === void 0); } foo(42); En comparación, null es una palabra clave de idioma y no se puede sobrescribir de ninguna manera.
En caso de duda, vaya a la especificación : :-)
El tipo indefinido
El tipo Undefined tiene exactamente un valor , llamado
undefined. Cualquier variable a la que no se le ha asignado un valor tiene el valorundefined.
Entonces: el tipo Indefinido tiene solo un valor.
Debo señalar que hay dos formas para que una variable obtenga ese valor, así que tal vez esa sea la confusión. Las dos formas son:
undefined (directa o indirectamente).Ejemplo:
let a; // `a` has the value `undefined` because it has never been assigned a value console.log(typeof a); // undefined let b = undefined; console.log(typeof b); // undefined let c = void 0; console.log(typeof c); // undefined let d = (() => { })(); console.log(typeof d); // undefined const obj = {}; let e = obj.propertyThatDoesntExist; console.log(typeof e); // undefined b , 'c', 'd' y e tienen el valor undefined porque se les ha asignado ese valor:
b se asigna undefined mediante el uso de la variable global undefinedc se asigna undefined utilizando el resultado del operador void , que siempre es undefinedd se asigna undefined porque se le asigna el valor de retorno de una función que nunca emite una declaración de return con un valor; la función por lo tanto devuelve el valor undefinede se asigna undefined porque se le asigna el valor resultante de una expresión de acceso de propiedad ( obj.propertyThatDoesntExist ) para una propiedad que no existe; el resultado de un acceso de propiedad en una propiedad que no existe es undefined . Esa es una lista razonable de formas en que la variable puede asignarse undefined ; Seguro que hay más, es solo una muestra.
Consulte también la respuesta posterior de VLAZ , que contiene información realmente buena. Por ejemplo, señala que null es una palabra clave, pero undefined es solo una variable global.
¡Buena pregunta! Tomado del libro que no conoce Javascript: indefinido es en sí mismo un valor que se usa cuando no hay valor. Es una propiedad en el objeto global.
Por ejemplo, citando el libro aquí:
var a; typeof a; // "undefined" var b = 42; var c; // later b = c; typeof b; // "undefined" typeof c; // "undefined"a es indefinida porque no le hemos dado un valor, pero incluso en el caso de que definamos el valor de una variable como otra variable indefinida, sigue siendo indefinida. En este caso, b y c probablemente apunten a esa propiedad en el objeto global.
Recomiendo leer los documentos de Mozilla y el capítulo de YDKJS sobre tipos y valores https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined