Любопытный двойной случай var в javascript

Любопытный случай в JavaScript, когда вы получаете не совсем то, что ожидало большинство людей

function test() {
  var v = 2;
  var v = v++;
  console.info(v);
}
test();

Почему здесь игнорируется ++? в какой момент выполняется операция ++?

"v++ увеличивает v до 3 и возвращает 2" что первое, инкремент или возврат?

  • если он увеличивается первым, возвращаемое значение должно быть "3"
  • если он сначала возвращает 2, то после этого увеличивается, поэтому увеличенное значение равно 2, а v должно быть 3...

Это называется постфиксный приращение. Он будет назначать, а затем увеличивать. С a = 0; b = a++;a будет 1, а b будет 0.

evolutionxbox 05.05.2022 16:54

@evolutionxbox спасибо, я в курсе, но вот довольно интересно в какой момент создается новая переменная

serge 05.05.2022 16:55

Второй var игнорируется.

Pointy 05.05.2022 16:55

@Пойнти совсем нет

serge 05.05.2022 16:56

Если бы вы использовали let, вы бы получили синтаксическую ошибку.

evolutionxbox 05.05.2022 16:56

@evolutionxbox, но здесь мы не используем let )

serge 05.05.2022 16:56

Да, второй декларация игнорируется, так как переменная v уже была объявлена ​​в этой области. инициализация не игнорируется, но декларация игнорируется.

Pointy 05.05.2022 16:56
var v = v++; можно заменить на v = v++; без изменения поведения и результата, если это поможет вам понять код. Нет "создание нового "В"".
jabaa 05.05.2022 16:57

в какой момент ++ работает тогда? потому что это имеет какой-либо эффект

serge 05.05.2022 16:59
v инициализируется 2. v++ увеличивает v до 3 и возвращает 2. var v = v++; присваивает 2v.
jabaa 05.05.2022 17:00

Спецификация языка говорит, что сначала оценивается левая часть, а затем значение правой части присваивается левой части. Значение v++ — это исходное значение v, поэтому v в конечном итоге равно 2.

Pointy 05.05.2022 17:00

Я думаю, что в C и C++ такое выражение может быть явно неопределенным, поэтому среда выполнения/компиляция может делать все, что захочет. Однако в JavaScript поведение определено явно.

Pointy 05.05.2022 17:01
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
12
45
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  • v инициализируется 2.
  • Выражение v++ увеличивает v до 3, а затем возвращает 2.
  • Оператор var v = v++; присваивает 2v (заменяет 3 в v2, возвращенным из v++).
  • console.info(v) печатает 2

«v ++ увеличивает v до 3 и возвращает 2», что первое, увеличение или возврат?

serge 05.05.2022 17:02

И присваивание 2 к v происходит после, правая часть полностью оценивается, что означает, что приращение v к 3 происходит до присваивания.

Pointy 05.05.2022 17:02

@Pointy v++ увеличивает v до 3 (первое) и возвращает 2 (следующее).

jabaa 05.05.2022 17:03

@jabaa да, точно

Pointy 05.05.2022 17:03

@serge Сначала приращение, затем return. return всегда является последним оператором в функции или операции.

jabaa 05.05.2022 17:03

@Pointy Я не был уверен, критикуете ли вы мой ответ или даете пояснения Сержу.

jabaa 05.05.2022 17:04

Я пытался сделать и то, и другое :) Вы отвечаете правильно.

Pointy 05.05.2022 17:05

ответ этого говорит: «Сначала идет присваивание, затем приращение» stackoverflow.com/a/55515365/961631

serge 05.05.2022 17:08

@serge Это неправильно. Сначала полностью оценивается правая часть, а затем происходит присваивание.

jabaa 05.05.2022 17:09

это действительно помогло понять stackoverflow.com/a/55515567/961631

serge 05.05.2022 17:10

Другие вопросы по теме