var var1 = 1,
var2 = 1,
var3 = 1;
Это эквивалентно этому:
var var1 = var2 = var3 = 1;
Я вполне уверен, что это порядок, в котором определены переменные: var3, var2, var1, что будет эквивалентно следующему:
var var3 = 1, var2 = var3, var1 = var2;
Есть ли способ подтвердить это в JavaScript? Возможно, вы используете какой-нибудь профилировщик?
javascript
variables
variable-assignment
Дэвид Кэлхун
источник
источник
this.var1 = this.var2 = this.var3 = 1
?Ответы:
Фактически,
это не эквивалентно:
Разница в определении объема:
На самом деле это показывает, что назначение правильно ассоциативно.
bad
Пример эквивалентен:источник
var var1=var2
бывает послеvar3 = 1
и послеvar2 = var3
. это какvar3=1; var2=var3; var var1=var2
var v1, v2, v3;
потом, позже:v1 = v2 = v3 = 6;
они все еще будут в местном масштабе. Так как Дэвид упомянул оповещения, это будет работать так, как ожидалось (если предварительная версия):alert(v1 = v2 = v3 = 6);
Назначение в JavaScript работает справа налево.
var var1 = var2 = var3 = 1;
,Если значение любого из этих переменных
1
после этого заявления, то логически должны начать с правой стороны , в противном случае значения илиvar1
иvar2
будет неопределенное.Вы можете думать об этом как эквивалент
var var1 = (var2 = (var3 = 1));
где сначала оценивается самый внутренний набор скобок.источник
(
сразу послеvar
. Удаление внешнего набора скобок позволяет его компилировать без ошибокvar var1 = (var2 = (var3 = 1));
. В то время я чувствовал, что это не вполне иллюстрирует ситуацию, но я полагаю, это то же самое.var var1 = var2 = var3 = 1;.
равноvar var3 = 1; var var2 = var3; var var1 = var2;
В этом случае
var
ключевое слово применимо ко всем трем переменным.что не эквивалентно этому:
В этом случае
var
ключевое слово « позади экрана» применимо только к тому, что происходитvar1
из-за подъема переменных, а остальная часть выражения оценивается нормально, поэтому переменныеvar2, var3
становятся глобальными.Javascript обрабатывает этот код в следующем порядке:
источник
(a && b)
логически(a ? b : a)
и ведет себя как умножение (например.!!a * !!b
)(a || b)
логично(a ? a : b)
и ведет себя как сложение (например.!!a + !!b
)(a = 0, b)
это сокращение от "не заботиться", еслиa
это правда, неявно вернутьb
Приоритет оператора JavaScript (порядок операций)
Обратите внимание, что оператор запятой на самом деле является оператором с наименьшими привилегиями, но круглые скобки являются самыми привилегированными, и они идут рука об руку при построении однострочных выражений.
В конце концов, вам могут понадобиться «thunks», а не жестко закодированные значения, и для меня thunk - это и функция, и результирующее значение (одно и то же «вещь»).
источник
Попробуй это:
Обратите внимание на единственное «=» в первом предупреждении. Это покажет, что результатом выражения присваивания является присвоенное значение, а во 2-м предупреждении будет показано, что назначение произошло.
Логично следует, что назначение должно быть связано справа налево. Однако, поскольку это все атомарно для javascript (нет многопоточности), конкретный движок может по-настоящему оптимизировать его немного по-другому.
источник
К настоящему времени ясно, что они не одинаковы. Способ кодирования это
А как насчет пусть назначения? Точно так же, как var, не позволяйте заданию let сбить вас с толку из-за объема блока.
Мы могли бы сделать следующее:
Примечание: кстати, я не рекомендую использовать несколько назначений, даже не несколько объявлений в одной строке.
источник
coffee-script
может сделать это с апломбом ..источник