Помогите разобраться с инкрементами и присваиванием.. JS

Рейтинг: 1Ответов: 1Опубликовано: 17.05.2023

Помогите разобраться пожалуйста. Есть код:

let counter = 1;
let a = counter++;
alert(a); //1
alert(a); //1

Однако если сделать

let counter = 1;
let a = counter++;
alert(counter++); //2
alert(counter++); //3

Хотя по сути код один и тот же. Почему разные результаты?

Я приведу немного другой пример:

let counter = 1;
let a = counter += 2;
//counter у нас стал 3 и запомнился
alert(a); //3 counter не изменился
alert(a); //3 counter не изменился
alert(counter); //3

let counter = 1;
let a = counter += 2;
//counter у нас стал 3 и запомнился
alert(counter += 2); //counter стал 5 и запомнился
alert(counter += 2); //counter стал 7 и запомнился
alert(counter); //7

То есть, если я правильно понимаю, если в коде явно не прописать само название переменной (например counter += 2), то ее использование в других переменных будет использовать последнее явно записанное состояние. В данном примере хоть а = counter += 2, то инкремент а не оказывает влияния на сам counter. Верно?

Ответы

▲ 0

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Increment

Надо понимать, что инкремент, это не просто математическая операция, это в том числе и присвоение переменной. Иначе говоря, нет необходимости писать counter = counter++, counter++ будет равнозначно counter = counter + 1.

Поиграйтесь с ++ до переменной и после. Если ставить после, то сначала возвращается значение переменной, а потом происходит инкремент. Поэтому у вас переменная a остаётся единицей, сам же counter будет равен 2, если вывести его в консоль в первом примере.

Во втором примере всё то же самое. У вас a будет равно единице, т.к. присваивается изначальное значение counter, а потом уже идёт инкремент. В первом alert он уже равен двум и инкрементируется, во втором трём, и опять же инкрементируется. В результате если вывести alert(counter) после всего, он будет равен 4.

Если же ++ ставить до переменной, то в a = ++counter в переменную a пойдёт результат инкремента.


По дополнению в вопросе, у вас нет инкремента a.

let a = counter += 2;

Код в данном случае необходимо читать справа налево. Т.е.:

  1. Присваиваем переменной counter её же значение и +2. (counter = counter + 2)
    Тут стоит отметить, что += и =+ стоит читать иначе чем инкремент. += — это присвоение с сложением, эквивалент выше в скобках. А вот =+ — это оксюморон и расшифровывается как counter = +counter, где +counter не является сложением, а приведением к числовому типу. Подробнее здесь.

  2. Присваиваем переменной a значение counter, посчитанное на шаге 1.

Иначе говоря, выражение можно переписать как:

let counter = 1;
let counter = counter + 2;
let a = counter;