Помогите разобраться с инкрементами и присваиванием.. JS
Помогите разобраться пожалуйста. Есть код:
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. Верно?
Ответы (1 шт):
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;
Код в данном случае необходимо читать справа налево. Т.е.:
Присваиваем переменной
counterеё же значение и+2. (counter = counter + 2)
Тут стоит отметить, что+=и=+стоит читать иначе чем инкремент.+=— это присвоение с сложением, эквивалент выше в скобках. А вот=+— это оксюморон и расшифровывается какcounter = +counter, где+counterне является сложением, а приведением к числовому типу. Подробнее здесь.Присваиваем переменной
aзначениеcounter, посчитанное на шаге 1.
Иначе говоря, выражение можно переписать как:
let counter = 1;
let counter = counter + 2;
let a = counter;