quitar - ¿Es mejor devolver `undefined` o` null` desde una función de JavaScript?
variable undefined javascript (10)
Aquí hay un ejemplo donde
undefined
tiene más sentido que
null
:
Utilizo una función de contenedor para
JSON.parse
que convierte su excepción en
undefined
:
// parses s as JSON if possible and returns undefined otherwise
// return undefined iff s is not a string or not parseable as JSON; undefined is not a valid JSON value https://stackoverflow.com/a/14946821/524504
function JSON_parse_or_undefined(s) {
if ("string" !== typeof s) return undefined
try {
const p = JSON.parse(s)
return p
} catch (x){}
return undefined
}
Tenga en cuenta que
null
es válido en JSON mientras que
undefined
no lo es.
Tengo una función que he escrito que básicamente se ve así:
function getNextCard(searchTerms) {
// Setup Some Variables
// Do a bunch of logic to pick the next card based on termed passed through what I''ll call here as ''searchTerms'' all of this logic is omitted because it''s not important for my question.
// ...
// If we find a next card to give, than give it
if (nextCardFound)
return nextCardFound;
// Otherwise - I''m returning undefined
return undefined;
}
Pregunta: ¿Sería mejor devolver "nulo" aquí?
Puedo devolver lo que quiera, obviamente ... Simplemente no estaba seguro de qué es lo mejor que puedo usar.
El código que llama a esta función sabe cómo tratar con indefinido (en realidad, nunca sucederá a menos que algo salga terriblemente mal)
La razón por la que hago esta pregunta es que escuché algo que sonaba como "No asigne variables indefinidas" o algo así, que dificultará la depuración.
Entonces, el hecho de que puedo ver que se devuelve
null
me dice que el retorno está funcionando, pero básicamente funciona de manera similar a
undefined
.
Documentación:
Mozilla Docs no respondió mi pregunta ... google tampoco: /
Esta pregunta SO fue demasiado amplia para lo que estoy tratando de resolver aquí.
Argumentaré que no hay la mejor manera, e incluso las funciones estándar a veces eligen una u otra.
Por ejemplo:
-
[[Prototipo]]
Los objetos ordinarios tienen una ranura interna [[Prototipo]], que determina de qué otro objeto heredan. Por supuesto, debe haber una manera de decir que un objeto no hereda de ningún otro. En este caso, "no existe tal objeto" se representa usando
null
. -
Object.getOwnPropertyDescriptor
Se espera que devuelva un descriptor de propiedad, es decir, un objeto que describe una propiedad (por ejemplo, valor, capacidad de escritura, enumerabilidad y configurabilidad). Sin embargo, la propiedad puede no existir. En este caso, "no existe tal propiedad" se representa usando
undefined
. -
document.getElementById
Se espera que devuelva el elemento con la ID dada. Sin embargo, puede que no haya ningún elemento con esa ID. En este caso, "no existe tal elemento" se representa usando
null
.
Así que solo elija lo que prefiera o piense que tiene más sentido para su caso específico.
Creo que es muy discutible qué usar.
Prefiero un código que sea semánticamente lo más preciso posible, por lo que creo que
undefined
es apropiado en este caso.
Creo que
null
asignaciones
null
significan "una variable establecida en nada".
Esto es opuesto al significado
undefined
"esta cosa no está allí en absoluto"
Como señaló una respuesta anterior, regresar
undefined
tiene problemas, y depende completamente de ti si eso te molesta.
No me molestaría.
Depende de lo que necesite hacer con el valor devuelto.
typeof null devuelve un objeto. ese objeto tiene un valor indefinido
typeof undefined devuelve undefined
Indefinido generalmente se refiere a algo a lo que todavía no se le ha asignado un valor (todavía). Nulo se refiere a algo que definitivamente no tiene valor. En ese caso, recomendaría devolver un valor nulo. Tenga en cuenta que una función sin valor de retorno especificado devuelve implícitamente indefinido.
De la especificación ECMAScript2015
4.3.10 valor indefinido
valor primitivo usado cuando a una variable no se le ha asignado un valor
4.3.12 valor nulo
valor primitivo que representa la ausencia intencional de cualquier valor de objeto
http://www.ecma-international.org/ecma-262/6.0/#sec-terms-and-definitions-undefined-type
Otras lecturas:
La primera respuesta es correcta. Tienen un significado teóricamente diferente. Sin embargo, no siempre está claro cuál recoger.
Tiendo a usar nulo en mi desarrollo, aunque creo que es algo completamente subjetivo.
Lo uso principalmente porque:
-
la variable indefinida podría sobrescribirse en los navegadores antiguos, por lo que devolverla es un poco más complicado. Este mismo problema lo obliga a usar
typeof var === ''undefined''
cuando obtiene resultados de funciones. link -
Otros lenguajes tienden a usar nulo ampliamente, muchos de ellos ni siquiera tienen indefinido (php por ejemplo). Eso me da un poco de consistencia al cambiar rápidamente entre idiomas.
Mi opinión personal según mi experiencia es no usar indefinido y nulo si no quieres bloquear tu código.
Al menos lo evitaría personalmente.
Hay muchas funciones en Javascript que devuelven indefinidas y debemos usarlas.
Pero cuando diseñe su código, no lo use.
Es importante devolver siempre algo
"false"
al menos.
Si tiene una matriz, por ejemplo, y la asigna sobre ella.
No es bueno regresar
[undefined, undefined.....]
o simplemente
undefined
.
Es mejor si mantiene el tipo de la matriz original.
Ejemplo:
const mapper:Map <string[],boolean[]>
[''i'', ''dont'', ''use'', ''null or undefined''] -> [false, true, false, true, false]
or ['''', dont, '''', '''', use]
or al the stuff above and then filter(v => v)
that will keep all undefined and null out
Esa es la idea.
Intento todo el tiempo para evitarlo.
Porque un
null
o
undefined
puede bloquear fácilmente su código
Te daré mi forma personal de elegir entre los dos.
Mi pregunta simple es: ¿el valor, dada otra entrada / estado / contexto podría definirse a algo?
Si la respuesta es sí, entonces use
null
, use
undefined
.
Más generalmente, cualquier función que devuelva un objeto debería devolver
null
cuando el objeto deseado no existe.
Porque podría existir dada otra entrada / estado / contexto.
null
representa la
ausencia de valor
para una entrada / estado / contexto dado.
Implícitamente significa que el
concepto
del valor en sí mismo existe en el contexto de su aplicación, pero puede estar ausente.
En su ejemplo, el concepto de una próxima carta existe pero la carta en sí misma puede no existir.
null
debe ser utilizado.
undefined
representa implícitamente la
ausencia de significado
de ese valor en el contexto de su aplicación.
Por ejemplo, si manipulo un objeto de
user
con un conjunto dado de propiedades e intento acceder a la propiedad
pikatchu
.
El valor de esta propiedad debe establecerse en
undefined
porque en mi contexto no tiene ningún sentido tener dicha propiedad.
Yo diría que en este caso, debe devolverse
null
.
Si considera la pregunta desde un punto de vista teórico de la informática, entonces
indefinido
se utiliza para indicar la
no terminación
/
no computabilidad
(es decir, el marcador de posición para un punto indefinido
x
de una
función parcial
f
que a menudo se escribe
f(x) = ⊥
)
getNextCard
embargo,
getNextCard
parece poder calcular la próxima tarjeta (si existe) y también puede calcular si no hay una tarjeta siguiente.
En otras palabras, la función es
total
ya que termina para cada entrada.
Dicho esto, se
requiere
una terminación de señalización de
valor especial
sin resultado significativo (es decir, "no hay tarjeta que pueda devolver para esta entrada") y esto para mí es
null
no está
undefined
.
NOTAS
Puede ver cierto soporte para este argumento en algunos otros lenguajes mecanografiados, donde la terminación sin resultado significativo se expresa utilizando un tipo de opción (a veces también denominado tipo anulable ). Un ejemplo de esto es Quizás en Haskell .
Por otro lado, por supuesto, no sabemos lo que realmente se supone que significa
undefined
en JavaScript.
Entonces, la analogía con
indefinido
es un poco tenue.
Además, dado que siempre queremos trabajar con funciones totales, esto equivale a decir "nunca regrese
undefined
de una función".
Lo cual parece ser un poco estricto, ya que limitaría el uso de
undefined
a propiedades / variables que no se han establecido.
Al final, mi preferencia personal es nunca regresar
undefined
donde puedo devolver
null
y también argumentaría que esta es la mejor convención de codificación (porque entre otras cosas
x !== null
es más corto que
typeof x !== ''undefined''
)
undefined
no es algo a lo que deba asignar.
Es posible que desee considerar devolver algo más que
undefined
.
En su caso, incluso si no devuelve nada, el resultado ya
undefined
estará
undefined
.
Por lo tanto, sugeriría ir con
null
lugar.
Considere esta muestra,
function getSomething() {
// .. do something
return undefined;
}
function doSomething() {
// .. I''m not gonna return anything.
}
var a = getSomething();
var b = doSomething();
El resultado de la muestra anterior es
a === b
, que
undefined
está
undefined
.
La diferencia es que guarda 1 ejecución de la instrucción.