Búsqueda de sitios web

¿Es mejor devolver `undefined` o `null` desde una función de JavaScript?


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 "null" aquí?

Puedo devolver lo que quiera, obviamente... Solo que no estaba seguro de cuál es la mejor cosa para usar.

El código que llama a esta función sabe cómo manejar undefined (en realidad, no ocurrirá a menos que algo salga terriblemente mal)

La razón por la que hago esta pregunta es que escuché en algún lugar algo que sonaba como "No asignar undefined a las variables" o algo así, que hará que sea más difícil depurar. Entonces, el hecho de que pueda ver que null se devuelve me indica que la devolución está funcionando, pero básicamente la función es similar a undefined.

Documentación:

La documentación de Mozilla no respondió mi pregunta... Google tampoco :\

Esta pregunta de SO era demasiado amplia para lo que estoy tratando de averiguar aquí.

Respuesta #1

Indefinido generalmente se refiere a algo que aún no ha sido asignado un valor. Nulo se refiere a algo que definitivamente no tiene valor. En ese caso, recomendaría devolver un nulo. Tenga en cuenta que una función sin un 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

Lectura adicional:

¿Cuándo se usan null o undefined en JavaScript?

Respuesta #2

Te daré mi forma personal y opinada de elegir entre los dos.

Mi simple pregunta es: ¿podría el valor, dado otro ingreso/estado/contexto, definirse como algo?

Si la respuesta es sí, entonces usa null, de lo contrario usa undefined. Más generalmente, cualquier función que devuelva un objeto debería devolver null cuando el objeto previsto no existe. Porque podría existir dado otro ingreso/estado/contexto.

null representa la ausencia de valor para una entrada/estado/contexto dado. Implícitamente significa que el concepto del valor en sí existe en el contexto de tu aplicación, pero puede estar ausente. En tu ejemplo, el concepto de una siguiente carta existe pero la carta en sí puede no existir. Se debe usar null.

undefined representa implícitamente la ausencia de significado de ese valor en el contexto de tu aplicación. Por ejemplo, si manipulo un objeto user con un conjunto dado de propiedades y trato de acceder a la propiedad pikatchu. El valor de esta propiedad debería establecerse en undefined porque en mi contexto no tiene ningún sentido tener tal propiedad.

Respuesta #3

Argumentaré que no hay una mejor manera, e incluso las funciones estándar a veces eligen una u otra.

Por ejemplo:

  • [[Prototipo]]

    Los objetos ordinarios tienen un atributo interno [[Prototype]], 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, posibilidad 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 el ID dado. Sin embargo, podría no haber ningún elemento con ese ID. En este caso, "no existe tal elemento" se representa usando null.

Así que simplemente elige lo que prefieras o lo que creas que tiene más sentido para tu caso específico.

Artículos relacionados