Múltipla atribuição à esquerda com JavaScript

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 variables ​​são definidas: var3, var2, var1, que seria equivalente a isto:

 var var3 = 1, var2 = var3, var1 = var2; 

Existe alguma maneira de confirmar isso em JavaScript? Usando algum perfilador possivelmente?

Na realidade,

 var var1 = 1, var2 = 1, var3 = 1; 

não é equivalente a:

 var var1 = var2 = var3 = 1; 

A diferença está no escopo:

 function good() { var var1 = 1, var2 = 1, var3 = 1; } function bad() { var var1 = var2 = var3 = 1; } good(); console.log(window.var2); // undefined bad(); console.log(window.var2); // 1. Aggh! 

Atribuição em javascript funciona da direita para a esquerda. var var1 = var2 = var3 = 1; .

Se o valor de qualquer uma dessas variables ​​for 1 após essa instrução, então, logicamente, ela deve ter iniciado a partir da direita, caso contrário, o valor ou var1 e var2 seriam indefinidos.

Você pode pensar nisso como equivalente a var var1 = (var2 = (var3 = 1)); onde o conjunto de parênteses mais interno é avaliado primeiro.

var var1 = 1, var2 = 1, var3 = 1;

Neste caso, a palavra-chave var é aplicável a todas as três variables.

 var var1 = 1, var2 = 1, var3 = 1; 

o que não é equivalente a isto:

var var1 = var2 = var3 = 1;

Neste caso, por trás das canvass, var palavra-chave é aplicável apenas a var1 devido à elevação da variável e o restante da expressão é avaliado normalmente, portanto, as variables var2, var3 estão se tornando globais

Javascript trata este código nesta ordem:

 /* var 1 is local to the particular scope because of var keyword var2 and var3 will become globals because they've used without var keyword */ var var1; //only variable declarations will be hoisted. var1= var2= var3 = 1; 
 a = (b = 'string is truthy'); // b gets string; a gets b, which is a primitive (copy) a = (b = { c: 'yes' }); // they point to the same object; a === b (not a copy) 

(a && b) é curto para (a ? b : a)

(a || b) é a abreviação de (a ? a : b)

(a = 0, b) é a abreviação de não se importar se a for truthy, implicitamente return b


 a = (b = 0) && "nope, but a is 0 and b is 0"; // b is falsey + order of operations a = (b = "b is this string") && "a gets this string"; // b is truthy + order of ops 

Precedência do operador JavaScript (ordem de operações)

Observe que o operador vírgula é, na verdade, o operador com menos privilégios, 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’ ao invés de valores primitivos embutidos no código, e eu definitivamente fiquei tropeçando passando acidentalmente múltiplos parâmetros, ao invés de correr através de duas expressões.

Para mim, um thunk é tanto a function quanto o valor resultante (a mesma coisa).

 const windowInnerHeight = () => 0.8 * window.innerHeight; // a thunk windowInnerHeight(); // a thunk 

Tente isto:

 var var1=42; var var2; alert(var2 = var1); //show result of assignment expression is assigned value alert(var2); // show assignment did occur. 

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 logicamente que a atribuição deve ser encadeada da direita para a esquerda. No entanto, como tudo isso é atômico ao javascript (não há segmentação), um determinado mecanismo pode optar por otimizá-lo de maneira um pouco diferente.

coffee-script pode realizar isso com desenvoltura ..

 for x in [ 'a', 'b', 'c' ] then "#{x}" : true 

[ { a: true }, { b: true }, { c: true } ]

    Intereting Posts