Explicaré con el ejemplo:
Operador de Elvis (?:)
El "operador de Elvis" es una abreviatura del operador ternario de Java. Una instancia de donde esto es útil es para devolver un valor 'sensible por defecto' si una expresión se resuelve como falsa o nula. Un ejemplo simple podría verse así:
def gender = user.male ? "male" : "female" //traditional ternary operator usage
def displayName = user.name ?: "Anonymous" //more compact Elvis operator
Operador de navegación segura (?.)
El operador de navegación segura se utiliza para evitar una excepción NullPointerException. Normalmente, cuando tiene una referencia a un objeto, es posible que deba verificar que no sea nulo antes de acceder a los métodos o propiedades del objeto. Para evitar esto, el operador de navegación segura simplemente devolverá nulo en lugar de lanzar una excepción, de esta manera:
def user = User.find( "admin" ) //this might be null if 'admin' does not exist
def streetName = user?.address?.street //streetName will be null if user or user.address is null - no NPE thrown
javascript
jquery
groovy
safe-navigation-operator
tiagomac
fuente
fuente
??
) en javascript? Todo lo que he encontrado hasta ahora sugiere que JS solo tiene una fusión (uso||
) "falsey" .Respuestas:
Puede usar el operador lógico 'OR' en lugar del operador de Elvis:
Por ejemplo
displayname = user.name || "Anonymous"
.Pero Javascript actualmente no tiene la otra funcionalidad. Recomiendo mirar CoffeeScript si desea una sintaxis alternativa. Tiene una taquigrafía similar a la que estás buscando.
Por ejemplo, el operador existencial
Atajos de funciones
Llamada de función sexy
También hay comentarios y clases de varias líneas. Obviamente, debe compilar esto en JavaScript o insertarlo en la página,
<script type='text/coffeescript>'
pero agrega mucha funcionalidad :). El uso<script type='text/coffeescript'>
realmente solo está destinado al desarrollo y no a la producción.fuente
<script type='coffee/script>'
?<script type="text/coffeescript">
.x === undefined
.Creo que lo siguiente es equivalente al operador de navegación segura, aunque un poco más largo:
streetName
entonces será el valor deuser.address.street
oundefined
.Si desea que el valor predeterminado sea otra cosa, puede combinarlo con el acceso directo anterior o dar:
fuente
El operador lógico OR de Javascript está en cortocircuito y puede reemplazar su operador "Elvis":
Sin embargo, que yo sepa, no hay equivalente para su
?.
operador.fuente
||
podría usarse de esa manera. Tenga en cuenta que esto no sólo se aglutinan cuando la expresión esnull
, sino también cuando es indefinido,false
,0
, o la cadena vacía.""
o0
podría ser inesperado, sin embargo :)En ocasiones he encontrado útil el siguiente idioma:
puede reescribirse como:
Esto aprovecha el hecho de que obtener atributos desconocidos en un objeto devuelve indefinido, en lugar de lanzar una excepción como lo hace en
null
oundefined
, por lo que reemplazamos nulo e indefinido con un objeto vacío antes de navegar.fuente
&&
método detallado . +1.Creo que lodash
_.get()
puede ayudar aquí, como en_.get(user, 'name')
, y tareas más complejas como_.get(o, 'a[0].b.c', 'default-value')
fuente
Actualmente hay un borrador de especificación:
https://github.com/tc39/proposal-optional-chaining
https://tc39.github.io/proposal-optional-chaining/
Por ahora, sin embargo, me gusta usar lodash
get(object, path [,defaultValue])
o dlvdelve(obj, keypath)
Actualización (a partir del 23 de diciembre de 2019):
fuente
Actualización 2019
JavaScript ahora tiene equivalentes tanto para el operador de Elvis como para el operador de navegación segura.
Acceso seguro a la propiedad
El operador de encadenamiento opcional (
?.
) es actualmente una propuesta de ECMAScript de etapa 4 . Puedes usarlo hoy con Babel .El operador lógico AND (
&&
) es la forma "antigua" y más detallada de manejar este escenario.Proporcionar un valor predeterminado
El operador de fusión nulo (
??
) es actualmente una propuesta de ECMAScript de etapa 3 . Puedes usarlo hoy con Babel . Le permite establecer un valor predeterminado si el lado izquierdo del operador es un valor nulo ( / ).null
undefined
El operador lógico OR (
||
) es una solución alternativa con un comportamiento ligeramente diferente . Le permite establecer un valor predeterminado si el lado izquierdo del operador es falso . Tenga en cuenta que el resultado demyVariable3
abajo difiere del demyVariable3
arriba.fuente
Para el primero, puedes usar
||
. El operador "lógico o" Javascript, en lugar de simplemente devolver valores verdaderos y falsos enlatados, sigue la regla de devolver su argumento izquierdo si es verdadero y, de lo contrario, evaluar y devolver su argumento derecho. Cuando solo le interesa el valor de verdad, funciona igual, pero también significa quefoo || bar || baz
devuelve el extremo izquierdo de foo, bar o baz que contiene un valor verdadero .Sin embargo, no encontrará uno que pueda distinguir falso de nulo, y 0 y la cadena vacía son valores falsos, así que evite usar la
value || default
construcción dondevalue
legítimamente puede ser 0 o""
.fuente
¡Sí hay! 🍾
El encadenamiento opcional está en la etapa 4 y esto le permite utilizar el
user?.address?.street
fórmula.Si no puede esperar el lanzamiento, instálelo
@babel/plugin-proposal-optional-chaining
y puede usarlo. Aquí están mis configuraciones que funcionan para mí, o simplemente lea el artículo de Nimmo .fuente
Aquí hay un simple operador de Elvis equivalente:
fuente
ACTUALIZACIÓN SEP 2019
Sí, JS ahora es compatible con esto. El encadenamiento opcional llegará pronto a v8 leer más
fuente
Esto se conoce más comúnmente como operador de fusión nula. Javascript no tiene uno.
fuente
Puede lograr aproximadamente el mismo efecto diciendo:
fuente
Tengo una solución para eso, adaptarlo a sus propias necesidades, un extracto de una de mis librerías:
Funciona de maravilla. ¡Disfruta del menor dolor!
fuente
Podrías rodar el tuyo:
Y úsalo así:
* el resultado no está definido si alguno de a, b, c o d no está definido.
fuente
Leí este artículo ( https://www.beyondjava.net/elvis-operator-aka-safe-navigation-javascript-typescript ) y modifiqué la solución usando Proxies.
Lo llamas así:
El resultado será indefinido para una expresión que encuentre nulo o indefinido a lo largo de su ruta. ¡Podría enloquecer y modificar el prototipo de Objeto!
fuente
Saltando muy tarde, hay una propuesta [1] para encadenamiento opcional actualmente en la etapa 2, con un complemento de babel [2] disponible. Actualmente no estoy en ningún navegador que yo sepa.
fuente
Esto fue un problema para mí por mucho tiempo. Tuve que encontrar una solución que se pueda migrar fácilmente una vez que obtengamos el operador de Elvis o algo así.
Esto es lo que uso; funciona tanto para matrices como para objetos
poner esto en el archivo tools.js o algo
ejemplo de uso:
bueno, sé que hace que el código sea un poco ilegible, pero es una solución simple y funciona muy bien. Espero que esto ayude a alguien :)
fuente
Esta fue una solución interesante para el operador de navegación segura que utilizaba algunas combinaciones.
http://jsfiddle.net/avernet/npcmv/
fuente
Creé un paquete que hace que esto sea mucho más fácil de usar.
NPM jsdig Github jsdig
Puede manejar cosas simples como y objeto:
o un poco más complicado:
fuente
Personalmente uso
y por ejemplo seguro obtener:
fuente
e({a:{b:{c:{d:'test'}}}}, 'a.b.c.d')
vuelvenull
.e = eval
,var a = eval('obj.a.b.c.d')
.eval
ni siquiera toma un segundo parámetro ... developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…