¿Qué significa exactamente indefinido en JavaScript? ¿Por qué está ahí? ¿Qué usos tiene? ¿Cómo puede ser útil?

11

En JavaScript, tenemos algo llamado indefinido . Dije algo, porque realmente no sé si es una clase base, o una variable incorporada, o una palabra clave, o cualquier otra cosa. Solo sé que está ahí.

Para verlo en acción, simplemente puede escribir:

undefined;
typeof undefined;

¿Alguien puede explicarme por qué esta cosa se ha insertado en JavaScript? Tenemos nullvalor en este lenguaje, por lo tanto, no debería ser algo así null. En otros idiomas, cuando no conocemos el valor de una propiedad o variable, simplemente lo establecemos como nulo. Aquí podemos hacer lo mismo.

¿Cómo podemos usar esta cosa en JavaScript?

Saeed Neamati
fuente
Esto fue discutido ad nauseum aquí stackoverflow.com/questions/6999291/…
Paul

Respuestas:

13

Hay DOS cosas que debes entender sobre indefinido ...

  • el tipo undefined que solo puede tener un valor .
  • la variable undefined

Ahora lea lo siguiente con mucho cuidado ...

  • Hay tantos valores de tipo number(10, 10.01, 1e1). Pero solo puede haber un valor de tipo undefined, y ese valor se almacena en la variable undefined. Ese valor tiene representación NO literal - por ejemplo, los valores de número 1, 100, 1e-1son todos los literales de número de tipo, pero el valor almacenado en la variable undefinedno tiene forma literal.

  • undefinedes una variable, solo una variable normal, que JavaScript declara y le asigna el valor de tipo undefineden el ámbito global. Entonces puedes hacer todo lo siguiente ...

  tipo de indefinido; // "indefinido"

  indefinido = 100;
  tipo de indefinido; // "número"

  indefinido = nulo 0;
  tipo de indefinido; // "indefinido"

  window.undefined === undefined; // cierto
  window.undefined === void 0; // cierto
  
  • Si no desea utilizar la variable undefined, puede generar el valor de tipo undefinedmediante la expresión void 0, cuyo único propósito es devolver un valor de tipo undefined.

... alguien puede explicarme por qué esta cosa se ha insertado en JavaScript ...

NO. Al igual que nadie puede explicar por qué las variables no declaradas van al ámbito global en lugar de local. Solo necesita entrenarse para usarlo inteligentemente en lugar de tratar de encontrar justificaciones para su existencia.

... tenemos un valor nulo ...

Aunque nullpuede hacer cosas undefined, está más o menos relacionado con los objectsescalares. De hecho, JavaScript se considera nullun objeto: typeof nulldevuelve "objeto".

En mi opinión, la conclusión es NO tratar de razonar los propósitos absolutos de undefinedy null, y usarlos en su código de manera inteligible, para que su código sea legible, mantenible y reutilizable.

codificador de árboles
fuente
2
Buena explicación @greengit. the bottom line is to NOT try to reason the absolute purposes of undefined and null, parece que JavaScript es un poco más lejos de ser un lenguaje lógico y simplemente tenemos que acostumbrarnos a él, como experimentar un mundo nuevo.
Saeed Neamati
1
"cuyo único propósito es devolver un valor de tipo undefined". Realmente voidevalúa una expresión, ignora el valor de retorno y devuelve el undefinedvalor. En cuanto a las diferencias. undefinedes usado por el motor JS para decir que esto no tiene valor. USTED lonull usa para decir que esto no tiene valor. Hay una clara distinción.
Raynos
1
undefined = 100; typeof undefined;devuelve "indefinido" para mí, si intenta asignar a nulo, obtiene un error. Solo quería aclarar eso para futuros lectores.
Josh Rumbut
6

Perdón por responder una pregunta anterior, pero la razón por la que necesita tanto indefinido como nulo es simple: en un lenguaje de tipeo basado en prototipos absolutamente debe diferenciar entre "este objeto no define un valor para X" y "este objeto dice que X es nada / nulo / vacío ".

Sin esta capacidad, no hay forma de recorrer la cadena de prototipos, por lo que la herencia no puede funcionar; debe poder determinar que obj.someProp no está definido para poder ver obj.prototype.someProp y avanzar en la cadena hasta encontrar un valor. Si obj.someProp devuelve nulo, no habría forma de saber si realmente fue nulo o simplemente significaba "mira mi prototipo". La única forma de evitar esto es inyectar un poco de magia misteriosa detrás de escena, lo que rompe su capacidad de confundirse con las cadenas prototipo y hacer varios otros trozos de magia negra JS.

Al igual que gran parte de Javascript, la idea de indefinido y nulo parece torpe y estúpida al principio, luego absolutamente brillante más tarde (luego de vuelta a torpe y estúpida pero con una explicación razonable).

Un lenguaje como C # no se compilará si accede a una propiedad que no existe y otros lenguajes dinámicos a menudo arrojan excepciones en tiempo de ejecución cuando toca una propiedad que no existe, lo que significa que debe usar construcciones especiales para probarlas. Las clases más significan que cuando se crea una instancia de un objeto, ya conoce su cadena de herencia y todas las propiedades que tiene: en JS puedo modificar un prototipo de 15 pasos en la cadena y esos cambios aparecerán en los objetos existentes.

obispo ruso
fuente
3

Hay una variable global undefined, que se establece en el valor indefinido. Las personas malvadas pueden configurarlo en otra cosa, por lo que probablemente sea mejor no confiar en él.

  • El valor indefinido es el valor de retorno de una función que no devuelve un valor.
  • El valor indefinido es el valor de una variable que no ha sido asignada.
  • El valor indefinido es el valor de un parámetro que no se ha pasado.
  • El valor indefinido es el valor de una propiedad que no ha sido asignada.
  • 'indefinido' es el tipo de variable no declarada. ( typeof undeclaredVariable == 'undefined'. tratar de leer el valor de una variable subfinada te arrojará ReferenceError).

nullestá sutilmente roto, porque typeof null == 'object'. No sé por qué tenemos undefinedy null, probablemente, algún accidente histórico.

Sean McMillan
fuente
2

Bueno, undefinedes un valor centinela obtenido al evaluar algo que no está definido como opuesto null, que es el valor exactamente definido para no representar nada .

var o = { };
> undefined
o
> Object {}
o.foo
> undefined
function f() {}
> undefined
function r() { return null; }
> undefined
f()
> undefined
r()
> null

Entonces, por ejemplo, el valor de retorno de una función que no define un valor de retorno no está definido. El valor de una propiedad no definida en un objeto no está definido. El valor de retorno de una declaración, que no es una expresión, no está definido (aunque no verá que esto ocurra fuera de la consola).
Tenga en cuenta que puede crear una función, que devuelve explícitamente undefinedy puede definir explícitamente una propiedad con el valor de undefinedun objeto, porque al final es un valor válido. Lo haría para comunicarse explícitamente, que algo no está definido .

Se podría pensar en la relación de undefinedy nullcomo eso entre NaNy 0.

back2dos
fuente
"El valor de retorno de una función que no define un valor de retorno no está definido", ¿quiere decir que undefinedes void?
Saeed Neamati
@Saeed: No del todo. voiden JavaScript es un operador unario , que toma cualquier argumento y devuelve el valor undefined .
back2dos