Existe um operador coalescente nulo em Javascript?
Por exemplo, em C #, eu posso fazer isso:
String someString = null;
var whatIWant = someString ?? "Cookies!";
A melhor aproximação que posso descobrir para Javascript é usar o operador condicional:
var someString = null;
var whatIWant = someString ? someString : 'Cookies!';
O que é meio IMHO icky. Posso fazer melhor?
javascript
operators
null-coalescing-operator
null-coalescing
Daniel Schaffer
fonte
fonte
x ?? y
sintaxe está agora no status da proposta do estágio 1 - coalescênciax ?? y
) e o operador de encadeamento opcional (user.address?.street
) agora são o Estágio 4. Aqui está uma boa descrição sobre o que isso significa: 2ality.com/2015/11/tc39-process.html#stage-4%3A-finished .Respostas:
Atualizar
O JavaScript agora suporta o operador coalescente nulo (??) . Ele retorna seu operando do lado direito quando o operando do lado esquerdo é
null
orundefined
e, caso contrário, retorna seu operando do lado esquerdo.Por favor, verifique a compatibilidade antes de usá-lo.
O equivalente em JavaScript do operador coalescente nulo C # (
??
) está usando um OR lógico (||
):Existem casos (esclarecidos abaixo) em que o comportamento não corresponde ao do C #, mas esta é a maneira geral e concisa de atribuir valores padrão / alternativos no JavaScript.
Esclarecimento
Independentemente do tipo do primeiro operando, se o converter em um booleano resultar
false
, a atribuição usará o segundo operando. Cuidado com todos os casos abaixo:Isso significa:
fonte
||
digno de nota que retorna o primeiro valor "truey" ou o último "falsey" (se nenhum puder avaliar como true) e&&
funciona da maneira oposta: retornando o último valor truey ou o primeiro valor falsey.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 || ''
voltará a''
se myObj ou myObj.property for falso.esta solução funciona como a função de coalescência SQL, aceita qualquer número de argumentos e retorna nulo se nenhum deles tiver um valor. Se comporta como o c # ?? operador no sentido de que "", false e 0 são considerados NOT NULL e, portanto, contam como valores reais. Se você tem experiência em .net, esta será a solução mais natural para os sentimentos.
fonte
for(var i in arguments)
não garante a ordem da iteração, de acordo com o MDN . Consulte também Por que o loop For… In do JavaScript não é recomendado para matrizes? e Por que usar "for ... in" com iteração de matriz é uma péssima idéia? .Sim, está chegando em breve. Veja a proposta aqui e o status da implementação aqui .
Se parece com isso:
Exemplo
fonte
x ?? y
) e o operador de encadeamento opcional (user.address?.street
) agora são o Estágio 4. Aqui está uma boa descrição sobre o que isso significa: 2ality.com/2015/11/tc39-process.html#stage-4%3A-finished .Se,
||
como uma substituição de C #,??
não for boa o suficiente no seu caso, porque engole seqüências de caracteres vazias e zeros, você sempre pode escrever sua própria função:fonte
false
se (estritamente) nula / indefinida e detrue
outra forma - usando isso com uma lógica ou; poderia ser mais legível do que muitas chamadas de funções aninhadas. por exemplo,$N(a) || $N(b) || $N(c) || d
é mais legível que$N($N($N(a, b), c), d)
.if .. return .. else ... return
é o caso perfeito para um ternário.return (value === null || value === void 0) ? ifnull : value;
Ninguém mencionou aqui o potencial para
NaN
, que - para mim - também é um valor nulo. Então, pensei em adicionar meus dois centavos.Para o código fornecido:
Se você usar o
||
operador, obterá o primeiro valor não falso:Se você usar o método típico de coalescência, conforme publicado aqui , obterá
c
o valor:NaN
Nenhuma dessas parece correta para mim. No meu pequeno mundo de lógica de coalescência, que pode diferir do seu mundo, considero indefinido, nulo e NaN como sendo todos "nulos". Então, eu esperaria voltar
d
(zero) do método de coalescência.Se o cérebro de alguém funcionar como o meu e você quiser excluir
NaN
, esse método fará isso:Para aqueles que desejam o código o mais curto possível e não se importam com a falta de clareza, também é possível usá-lo conforme sugerido pelo @impinball. Isso tira proveito do fato de que NaN nunca é igual a NaN. Você pode ler mais sobre isso aqui: Por que NaN não é igual a NaN?
fonte
typeof
+num.toString() === 'NaN'
é redundante), armazene o argumento atual na variável em vez dearguments[i]
.!== 'number'
verificação, pois já avaliei que não énull
ouundefined
, mas isso tem a vantagem de ser muito claro para quem lê esse código e a condição funcionará independentemente da ordem. Suas outras sugestões diminuem um pouco o código, então eu as usarei.arg !== arg
, mas precisa que sejaarg === arg
... então funciona. No entanto, isso tem a desvantagem de não ser claro o que você está fazendo ... requer comentário no código para evitar ser removido pela próxima pessoa que passar pelo código e achar quearg === arg
é redundante ... mas eu vou colocá-lo de qualquer forma.cuidado com a definição específica de JavaScript de null. existem duas definições para "sem valor" em javascript. 1. Nulo: quando uma variável é nula, significa que não contém dados, mas a variável já está definida no código. como isso:
nesse caso, o tipo da sua variável é realmente Object. teste-o.
Indefinido: quando uma variável não foi definida anteriormente no código e, como esperado, ela não contém nenhum valor. como isso:
nesse caso, o tipo da sua variável é 'indefinido'.
observe que, se você usar o operador de comparação de conversão de tipo (==), o JavaScript atuará igualmente para esses dois valores vazios. para distinguir entre eles, sempre use o operador de comparação de tipo estrito (===).
fonte
var u = undefined;
Depois de ler seu esclarecimento, a resposta do @Ates Goral fornece como executar a mesma operação que você está fazendo em C # em JavaScript.
A resposta do @ Gumbo fornece a melhor maneira de verificar se há nulo; no entanto, é importante observar a diferença entre
==
versus===
no JavaScript, especialmente quando se trata de questões de verificação deundefined
e / ounull
.Há um artigo realmente bom sobre a diferença em dois termos aqui . Basicamente, entenda que, se você usar em
==
vez de===
, o JavaScript tentará coalescer os valores que você está comparando e retornar o resultado da comparação após essa coalescência.fonte
Observe que a
create-react-app
cadeia de ferramentas do React suporta a coalescência nula desde a versão 3.3.0 (versão 5.12.2019) . Nas notas de versão:Dito isto, caso você use o
create-react-app
3.3.0+, você pode começar a usar o operador de coalescência nula já hoje em seus aplicativos React.fonte
Sim, e sua proposta é a Etapa 4 agora. Isso significa que a proposta está pronta para inclusão no padrão formal do ECMAScript. Você já pode usá-lo em versões recentes de desktop do Chrome, Edge e Firefox, mas teremos que esperar um pouco mais até que esse recurso atinja a estabilidade entre navegadores.
Dê uma olhada no exemplo a seguir para demonstrar seu comportamento:
O exemplo anterior é equivalente a:
Note-se que coalescente nullish vai não ameaça Falsas valores a forma como o
||
operador fez (ele apenas verificaundefined
ounull
valores), daí o seguinte trecho funcionará da seguinte forma:Para usuários do TypesScript, iniciando o TypeScript 3.7 , esse recurso também está disponível agora.
fonte
Esperamos que esteja disponível em breve em Javascript, como está na fase de proposta a partir de abril de 2020. Você pode monitorar o status aqui para compatibilidade e suporte - https://developer.mozilla.org/en-US/docs/Web/ JavaScript / Referência / Operadores / Nullish_coalescing_operator
Para pessoas que usam o Typecript , você pode usar o operador coalescente nulo do Typescript 3.7
Dos documentos -
fonte
Ok, uma resposta adequada
Existe em JavaScript? Sim. MAS. Atualmente, é a partir de 2020-02-06 na Etapa 3 e ainda não é suportado em todos os lugares. Siga o link no URL abaixo e vá para os cabeçalhos "Especificações" e "Compatibilidade do navegador" para obter mais informações sobre a localização.
Citação de: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator
Quer exemplos? Segue o link que eu postei, tem tudo.
fonte
Agora ele tem suporte completo na versão mais recente dos principais navegadores, como Chrome, Edge, Firefox, Safari etc. Aqui está a comparação entre o operador nulo e o Nullish Coalescing Operator
fonte