var var1 = 1,
var2 = 1,
var3 = 1;
Jest to równoważne z tym:
var var1 = var2 = var3 = 1;
Jestem całkiem pewien, że jest to kolejność definiowania zmiennych: var3, var2, var1, co byłoby równoważne z tym:
var var3 = 1, var2 = var3, var1 = var2;
Czy jest jakiś sposób na potwierdzenie tego w JavaScript? Używasz jakiegoś profilera?
javascript
variables
variable-assignment
David Calhoun
źródło
źródło
this.var1 = this.var2 = this.var3 = 1
?Odpowiedzi:
Tak właściwie,
nie jest równoważne z:
Różnica polega na określaniu zakresu:
W rzeczywistości pokazuje to, że przypisanie jest właściwe asocjacyjne.
bad
Przykład odpowiada:źródło
var var1=var2
dzieje povar3 = 1
i povar2 = var3
. to jakvar3=1; var2=var3; var var1=var2
var v1, v2, v3;
Potem:v1 = v2 = v3 = 6;
będą nadal w zasięgu lokalnym. Odkąd David wspomniał o alertach, działałoby to zgodnie z oczekiwaniami (jeśli wstępnie zmieniono):alert(v1 = v2 = v3 = 6);
Przypisanie w javascript działa od prawej do lewej.
var var1 = var2 = var3 = 1;
.Jeśli wartość którejkolwiek z tych zmiennych jest następująca
1
po tej instrukcji, logicznie rzecz biorąc, musiała zacząć od prawej strony, w przeciwnym razie wartość lubvar1
ivar2
byłaby niezdefiniowana.Można go uznać za równoważny z
var var1 = (var2 = (var3 = 1));
miejscem, w którym najpierw oceniany jest wewnętrzny zestaw nawiasów.źródło
(
natychmiast povar
. Usuwanie zewnętrzny zestaw nawiasie pozwala skompilować bez błędówvar var1 = (var2 = (var3 = 1));
. W tym czasie czułem, że nie ilustruje to zbyt dobrze, ale przypuszczam, że to samo.var var1 = var2 = var3 = 1;.
równa sięvar var3 = 1; var var2 = var3; var var1 = var2;
W tym przypadku
var
słowo kluczowe dotyczy wszystkich trzech zmiennych.co nie jest równoważne z tym:
W tym przypadku
var
słowo kluczowe za ekranami ma zastosowanie tylko w przypadkuvar1
podnoszenia zmiennej, a reszta wyrażenia jest oceniana normalnie, więc zmiennevar2, var3
stają się globalneJavaScript traktuje ten kod w następującej kolejności:
źródło
(a && b)
jest logicznie(a ? b : a)
i zachowuje się jak mnożenie (np.!!a * !!b
)(a || b)
jest logiczne(a ? a : b)
i zachowuje się jak dodawanie (np.!!a + !!b
)(a = 0, b)
jest skrótem od nie dbania oa
to, czy jest prawdą, domyślnie powróćb
Pierwszeństwo operatorów JavaScript (kolejność operacji)
Zauważ, że operator przecinka jest w rzeczywistości najmniej uprzywilejowanym operatorem, ale nawiasy są najbardziej uprzywilejowane i idą w parze podczas konstruowania wyrażeń jednowierszowych.
W końcu możesz potrzebować „thunks” zamiast wartości zapisanych na stałe, a dla mnie thunk jest zarówno funkcją, jak i wartością wynikową (ta sama „rzecz”).
źródło
Spróbuj tego:
Zwróć uwagę na pojedynczy „=” w pierwszym alercie. To pokaże, że wynikiem wyrażenia przypisania jest przypisana wartość, a 2. alert pokaże, że przypisanie nastąpiło.
Logicznie wynika, że przypisanie musi być powiązane łańcuchem od prawej do lewej. Ponieważ jednak wszystko to jest atomowe w javascript (nie ma wątków), konkretny silnik może faktycznie zoptymalizować go nieco inaczej.
źródło
Jest już jasne, że nie są takie same. To znaczy sposób na kodowanie
A co powiesz na cesję? Dokładnie to samo, co var, nie pozwól, aby przypisanie let myliło cię z powodu zasięgu bloku.
Możemy wykonać następujące czynności:
Uwaga: btw, nie polecam używania wielu przypisań, nawet wielu deklaracji w tym samym wierszu.
źródło
coffee-script
można to osiągnąć za pomocą aplomb ..źródło