Tengo una función que he escrito en el que básicamente se parece a esto:

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 volver «null» aquí?

Me puede pasar cualquier cosa quiero de vuelta – obviamente… yo no estaba seguro de qué es lo mejor para usar.

El código que llama a esta función sabe cómo lidiar con el indefinido (que en realidad nunca voy a suceder a menos que algo va terriblemente mal)

La razón por la que estoy haciendo esta pregunta es que he oído en alguna parte algo que sonaba como «no asignar indefinido para las variables» o algo – que va a hacer más difícil de depurar. Así, el hecho de que yo puedo ver que null se pasa de nuevo me dice que el regreso está trabajando – pero, básicamente, la función similar a undefined.


Documentación:

Mozilla Docs No contestar a mi pregunta… google no sea :\

De este MODO la Pregunta – era demasiado amplio para lo que estoy tratando de averiguar aquí.

  • no esta ASÍ que la Pregunta la respuesta?
  • En mi opinión, volver null. Dejar undefined de JavaScript en sí. Sin embargo, no hay una «mejor» así que esto es una cuestión de opinión.
  • Gracias, esto fue útil – pero todavía estoy claro en cuanto a lo de la convención está aquí para regresar de una función de captador.
  • He leído null como «no hay valor apropiado para lo que estamos pidiendo» y undefined como «yo no puedo trabajar de lo que usted está pidiendo».
  • esa pregunta, y la he enlazado en mi respuesta, están relacionados, pero ambos parecen estar preguntando ¿cuál es la diferencia entre ellos y no se cuando usar uno o el otro como valor de retorno.
  • También devolver false, o «término de búsqueda no se encuentra», para notificar de llamada de la función que realiza la búsqueda de searchTerm que una búsqueda ocurrió, aunque no encontradas.

