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 nullse 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. DejeundefinedJavaScript en sí. Sin embargo, no hay "mejor" por lo que esto es una cuestión de opinión.nullcomo "no hay un valor apropiado para lo que estás pidiendo" yundefinedcomo "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.getOwnPropertyDescriptorSe 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.getElementByIdSe 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 0té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
nullelse useundefined. De manera más general, cualquier función que devuelva un objeto debería regresarnullcuando el objeto deseado no existe. Porque podría existir dada otra entrada / estado / contexto.nullrepresenta 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.nulldebería ser usado.undefinedrepresenta implícitamente la ausencia de significado de ese valor en el contexto de su aplicación. Por ejemplo, si manipulo unuserobjeto con un conjunto de propiedades dado e intento acceder a la propiedadpikatchu. El valor de esta propiedad debe establecerse enundefinedporque 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.undefinedno 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 resultadoundefinedya será . Entonces, sugiero ir connulllugar.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 === bes, que esundefined. La diferencia es que guarda 1 ejecución de declaración.fuente
undefinedno tiene que ser asignado. Todas las variables declaradas sin valores ya lo sonundefined.(function(){ /* code */ })()devuelve nulo en una consola.undefineden mi consola Chrome y Firefox.undefinedsi 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
typeofno 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
undefinedtiene más sentido quenull:Utilizo una función contenedora para
JSON.parseque 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
nulles válido en JSON mientrasundefinedque 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
undefinedes apropiado en este caso.Creo que las
nullasignaciones significan "una variable definida en nada". Esto es en contraposición aundefinedsignificar "esta cosa no existe en absoluto"Como se señaló en una respuesta anterior, regresar
undefinedtiene 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,
nulldeberí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
xde una función parcialfque a menudo se escribef(x) = ⊥).getNextCardsin 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í
nullno 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é
undefinedse 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 volverundefinedde una función". Lo que parece ser un poco estricto, ya que limitaría el uso deundefineda propiedades / variables que no se han establecido.Al final, mi preferencia personal es no regresar nunca a
undefineddonde puedo regresarnully también diría que esta es la mejor convención de codificación (porque entre otras cosasx !== nulles 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 outEsa es la idea. Intento todo el tiempo evitarlo. Porque una
nulloundefinedpuede bloquear fácilmente su códigofuente