¿Hay un operador de fusión nulo en Javascript?
Por ejemplo, en C #, puedo hacer esto:
String someString = null;
var whatIWant = someString ?? "Cookies!";
La mejor aproximación que puedo encontrar para Javascript es usar el operador condicional:
var someString = null;
var whatIWant = someString ? someString : 'Cookies!';
Lo cual es algo asqueroso en mi humilde opinión. ¿Puedo hacerlo mejor?
javascript
operators
null-coalescing-operator
null-coalescing
Daniel Schaffer
fuente
fuente
x ?? y
sintaxis ahora está en el estado de propuesta de la etapa 1 - fusión conjunta nulax ?? y
) y el operador de encadenamiento opcional (user.address?.street
) ahora están en la Etapa 4. Aquí hay una buena descripción sobre lo que eso significa: 2ality.com/2015/11/tc39-process.html#stage-4%3A-finished .Respuestas:
Actualizar
JavaScript ahora admite el operador de fusión nulo (??) . Devuelve su operando del lado derecho cuando su operando del lado izquierdo es
null
oundefined
, y de lo contrario devuelve su operando del lado izquierdo.Por favor, compruebe la compatibilidad antes de usarlo.
El equivalente de JavaScript del operador de fusión nulo C # (
??
) está utilizando un OR lógico (||
):Hay casos (aclarados a continuación) en los que el comportamiento no coincidirá con el de C #, pero esta es la forma general y concisa de asignar valores predeterminados / alternativos en JavaScript.
Aclaración
Independientemente del tipo del primer operando, si lo convierte en un resultado booleano
false
, la asignación utilizará el segundo operando. Tenga cuidado con todos los casos a continuación:Esto significa:
fuente
||
devuelve el primer valor "verdadero" o el último "falsey" (si ninguno puede evaluar como verdadero) y eso&&
funciona de la manera opuesta: devolver el último valor verdadero o el primer valor falso.var whatIWant = new Number(0) || 42; // is Number {[[PrimitiveValue]]: 0} var whatIWant = new String("") || "a million bucks"; // is String {length: 0, [[PrimitiveValue]]: ""}
var value = myObj && myObj.property || ''
recurrirá a''
si myObj o myObj.property es falso.Esta solución funciona como la función de fusión de SQL, acepta cualquier número de argumentos y devuelve un valor nulo si ninguno de ellos tiene un valor. Se comporta como el C # ?? operador en el sentido de que "", falso y 0 se consideran NO NULL y, por lo tanto, cuentan como valores reales. Si vienes de un fondo .net, esta será la solución de sensación más natural.
fuente
for(var i in arguments)
no garantiza orden de iteración, según la MDN . Consulte también ¿Por qué no se recomienda JavaScript para For ... In loop para matrices? y ¿Por qué usar "for ... in" con iteración de matriz es una mala idea? .Sí, llegará pronto. Vea la propuesta aquí y el estado de implementación aquí .
Se parece a esto:
Ejemplo
fuente
x ?? y
) y el operador de encadenamiento opcional (user.address?.street
) ahora están en la Etapa 4. Aquí hay una buena descripción sobre lo que eso significa: 2ality.com/2015/11/tc39-process.html#stage-4%3A-finished .Si,
||
como reemplazo de C #,??
no es lo suficientemente bueno en su caso, porque se traga cadenas vacías y ceros, siempre puede escribir su propia función:fuente
false
si (estrictamente) nulo / indefinido y de lotrue
contrario, usar eso con un lógico o; podría ser más legible que muchas llamadas de funciones anidadas. por ejemplo,$N(a) || $N(b) || $N(c) || d
es más legible que$N($N($N(a, b), c), d)
.if .. return .. else ... return
Es el caso perfecto para un ternario.return (value === null || value === void 0) ? ifnull : value;
Nadie ha mencionado aquí el potencial
NaN
que, para mí, también es un valor nulo. Entonces, pensé que agregaría mis dos centavos.Para el código dado:
Si usara el
||
operador, obtendrá el primer valor no falso:Si usa el método de fusión típico, como se publica aquí , obtendrá
c
, que tiene el valor:NaN
Ninguno de estos me parece correcto. En mi pequeño mundo de lógica de fusión, que puede diferir de su mundo, considero que indefinido, nulo y NaN son "nulos". Entonces, esperaría volver
d
(cero) del método de fusión.Si el cerebro de alguien funciona como el mío, y desea excluirlo
NaN
, entonces este método logrará eso:Para aquellos que desean el código lo más breve posible, y no les importa un poco la falta de claridad, también pueden usar esto como lo sugiere @impinball. Esto aprovecha el hecho de que NaN nunca es igual a NaN. Puede leer más sobre eso aquí: ¿Por qué NaN no es igual a NaN?
fuente
typeof
+num.toString() === 'NaN'
es redundante), almacene el argumento actual en variable en lugar dearguments[i]
.!== 'number'
cheque ya que ya he evaluado que no lo esnull
oundefined
, pero esto tiene la ventaja de ser muy claro para cualquiera que lea este código y la condición funcionará independientemente del orden. Sus otras sugerencias acortan ligeramente el código, así que las usaré.arg !== arg
, pero necesitas que estéarg === arg
... entonces funciona. Sin embargo, eso tiene la desventaja de no ser muy claro en cuanto a lo que está haciendo ... requiere un comentario en el código para evitar que la próxima persona que lo revise piense quearg === arg
es redundante ... pero lo pondré de todas formas.tenga cuidado con la definición específica de JavaScript de nulo. Hay dos definiciones para "sin valor" en JavaScript. 1. Nulo: cuando una variable es nula, significa que no contiene datos, pero la variable ya está definida en el código. Me gusta esto:
en tal caso, el tipo de su variable es en realidad Objeto. Pruébalo.
Indefinido: cuando una variable no se ha definido antes en el código, y como se esperaba, no contiene ningún valor. Me gusta esto:
en ese caso, el tipo de su variable es 'indefinido'.
tenga en cuenta que si utiliza el operador de comparación de conversión de tipos (==), JavaScript actuará igualmente para ambos valores vacíos. para distinguir entre ellos, use siempre el operador de comparación de tipo estricto (===).
fuente
var u = undefined;
Después de leer su aclaración, la respuesta de @Ates Goral proporciona cómo realizar la misma operación que está haciendo en C # en JavaScript.
La respuesta de @ Gumbo proporciona la mejor manera de verificar nulo; Sin embargo, es importante tener en cuenta la diferencia en
==
comparación===
con JavaScript, especialmente cuando se trata de problemas de comprobaciónundefined
y / onull
.Hay un muy buen artículo sobre la diferencia de dos términos aquí . Básicamente, comprenda que si usa en
==
lugar de===
, JavaScript intentará fusionar los valores que está comparando y devolver el resultado de la comparación después de esta fusión.fuente
Tenga en cuenta que la
create-react-app
cadena de herramientas de React admite la fusión nula desde la versión 3.3.0 (lanzada el 5.12.2019) . De las notas de la versión:Dicho esto, en caso de que use
create-react-app
3.3.0+, puede comenzar a usar el operador de fusión nula hoy en sus aplicaciones React.fuente
Sí, y su propuesta es la Etapa 4 ahora. Esto significa que la propuesta está lista para su inclusión en el estándar formal ECMAScript. Ya puede usarlo en versiones de escritorio recientes de Chrome, Edge y Firefox, pero tendremos que esperar un poco más hasta que esta característica alcance la estabilidad entre navegadores.
Eche un vistazo al siguiente ejemplo para demostrar su comportamiento:
El ejemplo anterior es equivalente a:
Tenga en cuenta que coalescencia nullish será no amenaza Falsy valores de la forma en que el
||
operador lo hizo (que sólo verifica si hayundefined
onull
valores), de ahí el siguiente fragmento actuará de la siguiente manera:Para los usuarios de TypeScript , a partir de TypeScript 3.7 , esta característica también está disponible ahora.
fuente
Esperamos que pronto esté disponible en Javascript, ya que está en fase de propuesta a partir de abril de 2020. Puede monitorear el estado aquí para compatibilidad y soporte: https://developer.mozilla.org/en-US/docs/Web/ JavaScript / Referencia / Operadores / Nullish_coalescing_operator
Para las personas que usan Tipos de letra, puede usar el operador de fusión nulo de Tipos de letra 3.7
De los documentos -
fuente
Ok, una respuesta adecuada
¿Existe en JavaScript? Si lo hace. PERO. Actualmente es a partir del 2020-02-06 en la Etapa 3 y aún no es compatible en todas partes.Siga el enlace en la URL a continuación y vaya a los encabezados "Especificaciones" y "Compatibilidad del navegador" para obtener más información sobre dónde se encuentra.
Cita de: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator
¿Quieres ejemplos? Sigue el enlace que publiqué, tiene todo.
fuente
Ahora tiene soporte completo en la última versión de los principales navegadores como Chrome, Edge, Firefox, Safari, etc. Aquí está la comparación entre el operador nulo y el Operador de fusión nula
fuente