Любопытный случай в JavaScript, когда вы получаете не совсем то, что ожидало большинство людей
function test() {
var v = 2;
var v = v++;
console.info(v);
}
test();
Почему здесь игнорируется ++
? в какой момент выполняется операция ++?
"v++ увеличивает v до 3 и возвращает 2" что первое, инкремент или возврат?
@evolutionxbox спасибо, я в курсе, но вот довольно интересно в какой момент создается новая переменная
Второй var
игнорируется.
@Пойнти совсем нет
Если бы вы использовали let
, вы бы получили синтаксическую ошибку.
@evolutionxbox, но здесь мы не используем let )
Да, второй декларация игнорируется, так как переменная v
уже была объявлена в этой области. инициализация не игнорируется, но декларация игнорируется.
var v = v++;
можно заменить на v = v++;
без изменения поведения и результата, если это поможет вам понять код. Нет "создание нового "В"".
в какой момент ++
работает тогда? потому что это имеет какой-либо эффект
v
инициализируется 2
. v++
увеличивает v
до 3
и возвращает 2
. var v = v++;
присваивает 2
v
.
Спецификация языка говорит, что сначала оценивается левая часть, а затем значение правой части присваивается левой части. Значение v++
— это исходное значение v
, поэтому v
в конечном итоге равно 2.
Я думаю, что в C и C++ такое выражение может быть явно неопределенным, поэтому среда выполнения/компиляция может делать все, что захочет. Однако в JavaScript поведение определено явно.
v
инициализируется 2
.v++
увеличивает v
до 3
, а затем возвращает 2
.var v = v++;
присваивает 2
v
(заменяет 3
в v
2
, возвращенным из v++
).console.info(v)
печатает 2
«v ++ увеличивает v до 3 и возвращает 2», что первое, увеличение или возврат?
И присваивание 2 к v
происходит после, правая часть полностью оценивается, что означает, что приращение v
к 3 происходит до присваивания.
@Pointy v++
увеличивает v
до 3
(первое) и возвращает 2
(следующее).
@jabaa да, точно
@serge Сначала приращение, затем return
. return
всегда является последним оператором в функции или операции.
@Pointy Я не был уверен, критикуете ли вы мой ответ или даете пояснения Сержу.
Я пытался сделать и то, и другое :) Вы отвечаете правильно.
ответ этого говорит: «Сначала идет присваивание, затем приращение» stackoverflow.com/a/55515365/961631
@serge Это неправильно. Сначала полностью оценивается правая часть, а затем происходит присваивание.
это действительно помогло понять stackoverflow.com/a/55515567/961631
Это называется постфиксный приращение. Он будет назначать, а затем увеличивать. С
a = 0; b = a++;
a
будет 1, аb
будет 0.