Eu sei que posso testar uma variável javascript e defini-la se for indefinida, mas não há como dizer
var setVariable = localStorage.getItem ('value') || 0;
parece uma maneira muito mais clara e tenho certeza de que já vi isso em outros idiomas.
javascript
undefined
pedalpete
fonte
fonte
localStorage.getItem()
gerará uma exceção se o usuário tiver desativado os cookies (pelo menos no Chrome); portanto, convémtry...catch
Respostas:
Sim, ele pode fazer isso, mas estritamente falando, isso atribuirá o valor padrão se o valor recuperado for falsey , ao contrário de verdadeiramente indefinido . Seria, portanto, não só igualar
undefined
, mas tambémnull
,false
,0
,NaN
,""
(mas não"0"
).Se você deseja definir o padrão apenas se a variável for estritamente
undefined
, a maneira mais segura é escrever:Em navegadores mais recentes, é realmente seguro escrever:
mas lembre-se de que é possível subvertê-lo em navegadores mais antigos, nos quais foi permitido declarar uma variável denominada
undefined
com um valor definido, causando falha no teste.fonte
var x = (x === undefined ? def_val : x);
como um pouco mais longovar x = (typeof x === 'undefined') ? def_val : x;
. O comportamento difere?undefined
redefinir o @marco em navegadores antigos , causando falha no teste de igualdade.||
abordagem em um teste estrito para indefinido; você deve usar um teste explícito paraundefined
com um condicional.A resposta do ES6 2018 é :
Se a variável x não estiver definida, retorne a variável y ... caso contrário, se a variável x estiver definida, retorne a variável x.
fonte
Object.is
não é melhor do que===
neste caso. "O operador === (e também o operador ==) trata os valores numéricos -0 e +0 como iguais e trata Number.NaN como diferente de NaN." ( developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/… ) Não importa aqui.Object.is
se ambos os operandos estiveremNaN
.undefined
. Então===
, funcionará 100% do tempo, não apenas 98%. A vantagem de===
ser mais fácil de ler, especialmente de relance, é mais curta e evita uma chamada de método desnecessária. Pessoalmente, eu usaria apenasObject.is()
quando a situação exigir e preferir===
em todos os outros casos.Eu precisava "definir uma variável se indefinida" em vários lugares. Criei uma função usando a resposta @Alnitak. Espero que ajude alguém.
Uso:
fonte
Parece mais lógico verificar em
typeof
vez deundefined
? Suponho que você espere um número ao definir o var0
quando indefinido:Nesse caso, se
getVariable
não for um número (string, objeto, qualquer que seja), setVariable será definido como0
fonte
ES2020 Resposta
Com o Operador de coalizão nulo , você pode definir um valor padrão se
value
for nulo ou indefinido.No entanto, você deve estar ciente de que o operador coalescente nulo não retorna o valor padrão para outros tipos de valor falso, como
0
e''
.Observe que o suporte do navegador para o operador é limitado. De acordo com os dados da caniuse , apenas 48,34% dos navegadores são suportados (a partir de abril de 2020). O suporte ao Node.js foi adicionado na versão 14 .
fonte
Se você é um fã de FP ( programação funcional ), o Ramda possui uma função auxiliar pura para isso chamada defaultTo :
uso:
const result = defaultTo(30)(value)
É mais útil ao lidar com
undefined
valores booleanos:const result2 = defaultTo(false)(dashboard.someValue)
fonte
const result = value || 30;
, exceto pelo uso de uma função intermediária e uma lib de +1000 bytesvar setVariable = (typeof localStorage.getItem('value') !== 'undefined' && localStorage.getItem('value')) || 0;
fonte
localStorage.getItem('value'))
retornarfalse
Também deparei com esse cenário hoje, onde eu não queria que zero fosse substituído por vários valores. Temos um arquivo com alguns métodos utilitários comuns para cenários como este. Aqui está o que eu adicionei para lidar com o cenário e ser flexível.
Em seguida, ele pode ser chamado com os dois últimos parâmetros sendo opcionais se eu desejar definir apenas valores indefinidos ou também substituir valores nulos ou 0. Aqui está um exemplo de uma chamada para ele que definirá o ID para -1 se o ID for indefinido ou nulo, mas não substituirá um valor 0.
fonte
Nos nossos dias, você realmente pode fazer sua abordagem com o JS:
Portanto, seu exemplo funcionará:
fonte
Funciona mesmo que o valor padrão seja um valor booleano:
fonte
Parece-me que, para implementações atuais de javascript,
é uma boa maneira de fazer isso (usando a desconstrução de objetos).
fonte
Designação nula lógica, solução ES2020 +
Novos operadores estão sendo adicionados aos navegadores,
??=
,||=
, e&&=
. Esta postagem será focada??=
.Isso verifica se o lado esquerdo está indefinido ou nulo, em curto-circuito, se já definido. Caso contrário, o lado direito é atribuído à variável do lado esquerdo.
Métodos de comparação
Exemplos básicos
Exemplos de objeto / matriz
?? = Suporte do navegador julho de 2020 - 0,03%
?? = Documentação Mozilla
|| = Documentação Mozilla
&& = Documentação Mozilla
fonte