De acordo com ECMA-262, parte 11,13, seguinte é uma lista exaustiva dos operadores de atribuição compostos: *= /= %= += -= <<= >>= >>>= &= ^= |=
.
De acordo com a parte 11.11, var c = a || b
colocará a
valor em c
se ToBoolean(a)
for verdadeiro e colocará b
valor em c
caso contrário. Como tal, o OR lógico é frequentemente usado como operador de coalescência, por exemplo
function (options) {
options = options || {};
}
Com freqüência suficiente, coalesce é usado para especificar o valor padrão para a variável, como foi mostrado acima: a = a || b
.
Parece que o operador de atribuição composto ||=
seria realmente útil, permitindo a escrever o código acima de uma forma mais curta e mais limpo: a ||= b
. No entanto, não é ali (embora *=
, +=
e outros operadores de atribuição composto são).
A questão é, por quê?
fonte
+=
,*=
,-=
,/=
, por que não faria%=
o trabalho?).angle %= 360
ouvertexIndex %= numberOfVertices
(para a lista de vértices de um polígono fechado).||=
e&&=
em breve: "Você pode ficar feliz em saber que, para o JS2 / ES4, || = e && = também estão sendo adicionados. || = é mais útil dos dois, mas não há motivo para deixar de fora o formulário de atribuição de opções && ". .Respostas:
Uma razão possível é que os operadores lógicos
&&
e||
tenham um comportamento de "curto-circuito". O operando do lado direito&&
e||
não é avaliado, a menos que seja necessário. Talvez por esse motivo, os designers de linguagema ||= f()
tenham decidido que o significado de uma expressão como não era óbvio e, portanto, esses operadores deveriam ficar de fora.fonte
a ||= b
deve ser interpretado comoa = a || b
, mas na verdade pode sera || a = b
(como no Ruby ). Eles podem ser diferentes se o levantador tiver efeito colateral. Escolher um pode ser ruim para os usuários do outro campo. Pessoalmente, gosto doa || a = b
jeito (do jeito Ruby), mas não tenho certeza se todos estão felizes com isso.A resposta geral a todas as perguntas sobre "por que esse recurso de idioma não foi implementado" é que a equipe que projetou o idioma decidiu que o benefício não superava o custo.
O custo pode assumir várias formas. Leva tempo e esforço para implementar um recurso de linguagem, mas também há o custo intrínseco da complexidade: o recurso torna o idioma mais complexo ou ambíguo, desproporcional ao seu benefício potencial?
O
||=
operador hipotético faz algo fundamentalmente diferente dos outros operadores de atribuição composta. Enquanto os outros operadores são puramente matemáticos por natureza, este é diferente: ele substitui um valor por outro (no contexto que você descreveu).Dada essa ambiguidade (o operador executa duas funções diferentes, dependendo do contexto), não é difícil perceber por que não foi incluído no idioma. Embora você afirme que mudar
para
executar coalescência nula é um recurso valioso, o benefício é muito menos claro para mim. Se ocorrer substituição de valor, parece lógico (e mais claro) ter ambos os valores no lado direito do sinal de igual, para fornecer uma indicação visual de que essa substituição pode ocorrer.
O C # seguiu um caminho diferente e usa um operador específico para coalescência nula.
fonte
foo = foo || bar
exige que você digitefoo
duas vezes. Isso é complicado e também propenso a refatorar erros de digitação.||=
como um operador coalescente nulo não é intuitivo e, na verdade, parece obtuso na forma de código. Onde isso se torna útil é quando você está tentando fazer cálculos booleanos.function fulfill(inValue) { if(resolved || rejected) return false; /* Do stuff here */ return true; } resolved ||= fulfill(value)
Você está certo que
||=
é uma construção útil. Existe no Perl.De fato, o Perl disponibiliza tudo isso :
Alguns deles são ótimos (
.=
adiciona algo ao final de uma string), outros menos (&&=
acho que a variável seria configurada para o lado direito se ela e a variável forem verdadeiras. Mas por que você faria isso? ?)O que está incluído em um idioma é realmente um recurso de sua filosofia de design.
fonte
&&=
significa / faz.