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 ... No estaba seguro de qué es lo mejor para usar.
El código que llama a esta función sabe cómo lidiar con undefined (en realidad, nunca sucederá a menos que algo salga terriblemente mal)
La razón por la que hago esta pregunta es que escuché en alguna parte algo que sonaba como "No asigne indefinido a variables" o algo, que hará que sea más difícil de depurar. Entonces, el hecho de que puedo ver que null
se devuelve me dice que la devolución está funcionando, pero básicamente funciona de manera similar a undefined
.
Documentación:
Mozilla Docs no respondió mi pregunta ... Google tampoco: \
Esta pregunta SO - era demasiado amplia para lo que estoy tratando de entender aquí.
null
. Dejeundefined
JavaScript en sí. Sin embargo, no hay "mejor" por lo que esto es una cuestión de opinión.null
como "no hay un valor apropiado para lo que estás pidiendo" yundefined
como "no puedo calcular lo que estás pidiendo".Respuestas:
Argumentaré que no existe 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 [[Prototype]], que determina de qué otro objeto heredan. Por supuesto, debe haber una forma 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, es posible que la propiedad no exista. En este caso, "no existe tal propiedad" se representa mediante
undefined
.document.getElementById
Se espera que devuelva el elemento con el ID proporcionado. Sin embargo, es posible que no haya ningún elemento con ese ID. En este caso, "no existe tal elemento" se representa usando
null
.Así que elija lo que prefiera o crea que tenga más sentido para su caso específico.
fuente
void 0
técnica para futuros espectadores de esta respuesta. También agregué un código para intentar aclarar tu punto. ¡Gracias por su respuesta!Indefinido generalmente se refiere a algo que aún no se ha asignado un valor (todavía). Nulo se refiere a algo que definitivamente no tiene valor. En ese caso, recomendaría devolver un null. Tenga en cuenta que una función sin valor de retorno especificado devuelve implícitamente undefined.
De la especificación ECMAScript2015
http://www.ecma-international.org/ecma-262/6.0/#sec-terms-and-definitions-undefined-type
Otras lecturas:
¿Cuándo se usa nulo o indefinido en JavaScript?
fuente
var x=someFunc();
, estoy asignando intencionalmente un valor xa y prefiero que no pase ninguna prueba que indique que no se le ha asignado (o puede que no) un valor. En mi humilde opiniónnull
) siempre que se quede con uno, pero tener 2 valores para indicar ausencia de valor (cualquiera que sea el "tipo") siempre es confusoLe daré mi forma personal de elegir entre los dos.
Mi pregunta simple es: ¿ podría el valor, dada otra entrada / estado / contexto, definirse para algo?
Si la respuesta es sí, use
null
else useundefined
. De manera más general, cualquier función que devuelva un objeto debería regresarnull
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 de valor en sí mismo existe en el contexto de su aplicación, pero puede estar ausente. En su ejemplo, existe el concepto de una tarjeta siguiente, pero es posible que la tarjeta en sí no exista.null
debería ser usado.undefined
representa implícitamente la ausencia de significado de ese valor en el contexto de su aplicación. Por ejemplo, si manipulo unuser
objeto con un conjunto de propiedades dado e intento acceder a la propiedadpikatchu
. El valor de esta propiedad debe establecerse enundefined
porque en mi contexto no tiene ningún sentido tener tal propiedad.fuente
null
, mientras que las funciones con efectos secundarios deberían regresarundefined
, cuando se piensa como un programador funcional.undefined
no es algo a lo que deba asignar. Es posible que desee considerar devolver algo diferente aundefined
. En su caso, incluso si no devuelve nada, el resultadoundefined
ya será . Entonces, sugiero ir connull
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
a === b
es, que esundefined
. La diferencia es que guarda 1 ejecución de declaración.fuente
undefined
no tiene que ser asignado. Todas las variables declaradas sin valores ya lo sonundefined
.(function(){ /* code */ })()
devuelve nulo en una consola.undefined
en mi consola Chrome y Firefox.undefined
si algo más no regresa antes, no lo necesito porque el comportamiento predeterminado de la función es no devuelve nada es devolver indefinido, solo están diciendo que esto no es necesario. Además ... me gusta lo que tienes que decir sobre las funciones getter incorporadas que devuelven nulo. Por favor publique su respuesta a tal efecto y la aceptaré.Depende de lo que necesites hacer con el valor devuelto.
typeof null devuelve un objeto. ese objeto tiene un valor de indefinido
tipo de devoluciones indefinidas undefined
fuente
typeof
no necesariamente devuelve el verdadero tipo de datos de un valor, tiene un mapa que asigna tipos de datos a etiquetas y devuelve la etiqueta correspondiente.typeof
, a pesar de su nombre, no dice el tipo de valor.Aquí hay un ejemplo donde
undefined
tiene más sentido quenull
:Utilizo una función contenedora para
JSON.parse
que convierta su excepción enundefined
:// 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 mientrasundefined
que no lo es.fuente
let getStringOrJSON = value => { try { value = JSON.parse(value); } catch(e) { return value; } return value; };
. Ahora, estoy seguro de que las dos devoluciones podrían manejarse de manera diferente y es posible que no ganen la competencia de golf JS. Funciona.La primera respuesta es correcta. Tienen un significado teóricamente diferente. Sin embargo, no siempre está claro cuál elegir.
Tiendo a usar null en mi desarrollo, aunque creo que eso es algo completamente subjetivo.
Lo uso principalmente porque:
La variable indefinida podría sobrescribirse en navegadores antiguos, por lo que devolverla es un poco más complicado. Este mismo problema te obliga a usar
typeof var === 'undefined'
cuando obtienes resultados de funciones. enlaceOtros lenguajes tienden a usar null ampliamente, muchos de ellos ni siquiera tienen undefined (php por ejemplo). Eso me da cierta coherencia al cambiar rápidamente entre idiomas.
fuente
Creo que es muy discutible qué usar. Prefiero un código que sea semánticamente lo más preciso posible, así que creo que
undefined
es apropiado en este caso.Creo que las
null
asignaciones significan "una variable definida en nada". Esto es en contraposición aundefined
significar "esta cosa no existe en absoluto"Como se señaló en una respuesta anterior, regresar
undefined
tiene problemas, y depende completamente de usted si eso le molesta. No me molestaría.fuente
document.getElementById('iDoNotExist')
regresanull
, a pesar de que el significado se acerca más a "esta cosa no está allí". Si los métodos estándar lo hacen, ¿por qué no OP?Yo diría que en este caso,
null
debería devolverse.Si considera la pregunta desde un punto de vista teórico de la informática, entonces indefinido se usa para indicar no terminación / no computabilidad (es decir, el marcador de posición para un punto indefinido
x
de una función parcialf
que a menudo se escribef(x) = ⊥
).getNextCard
sin embargo, parece poder calcular la siguiente tarjeta (si existe) y también poder calcular si no hay una siguiente tarjeta. 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 un resultado significativo (es decir, "no hay tarjeta que pueda devolver para esta entrada") y esto para mí
null
no lo esundefined
.NOTAS:
Puede ver algo de soporte para este argumento en algunos otros lenguajes tipados, así como donde la terminación sin un resultado significativo se expresa usando 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 qué
undefined
se supone que significa realmente 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 volverundefined
de una función". Lo que parece ser un poco estricto, ya que limitaría el uso deundefined
a propiedades / variables que no se han establecido.Al final, mi preferencia personal es no regresar nunca a
undefined
donde puedo regresarnull
y también diría que esta es la mejor convención de codificación (porque entre otras cosasx !== null
es más corta quetypeof x !== 'undefined'
).fuente
Mi opinión personal de acuerdo con mi experiencia es que no use undefined y null si no quiere bloquear su código. Al menos lo evitaría personalmente. Hay muchas funciones en Javascript que devuelven undefined y, bien, 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. No es bueno volver[undefined, undefined.....]
o simplementeundefined
. 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 evitarlo. Porque una
null
oundefined
puede bloquear fácilmente su códigofuente