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)
é 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 se a
for verdade, retorne implicitamenteb
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 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').
const windowInnerHeight = () => 0.8 * window.innerHeight; // a thunk
windowInnerHeight(); // a thunk