var var1 = 1,
var2 = 1,
var3 = 1;
Isso é equivalente a isso:
var var1 = var2 = var3 = 1;
Estou bastante certo de que esta é a ordem em que as variáveis são definidas: var3, var2, var1, que seria equivalente a isso:
var var3 = 1, var2 = var3, var1 = var2;
Existe alguma maneira de confirmar isso em JavaScript? Usando algum profiler possivelmente?
javascript
variables
variable-assignment
David Calhoun
fonte
fonte
this.var1 = this.var2 = this.var3 = 1
?Respostas:
Na realidade,
não é equivalente a:
A diferença está no escopo:
Na verdade, isso mostra que a atribuição é correta associativa. O
bad
exemplo é equivalente a:fonte
var var1=var2
acontece depoisvar3 = 1
e depoisvar2 = var3
. é comovar3=1; var2=var3; var var1=var2
var v1, v2, v3;
Mais tarde:v1 = v2 = v3 = 6;
eles ainda estarão no escopo local. Desde que David mencionou alertas, isso funcionaria conforme o esperado (se pré-definido):alert(v1 = v2 = v3 = 6);
A atribuição em javascript funciona da direita para a esquerda.
var var1 = var2 = var3 = 1;
.Se o valor de qualquer uma dessas variáveis estiver
1
após essa instrução, logicamente ele deve ter começado da direita, caso contrário, o valor ouvar1
evar2
seria indefinido.Você pode pensar nisso como equivalente a
var var1 = (var2 = (var3 = 1));
onde o conjunto de parênteses mais interno é avaliado primeiro.fonte
(
imediatamente depoisvar
. A remoção do conjunto externo de parênteses permite compilar sem errosvar var1 = (var2 = (var3 = 1));
,. Na época, senti que isso não ilustrava bem o ponto, mas acho que é o mesmo.var var1 = var2 = var3 = 1;.
igual avar var3 = 1; var var2 = var3; var var1 = var2;
Nesse caso, a
var
palavra-chave é aplicável a todas as três variáveis.o que não é equivalente a isso:
Nesse caso, a
var
palavra-chave por trás das telas é aplicável apenas avar1
içamento devido a variáveis e o restante da expressão é avaliado normalmente para que as variáveisvar2, var3
se tornem globaisO Javascript trata esse código nesta ordem:
fonte
(a && b)
é logicamente(a ? b : a)
e se comporta como multiplicação (por exemplo!!a * !!b
)(a || b)
é logicamente(a ? a : b)
e se comporta como adição (por exemplo!!a + !!b
)(a = 0, b)
é uma abreviação de não se importar sea
for verdade, retorne implicitamenteb
Precedência do operador JavaScript (ordem das operações)
Observe que o operador de vírgula é realmente o operador menos privilegiado, mas os parênteses são os mais privilegiados e andam de mãos dadas ao construir expressões de uma linha.
Eventualmente, você pode precisar de 'thunks' em vez de valores codificados e, para mim, um thunk é a função e o valor resultante (a mesma 'coisa').
fonte
Tente o seguinte:
Observe o único '=' no primeiro alerta. Isso mostrará que o resultado de uma expressão de atribuição é o valor atribuído, e o segundo alerta mostrará que a atribuição ocorreu.
Segue-se logicamente que a atribuição deve ter sido encadeada da direita para a esquerda. No entanto, como tudo é atômico para o javascript (não há encadeamento), um mecanismo específico pode optar por otimizá-lo de maneira um pouco diferente.
fonte
Já está claro que eles não são os mesmos. A maneira de codificar isso é
E que tal deixar a atribuição? Exatamente o mesmo que var, não deixe a atribuição let confundir você por causa do escopo do bloco.
Poderíamos fazer o seguinte:
Nota: btw, eu não recomendo usar várias atribuições, nem mesmo várias declarações na mesma linha.
fonte
coffee-script
pode fazer isso com calma ..fonte