He estado escribiendo JavaScript durante bastante tiempo y nunca he tenido una razón para usarlo null
. Parece que undefined
siempre es preferible y tiene el mismo propósito programáticamente. ¿Cuáles son algunas razones prácticas para usar en null
lugar de undefined
?
javascript
null
undefined
Jimmy Cuadra
fuente
fuente
document.getElementById()
ese que pueden regresarnull
pero noundefined
, así que en esos casos, ¿por qué probarías el retornoundefined
? (Claro, funcionaría si usa en==
lugar de===
, pero aún así, ¿por qué probaría deliberadamente lo incorrecto?)document.getElementById('does-not-exist')
. Ej .). Las variablesvar a;
y los valores de retorno de funciones están predeterminados como indefinidos. En el pasado, null estaba en el alcance global, por lo que su uso ralentizó la ejecución y me llevó a preferir otros tipos falsos (false, '', 0) a las referencias gratuitas. Personalmente, evito el nulo a menos que haya una razón convincente de lo contrario porque lo percibo como más simple, lo que generalmente es mejor.Respuestas:
Nulo e indefinido son esencialmente dos valores diferentes que significan lo mismo. La única diferencia está en las convenciones de cómo los usa en su sistema. Como algunos han mencionado, algunas personas usan nulo para significar "sin objeto" donde a veces puede obtener un objeto mientras que indefinido significa que no se esperaba ningún objeto (o que hubo un error). Mi problema con eso es que es completamente arbitrario y totalmente innecesario.
Dicho esto, hay una diferencia importante: las variables que no se inicializan (incluidos los parámetros de función donde no se pasó ningún argumento, entre otras cosas) siempre están indefinidas.
Es por eso que en mi código nunca uso nulo a menos que algo que no controlo devuelva nulo (coincidencia de expresiones regulares, por ejemplo). La belleza de esto es que simplifica mucho las cosas. Nunca tengo que comprobar si x === indefinido || x === nulo. Y si tiene la costumbre de usar == o simplemente cosas como if (x) .... Para.
!x
se evaluará como verdadero para una cadena vacía, 0, nulo, NaN, es decir, cosas que probablemente no desee. Si desea escribir javascript que no sea terrible, siempre use triple igual === y nunca use nulo (use undefined en su lugar). Te facilitará la vida.fuente
===
o!==
. JS es un lenguaje increíblemente expresivo si sabes cómo usarlo.null
/undefined
era necesaria porque la versión inicial de JS no teníahasOwnProperty
o elin
operador. Ahora que lo hace, realmente no entiendo por qué uno de ellos no fue abolido en ES6 o cualquier propuesta de ES7 que haya visto.Realmente no tengo una respuesta, pero según Nicholas C. Zakas , página 30 de su libro " JavaScript profesional para desarrolladores web " :
fuente
undefined
significa que ocurrió un desastre. Sólo en mi humilde opinión.var myVar;
y verificar explícitamente el valorundefined
para determinar si se ha llenado con una referencia de objeto en un momento posterior. Mi punto es que esto es totalmente académico: puede hacerlo de cualquier manera, y cualquiera que aconseje de una manera sobre la otra simplemente está impulsando su propia convención.undefined
ynull
. Esto sigue siendo realmente molesto. Evito asignar una variable anull
solo para reducir el número denull
pruebas adicionales .==
comparación (a diferencia de===
) tiene sentido:v == null
(ov == undefined
) buscará nulo o indefinido.Al final del día, debido a que ambos
null
yundefined
coaccionan al mismo valor (Boolean(undefined) === false && Boolean(null) === false
), técnicamente puede usar cualquiera para hacer el trabajo. Sin embargo, hay una forma correcta, en mi opinión.Deje el uso de
undefined
al compilador de JavaScript.undefined
se utiliza para describir variables que no apuntan a una referencia. Es algo que el compilador JS se ocupará por ti. En el momento de la compilación, el motor JS establecerá el valor de todas las variables elevadas enundefined
. A medida que el motor recorre el código y los valores están disponibles, el motor asignará los valores respectivos a las variables respectivas. Para aquellas variables para las que no encontró valores, las variables continuarían manteniendo una referencia a la primitivaundefined
.Utilice nulo solo si desea indicar explícitamente que el valor de una variable "no tiene valor".
Como indica @ com2gz:
null
se usa para definir algo vacío programáticamente.undefined
quiere decir que la referencia no existe. Unnull
valor tiene una referencia definida a "nada". Si está llamando a una propiedad no existente de un objeto, obtendráundefined
. Si quisiera vaciar esa propiedad intencionalmente, entonces debe sernull
para que sepas que es a propósito.TLDR; No uses el
undefined
primitivo. Es un valor que el compilador JS establecerá automáticamente cuando declare variables sin asignación o si intenta acceder a propiedades de objetos para los que no hay referencia. Por otro lado, usenull
si y solo si desea intencionalmente que una variable no tenga "valor".Nunca establecí nada explícitamente como indefinido (y no me he encontrado con esto en las muchas bases de código con las que he interactuado). Además, rara vez utilizo
null
. Las únicas veces que usonull
es cuando quiero denotar el valor de un argumento a una función como si no tuviera valor, es decir:fuente
indefinido es donde no existe noción de la cosa; no tiene ningún tipo y nunca antes se ha hecho referencia a él en ese ámbito; nulo es donde se sabe que existe la cosa, pero no tiene valor.
fuente
Cada uno tiene su propia forma de codificar y su propia semántica interna, pero a lo largo de los años he descubierto que este es el consejo más intuitivo que le doy a las personas que hacen esta pregunta: en caso de duda, haga lo que hace JavaScript .
Digamos que está trabajando con propiedades de objeto como opciones para un complemento jQuery ... pregúntese qué valor le da JavaScript a una propiedad que aún no se ha definido; la respuesta es
undefined
. Entonces, en este contexto, inicializaría este tipo de cosas con 'indefinido' para que sean consistentes con JavaScript (para las variables, puede hacerlo envar myVar;
lugar devar myVar = undefined;
).Ahora digamos que está manipulando DOM ... ¿qué valor asigna JavaScript a los elementos inexistentes? La respuesta es
null
. Este es el valor con el que inicializaría si está creando una variable de marcador de posición que luego contendrá una referencia a un elemento, fragmento de documento o similar que se relacione con el DOM.Si está trabajando con JSON, entonces debe hacerse un caso especial: para valores de propiedad indefinidos, debe establecerlos en
""
onull
porque un valor deundefined
no se considera el formato JSON adecuado.Dicho esto, como se ha expresado en un póster anterior, si descubre que está inicializando cosas con
null
oundefined
más de una vez en una luna azul, tal vez debería reconsiderar cómo va a codificar su aplicación.fuente
Puede adoptar la convención sugerida aquí, pero realmente no hay una buena razón para hacerlo. No se usa con la suficiente coherencia para ser significativo.
Para que la convención sea útil, primero debe saber que la función llamada sigue la convención. Luego, debe probar explícitamente el valor devuelto y decidir qué hacer. Si no está definido , puede suponer que ocurrió algún tipo de error que la función llamada conocía . Pero si ocurrió un error y la función lo sabía, y es útil enviarlo a un entorno más amplio, ¿por qué no usar un objeto de error? es decir, arrojar un error?
Entonces, al final del día, la convención es prácticamente inútil en cualquier otra cosa que no sean programas muy pequeños en entornos simples.
fuente
Una propiedad útil en null que undefined no califica:
Lo uso
null
cuando quiero 'apagar' un valor numérico o inicializar alguno. Mi último uso fue manipular la transformación css:No estoy seguro de si debería usar esta propiedad pensando ...
fuente
Los nodos y elementos DOM no están indefinidos, pero pueden ser nulos.
El nextSibling del último hijo de un elemento es nulo.
El hermano anterior del primer hijo es nulo.
Una referencia document.getElementById es nula si el elemento no existe en el documento.
Pero en ninguno de estos casos el valor está indefinido ; simplemente no hay ningún nodo allí.
fuente
window.myVar
devolvería 'undefined si no existe. Hay toneladas de cosas que devuelven 'indefinido' en JavaScript, solo que hay toneladas de cosas que devuelven 'nulo', todo depende del contexto.Algunos han dicho que está bien inicializar objetos en
null
. Solo quería señalar que los argumentos por defecto de desestructuración no funcionannull
. Por ejemplo:Esto requiere realizar
null
comprobaciones antes de llamar a la función, lo que puede suceder con frecuencia.fuente
Estoy trabajando en esta pregunta exacta en este momento y estoy mirando la siguiente filosofía:
Para mí, esta pregunta es importante porque cualquiera que llame a una función que devuelva un resultado no debería tener dudas sobre si probar indefinido o nulo.
Esta respuesta no intenta abordar:
En mi opinión, las variables son su propio negocio y no una parte de su API, y las propiedades en cualquier sistema OO están definidas y, por lo tanto, deben definirse con un valor diferente de lo que serían si no se definieran (nulo para definido, indefinido es lo que obtener al acceder a algo que no está en su objeto).
fuente
Aquí hay una razón:
var undefined = 1
es javascript legal, perovar null = 1
es un error de sintaxis. La diferencia es quenull
es una palabra clave de idioma, mientras queundefined
que, por alguna razón, no lo es.Si su código se basa en comparaciones
undefined
como si fuera una palabra clave (if (foo == undefined)
un error muy fácil de cometer), eso solo funciona porque nadie ha definido una variable con ese nombre. Todo ese código es vulnerable a que alguien defina accidental o maliciosamente una variable global con ese nombre. Por supuesto, todos sabemos que definir accidentalmente una variable global es totalmente imposible en javascript ...fuente
void 0
lugar de indefinido.Solo quiero agregar que con el uso de ciertas bibliotecas de JavaScript, nulo e indefinido pueden tener consecuencias no deseadas.
Por ejemplo, la
get
función de lodash , que acepta un valor predeterminado como tercer argumento:Otro ejemplo: si usa defaultProps en React, si se pasa una propiedad
null
, los accesorios predeterminados no se usan porque null se interpreta como un valor definido . p.ejfuente
No estoy de acuerdo en que el uso nulo o indefinido sea innecesario. indefinido es algo que mantiene vivo todo el proceso de encadenamiento de prototipos. Por lo tanto, el compilador solo con nulo no puede verificar si esta propiedad es igual a nula o si no está definida en el prototipo de punto final. En otros lenguajes de tipo dinámico (fe Python) arroja una excepción si desea acceder a una propiedad no definida, pero para los lenguajes basados en prototipos, el compilador también debe verificar los prototipos principales y este es el lugar cuando los indefinidos más lo necesitan.
El significado completo de usar nulo es simplemente vincular la variable o propiedad con el objeto que es singleton y tiene significado de vacío, y también el uso nulo tiene fines de rendimiento. Este 2 código tiene un tiempo de ejecución diferente.
fuente
Variable desconocida:
undefined
.Variable conocida todavía ningún valor:
null
.server_object
.server_object.errj
. Te dice que lo esundefined
. Eso significa que no sabe qué es eso.server_object.err
. Te dice que lo esnull
. Eso significa que está haciendo referencia a una variable correcta pero está vacía; por tanto, no hay error.El problema es cuando declaras un nombre de variable sin un valor (
var hello
) js declara que comoundefined
: esta variable no existe; mientras que los programadores principalmente quieren decir: "Todavía no le he dado un valor", la definición denull
.Entonces, el comportamiento predeterminado de un programador — declarar una variable sin un valor como nada — está en desacuerdo con js — declarar que no existe. Y además,
!undefined
y!null
son ambos, latrue
mayoría de los programadores los tratan como equivalentes.Por supuesto, puede asegurarse de que siempre lo hace,
var hello = null
pero la mayoría no ensuciará su código como tal para garantizar la cordura de tipos en un lenguaje deliberadamente escrito, cuando ellos y el!
operador tratan a ambosundefined
ynull
como equivalentes.fuente