Wielokrotne przypisywanie lewej ręki za pomocą JavaScript

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

Jest to równoważne:

var var1 = var2 = var3 = 1;

Jestem prawie pewien, że jest to kolejność zdefiniowanych zmiennych: var3, var2, var1, co byłoby równoważne:

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

Czy jest jakiś sposób, aby to potwierdzić w JavaScript? Może używasz jakiegoś profilera?

Author: David Calhoun, 2009-11-18

6 answers

Właściwie,

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

Jest Nie równoważne:

var var1 = var2 = var3 = 1;

Różnica polega na przeznaczeniu:

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!

Właściwie to pokazuje, że przypisanie jest właściwe asocjacyjne. Przykład bad jest równoważny:

var var1 = (window.var2 = (window.var3 = 1));
 345
Author: Crescent Fresh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-30 09:44:01

Przypisanie w javascript działa od prawej do lewej. var var1 = var2 = var3 = 1;.

Jeśli wartość którejkolwiek z tych zmiennych jest 1 po tej instrukcji, to logicznie musi zaczynać się od prawej, w przeciwnym razie wartość or var1 i var2 będzie niezdefiniowana.

Można to uznać za odpowiednik var var1 = (var2 = (var3 = 1));, gdzie pierwszy jest oceniany najbardziej wewnętrzny zbiór nawiasów.

 15
Author: Justin Johnson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-03 15:20:13

Var var1 = 1, var2 = 1, var3 = 1;

W tym przypadku słowo kluczowe var ma zastosowanie do wszystkich trzech zmiennych.

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

Co nie jest równoważne z tym:

Var var1 = var2 = var3 = 1;

W tym przypadku za ekranami var Słowo kluczowe ma zastosowanie tylko do var1 ze względu na podnoszenie zmiennej i reszta wyrażenia jest oceniana normalnie, więc zmienne var2, var3 stają się globalami

JavaScript treats ten kod w tej kolejności:

/*
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; 
 7
Author: Gangadhar Jannu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-14 09:47:09
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) jest skrótem od (a ? b : a)

(a || b) jest skrótem od (a ? a : b)

(a = 0, b) jest skrótem od nie dbania o to, czy a jest prawdziwe, w domyśle 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

Pierwszeństwo operatora JavaScript (kolejność operacji)

Zauważ, że operator przecinka jest w rzeczywistości operatorem najmniej uprzywilejowanym, ale nawiasy są najbardziej uprzywilejowane i idą w parze podczas konstruowania wyrażeń jednoliniowych.


W końcu możesz potrzebujesz "thunks" zamiast zakodowanych na twardo prymitywnych wartości, a ja zdecydowanie potknąłem się przez przypadkowe podanie wielu paramów, zamiast biegać przez dwa wyrażenia.

Dla mnie thunk jest zarówno funkcją, jak i wartością wynikową (tą samą 'rzeczą').

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

windowInnerHeight(); // a thunk
 7
Author: neaumusic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-01 08:02:04

Spróbuj tego:

var var1=42;
var var2;

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

Zwróć uwagę na pojedynczy ' = ' w pierwszym alercie. Spowoduje to pokazanie, że wynikiem wyrażenia przypisania jest przypisana wartość, a drugi alert pokaże, że przypisanie miało miejsce.

Logicznie wynika, że przypisanie musi mieć łańcuch od prawej do lewej. Jednak, ponieważ to wszystko jest atomowe dla javascript (nie ma wątków) konkretny silnik może wybrać, aby faktycznie zoptymalizować go trochę inaczej.

 4
Author: Joel Coehoorn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-18 20:15:24

coffee-script może to osiągnąć za pomocą aplomb..

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

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

 -2
Author: Alex Gray,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-15 04:43:29