variable quitar error entre diferencia como javascript function null return undefined

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:

¿Cuándo se usa nulo o indefinido en JavaScript?


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:

  1. 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

  2. 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.