10 Comentarios

  1. 24

    Voy a argumentar que no hay mejor manera, e incluso funciones estándar, a veces, elegir uno o el otro.

    Por ejemplo:

    • [[Prototype]]

      Objetos ordinarios tienen un [[Prototype]] ranura interna, que determina desde qué otro objeto que heredar. Por supuesto, debe haber una manera de decir que un objeto no se hereda de cualquier otro. En este caso, «no hay tal objeto» se representa mediante null.

    • Object.getOwnPropertyDescriptor

      Se espera para devolver una propiedad descriptor, es decir, un objeto que describe una propiedad (por ejemplo, valor, writability, enumerability y la capacidad de configuración). Sin embargo, la propiedad no existe. En este caso, «no hay tal propiedad» se representa mediante undefined.

    • document.getElementById

      Se espera para devolver el elemento con el ID. Sin embargo, no puede haber ningún elemento con ese ID. En este caso, «no existe tal elemento» es representado mediante null.

    Así que elija lo que prefiera o creo que tiene más sentido para su caso específico.

    • después de la leer esto he decidido proponer a la void 0 técnica para los futuros espectadores de esta respuesta. También he añadido un poco de código para probar y hacer su punto más claro. Gracias por tu respuesta!
  2. 85

    Indefinido normalmente se refiere a algo que aún no ha sido asignado un valor (todavía). Null se refiere a algo que, definitivamente, no tiene ningún valor. En ese caso, yo recomendaría devolver un valor null. Tenga en cuenta que una función no se especifica el valor de retorno implícita devuelve undefined.

    De la ECMAScript2015 spec

    4.3.10 valor indefinido

    primitivo valor que se utiliza cuando una variable no se ha asignado un valor

    4.3.12 valor null

    primitivo valor que representa el
    intencional ausencia de cualquier objeto de valor

    http://www.ecma-international.org/ecma-262/6.0/#sec-terms-and-definitions-undefined-type

    Leer más:

    Cuando es null o undefined utilizados en JavaScript?

    • Sí, undefined es el valor que se utiliza cuando una variable no se ha asignado un valor. ¿Por qué se hace exactamente lo que implica que no debería devolver indefinido en una función?
    • en mi mente, desde un vacío función devuelve undefined, que es un valor reservado para las funciones de ese tipo, por lo que al manipular el valor de retorno de una función, null me dice que se decidió devolver un valor nulo, mientras que los indefinidos me dice que decidido a volver indefinido, o decidió no devolver nada, pero no creo que definitivamente sabe qué. Además, si yo estoy haciendo var x=someFunc();, estoy intencionalmente asignar a x un valor, y preferiría no pasar ningún tipo de pruebas que indican que no tiene (o no) se le ha asignado un valor. Sólo mi humilde opinión
  3. 22

    Voy a dar mi personal obstinado en la manera de elegir entre las dos.

    Mi pregunta es: ¿el valor, dado otra entrada/estado/contexto se podría definir a algo?

    Si la respuesta es sí, entonces el uso de null persona use undefined. Más generalmente, la función devuelve un objeto debe devolver null cuando la intención de objeto no existe. Porque podría existir otro de entrada/estado/contexto.

    null representa el ausencia de valor para una entrada dada/estado/contexto. Implícitamente significa que el concepto del valor en sí mismo se da en el contexto de su aplicación, pero puede estar ausente.
    En su ejemplo, el concepto de un lado de la tarjeta existe, pero la tarjeta en sí no puede existir. null debe ser utilizado.

    undefined implícitamente representa el ausencia de significado de ese valor en su aplicación a su contexto. Por ejemplo, si me manipular un user objeto con un determinado conjunto de propiedades y intento acceder a la propiedad pikatchu. El valor de esta propiedad debe establecerse a undefined porque en mi contexto, no tiene ningún sentido tener una propiedad.

    • Esto suena tan fiel a mí. OMI puro funciones deben devolver null, mientras que las funciones con efectos secundarios que debe devolver undefined, cuando el pensamiento como un funcional de programador.
  4. 4

    undefined no es algo que se debe asignar. Puede que desee considerar la posibilidad de devolver algo más que undefined. En su caso, incluso si usted no devuelve nada en absoluto, el resultado será undefined ya. Así, te sugiero ir con null lugar.

    Considerar este ejemplo,

    function getSomething() {
         //.. do something
         return undefined;
    }
    
    function doSomething() {
         //.. I'm not gonna return anything.
    }
    
    var a = getSomething();
    var b = doSomething();

    Ejemplo anterior resultado en a === b, que es undefined. La diferencia es que guarde 1 la ejecución de la instrucción.

    • Quiero decir, undefined no tiene que ser asignado. Toda variable declarada sin valores ya están undefined.
    • como se mencionó antes por @chiliNUT «tenga en cuenta que una función no se especifica el valor de retorno implícita devuelve undefined.» – esto es cierto porque (function(){ /* code */ })() devuelve null en una consola.
    • Que el código que en realidad no devuelve nada. Y otra cosa, da undefined en mi chrome y firefox de la consola.
    • OK yo no entendía su punto. Sí, si usted no devuelve nada explícitamente, indefinido será devuelto de forma implícita. Pero, ¿por qué importa eso?
    • Creo que lo que @choz estaba tratando de decir (como algunos otros también se menciona en esta pregunta que si quiero volver undefined si algo no regresar antes – no necesito porque la función del comportamiento por defecto si usted no devuelve nada es para volver indefinido – no son más que decir que esto no es necesario. Además… me gusta lo que tenía que decir acerca de construido-en funciones de captador de devolver null. Por favor enviar su respuesta a ese efecto y yo la aceptaré.
  5. 2

    Depende de lo que u tiene que hacer con el valor devuelto.

    typeof null devuelve un objeto. que objeto tiene un valor indefinido

    typeof devuelve undefined undefined

    • Personalmente yo suelo usar null.
    • «el objeto tiene un valor undefined» no, no es y no es un objeto, es Nulo. typeof no necesariamente devolver el verdadero tipo de datos de un valor, tiene un mapa que los mapas de tipos de datos para las etiquetas y devuelve la etiqueta correspondiente.
    • No confíe en typeof, a pesar de su nombre no nos dice el tipo de un valor.
  6. 2

    He aquí un ejemplo donde undefined tiene más sentido que null:

    Yo uso una función de contenedor para JSON.parse que convierte su excepción a 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
    }

    Nota que null es válido en JSON mientras undefined no.

    • Veo lo que estás haciendo ahí – y no puedo decir que te equivocas, porque en un sentido, creo que usted podría hacer esto aquí y que estaría bien. Tengo un patrón diferente que yo uso para hacer esta operación que me gusta más porque tengo que hacer una «validación» paso después. Siento que esta es la obtención de la validación mezclado con devolver el valor. Aquí es lo que yo hago: let getStringOrJSON = value => { try { value = JSON.parse(value); } catch(e) { return value; } return value; };. Ahora, estoy seguro de que los dos resultados podría ser manejado de manera diferente, y no podría ganar el JS de golf de la competencia. Funciona.
  7. 1

    Creo que es muy discutible lo de usar. Yo prefiero código que es semánticamente tan exactos como sea posible, así que creo que undefined es apropiado en este caso.

    Creo que de null asignaciones con el significado de «un conjunto de variables para nada». Esto es lo opuesto a undefined que significa «esta cosa no existe en absoluto»

    Como una respuesta anterior, señaló, volviendo undefined tiene problemas, y es totalmente de usted si que le molesta. No me molestan.

    • Pero document.getElementById('iDoNotExist') devuelve null, aunque el significado es más cercano a «esta cosa no existe en absoluto». Si los métodos estándar hacerlo, ¿por qué no OP?
    • De hecho, me gusta tu razonamiento de la mayoría. Por favor enviar una respuesta a este efecto y yo la aceptaré. ( Yo incluso podría agregar un par de cambios en caso de que sea necesario )
    • Yah @Oriol, esta es la razón por la que yo realmente disfrutar de debates, incluso en P/A sitios. Es muy bueno para obtener contador de ejemplos. Y usted ha proporcionado una buena.
  8. 1

    Yo diría que en este caso, null debe ser devuelto.

    Si consideramos la cuestión desde un punto de ciencias de la computación punto de vista, a continuación, indefinido se utiliza para indicar no terminación/no-computabilidad (es decir, el marcador de posición de un punto indefinido x de un la función parcial f que se escribe a menudo f(x) = ⊥).

    getNextCard sin embargo parece ser capaz de calcular el siguiente tarjeta (si es que existe) y también ser capaz de calcular si no hay ninguna tarjeta siguiente. En otras palabras, la función es total ya que termina por cada entrada.

    Que se dice, un valor especial señalización de terminación sin resultado significativo (es decir, «no hay ninguna tarjeta puedo volver para esta entrada») y esto para mí es null no undefined.


    NOTAS:

    Se puede ver un poco de apoyo a este argumento, en algunos otros lenguajes con tipos así cuando la rescisión sin resultado significativo se expresan mediante un tipo de opción (a veces también se conoce como tipo que acepta valores null). Un ejemplo de ello es tal vez en Haskell.

    Por otro lado, por supuesto que no saben lo que undefined en JavaScript es que realmente se supone que significa eso. Así, la analogía con indefinido es un poco tenous. Por otra parte, ya que siempre queremos trabajar con el total de funciones, lo que equivale a decir «no volver nunca undefined de una función». Lo que parece ser un poco estricta, puesto que limitaría el uso de undefined a las propiedades de los/las variables que no se han establecido.

    Al final, mi preferencia personal es no volver jamás undefined donde puedo volver null y yo considero que esta es la mejor convención de codificación (porque entre otras cosas x !== null es más corto que typeof x !== 'undefined').

  9. 0

    Primera respuesta es correcta. Tienen teóricamente un significado diferente. Sin embargo no siempre es claro que se recoja.

    Que tienden a usar null en mi desarrollo, aunque creo que es una cosa subjetiva.

    Yo uso principalmente porque:

    1. undefined variable puede ser sobrescrito en navegadores antiguos, con el fin de regresar es un poco más complicado. Este mismo problema te obliga a usar typeof var === 'undefined' al obtener los resultados de la función. enlace

    2. Otros idiomas tienden a utilizar null ampliamente, muchos de ellos ni siquiera han definido (php por ejemplo). Eso me da una especie de coherencia al intercambiar rápidamente entre las lenguas.

  10. 0

    Mi opinión personal de acuerdo a mi experiencia es que no lo uso indefinido y null si no quieres que se bloquee el código. Al menos yo no personalmente. Hay un montón de funciones en Javascript que volver indefinido y aceptar que debemos utilizar para ello. Pero cuando el diseño de su código no lo uso. Es importante que siempre cambio algo "false" al menos. Si usted tiene una matriz, por ejemplo, y usted mapa sobre él. No es bueno para volver [undefined, undefined.....] o simplemente undefined. Es mejor que mantener 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.
    Yo intento todo el tiempo para evitarlo. Porque un null o undefined puede fácilmente bloquear el código

Dejar respuesta

Please enter your comment!
Please enter your name here