Vou explicar pelo exemplo:
Operador de Elvis (?:)
O "operador Elvis" é uma abreviação do operador ternário de Java. Uma instância em que isso é útil é o retorno de um valor 'sensível padrão' se uma expressão resolver como falsa ou nula. Um exemplo simples pode ser assim:
def gender = user.male ? "male" : "female" //traditional ternary operator usage
def displayName = user.name ?: "Anonymous" //more compact Elvis operator
Operador de navegação segura (?.)
O operador Navegação segura é usado para evitar uma NullPointerException. Normalmente, quando você tem uma referência a um objeto, pode ser necessário verificar se ele não é nulo antes de acessar métodos ou propriedades do objeto. Para evitar isso, o operador de navegação segura simplesmente retornará nulo em vez de lançar uma exceção, da seguinte forma:
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
fonte
fonte
??
) em javascript? Tudo o que estou encontrando até agora sugere que o JS só tem coalescência "falsey" (usando||
).Respostas:
Você pode usar o operador lógico 'OR' no lugar do operador Elvis:
Por exemplo
displayname = user.name || "Anonymous"
.Mas o Javascript atualmente não tem a outra funcionalidade. Eu recomendo olhar o CoffeeScript se você quiser uma sintaxe alternativa. Tem alguma abreviação que é semelhante ao que você está procurando.
Por exemplo, O Operador Existencial
Atalhos de função
Chamada de função sexy
Há também comentários e classes com várias linhas. Obviamente, você precisa compilar isso em javascript ou inserir na página,
<script type='text/coffeescript>'
mas isso adiciona muitas funcionalidades :). O uso<script type='text/coffeescript'>
é realmente destinado apenas ao desenvolvimento e não à produção.fonte
<script type='coffee/script>'
?<script type="text/coffeescript">
.x === undefined
.Penso que o seguinte é equivalente ao operador de navegação segura, embora um pouco mais longo:
streetName
será então o valor deuser.address.street
ouundefined
.Se você deseja que o padrão seja outra coisa, você pode combinar com o atalho acima ou fornecer:
fonte
O operador OR lógico do Javascript está em curto-circuito e pode substituir o operador "Elvis":
No entanto, que eu saiba, não há equivalente ao seu
?.
operador.fonte
||
poderia ser usado dessa maneira. Esteja ciente de que isso vai se unir não só quando a expressão énull
, mas também quando é indefinido,false
,0
, ou a cadeia vazia.""
ou0
pode ser inesperado, embora :)Ocasionalmente, achei útil o seguinte idioma:
pode ser reescrito como:
Isso tira vantagem do fato de que obter atributos desconhecidos em um objeto retorna indefinido, em vez de lançar uma exceção como ocorre em
null
ouundefined
, portanto, substituímos nulo e indefinido por um objeto vazio antes de navegar.fonte
&&
método detalhado . +1.Eu acho que o Lodash
_.get()
pode ajudar aqui, como em_.get(user, 'name')
, e tarefas mais complexas, como_.get(o, 'a[0].b.c', 'default-value')
fonte
Atualmente, há uma especificação de rascunho:
https://github.com/tc39/proposal-optional-chaining
https://tc39.github.io/proposal-optional-chaining/
Por enquanto, porém, eu gosto de usar lodash
get(object, path [,defaultValue])
ou DLVdelve(obj, keypath)
Atualização (em 23 de dezembro de 2019):
fonte
Atualização de 2019
O JavaScript agora tem equivalentes para o Operador Elvis e o Operador de Navegação Segura.
Acesso seguro à propriedade
O operador de encadeamento opcional (
?.
) atualmente é uma proposta de estágio 4 do ECMAScript . Você pode usá-lo hoje com Babel .O operador AND lógico (
&&
) é a maneira "antiga" e mais detalhada de lidar com esse cenário.Fornecendo um padrão
O operador coalescente nulo (
??
) é atualmente uma proposta de estágio 3 do ECMAScript . Você pode usá-lo hoje com Babel . Permite definir um valor padrão se o lado esquerdo do operador for um valor nulo ( / ).null
undefined
O operador OR lógico (
||
) é uma solução alternativa com comportamento ligeiramente diferente . Permite definir um valor padrão se o lado esquerdo do operador for falso . Observe que o resultadomyVariable3
abaixo difere domyVariable3
acima.fonte
Para o primeiro, você pode usar
||
. O operador "lógico ou" Javascript, em vez de simplesmente retornar valores verdadeiros e falsos enlatados, segue a regra de retornar seu argumento esquerdo, se for verdadeiro, e avaliar e retornar o argumento correto. Quando você está interessado apenas no valor verdade, ele funciona da mesma forma, mas também significa quefoo || bar || baz
retorna o valor mais à esquerda de foo, bar ou baz que contém um valor verdadeiro .Você não encontrará um que possa distinguir false de null, e 0 e string vazia são valores falsos; portanto, evite usar a
value || default
construção emvalue
que legitimamente pode ser 0 ou""
.fonte
Sim existe! 🍾
O encadeamento opcional está no estágio 4 e isso permite que você use a
user?.address?.street
fórmula.Se você não pode esperar o lançamento, instale
@babel/plugin-proposal-optional-chaining
e você pode usá-lo. Aqui estão minhas configurações que funcionam para mim ou apenas leia o artigo de Nimmo .fonte
Aqui está um simples operador de elvis equivalente:
fonte
ATUALIZAÇÃO SEP 2019
Sim, o JS agora suporta isso. O encadeamento opcional está chegando em breve à v8 leia mais
fonte
Isso é mais conhecido como um operador de coalescência nula. Javascript não possui um.
fonte
Você pode obter aproximadamente o mesmo efeito dizendo:
fonte
Eu tenho uma solução para isso, adapte-a às suas próprias necessidades, um trecho de uma das minhas bibliotecas:
Funciona como um encanto. Aproveite a menos dor!
fonte
Você pode fazer o seu próprio:
E use-o assim:
* resultado é indefinido se qualquer um de a, b, c ou d for indefinido.
fonte
Li este artigo ( https://www.beyondjava.net/elvis-operator-aka-safe-navigation-javascript-typescript ) e modifiquei a solução usando Proxies.
Você chama assim:
O resultado será indefinido para uma expressão que encontre nula ou indefinida ao longo do caminho. Você pode ir à loucura e modificar o protótipo de objeto!
fonte
Chegando muito tarde, há uma proposta [1] para encadeamento opcional atualmente no estágio 2, com um plugin babel [2] disponível. No momento, ele não está em nenhum navegador que eu conheço.
fonte
Isso foi um problema para mim por um longo tempo. Eu tive que encontrar uma solução que pudesse ser facilmente migrada quando obtivemos o operador Elvis ou algo assim.
É isso que eu uso; funciona para matrizes e objetos
coloque isso no arquivo tools.js ou algo assim
exemplo de uso:
bem, eu sei que isso torna o código um pouco ilegível, mas é uma solução simples de um liner e funciona muito bem. Eu espero que isso ajude alguém :)
fonte
Esta foi uma solução interessante para o operador de navegação segura usando algumas combinações ..
http://jsfiddle.net/avernet/npcmv/
fonte
Criei um pacote que facilita muito o uso.
NPM jsdig Github jsdig
Você pode lidar com coisas simples como e objeto:
ou um pouco mais complicado:
fonte
Pessoalmente eu uso
e, por exemplo, get seguro:
fonte
e({a:{b:{c:{d:'test'}}}}, 'a.b.c.d')
retornanull
.e = eval
,var a = eval('obj.a.b.c.d')
.eval
nem sequer usa um segundo parâmetro ... developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/…