HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Из языка Си в JavaScript перекочевали две операции:<strong>инкремент</strong>++ и<strong>декремент</strong>--, которые очень часто встречаются вместе с циклами. Эти унарные операции увеличивают и уменьшают на единицу число, записанное в переменную:</p>
1 <p>Из языка Си в JavaScript перекочевали две операции:<strong>инкремент</strong>++ и<strong>декремент</strong>--, которые очень часто встречаются вместе с циклами. Эти унарные операции увеличивают и уменьшают на единицу число, записанное в переменную:</p>
2 <p>Кроме постфиксной формы, у них есть и префиксная:</p>
2 <p>Кроме постфиксной формы, у них есть и префиксная:</p>
3 <p>Кажется, что нет никакой разницы между постфиксной и префиксной формами. Но тут начинаются сложности.</p>
3 <p>Кажется, что нет никакой разницы между постфиксной и префиксной формами. Но тут начинаются сложности.</p>
4 <p>В отличие от всех остальных операций, которые не имеют побочных эффектов и просто возвращают новое значение, инкремент и декремент не только возвращают значение, но и<strong>изменяют</strong>значение переменной.</p>
4 <p>В отличие от всех остальных операций, которые не имеют побочных эффектов и просто возвращают новое значение, инкремент и декремент не только возвращают значение, но и<strong>изменяют</strong>значение переменной.</p>
5 <p>При использовании префиксной нотации сначала происходит изменение переменной, а потом возврат. При использовании постфиксной нотации - наоборот: можно считать, что сначала происходит возврат, а потом изменение переменной. Правило работает одинаково для инкремента и декремента. Для простоты рассмотрим только инкремент:</p>
5 <p>При использовании префиксной нотации сначала происходит изменение переменной, а потом возврат. При использовании постфиксной нотации - наоборот: можно считать, что сначала происходит возврат, а потом изменение переменной. Правило работает одинаково для инкремента и декремента. Для простоты рассмотрим только инкремент:</p>
6 <p>Что происходит?</p>
6 <p>Что происходит?</p>
7 <ol><li>Вывели на экран ++x. Это префиксный инкремент, поэтому сначала значение переменной увеличилось на 1, потом результат вернулся и вывелся на экран.</li>
7 <ol><li>Вывели на экран ++x. Это префиксный инкремент, поэтому сначала значение переменной увеличилось на 1, потом результат вернулся и вывелся на экран.</li>
8 <li>Так как значение изменилось, console.log(x) вывел 6.</li>
8 <li>Так как значение изменилось, console.log(x) вывел 6.</li>
9 <li>Теперь выводим на экран x++. Это постфиксный инкремент, поэтому возвращено значение, содержавшееся в переменной до ее увеличения на 1.</li>
9 <li>Теперь выводим на экран x++. Это постфиксный инкремент, поэтому возвращено значение, содержавшееся в переменной до ее увеличения на 1.</li>
10 <li>Так как значение изменилось, console.log(x) вывел 7.</li>
10 <li>Так как значение изменилось, console.log(x) вывел 7.</li>
11 </ol><p>Особенно страшным это становится тогда, когда инкремент вставляют внутрь других операций: x = i++ - 7 + --h. Понять такой код почти невозможно, и его написание должно рассматриваться как тяжкое преступление.</p>
11 </ol><p>Особенно страшным это становится тогда, когда инкремент вставляют внутрь других операций: x = i++ - 7 + --h. Понять такой код почти невозможно, и его написание должно рассматриваться как тяжкое преступление.</p>
12 <p>Например, в языке JavaScript линтер (программа, проверяющая код) сразу начинает ругаться, когда встречает использование инкремента или декремента.</p>
12 <p>Например, в языке JavaScript линтер (программа, проверяющая код) сразу начинает ругаться, когда встречает использование инкремента или декремента.</p>
13 <p>Рекомендации по использованию:</p>
13 <p>Рекомендации по использованию:</p>
14 <ul><li>Никогда не мешайте в рамках одного выражения операции/функции без побочных эффектов с операциями/функциями, обладающими побочными эффектами.</li>
14 <ul><li>Никогда не мешайте в рамках одного выражения операции/функции без побочных эффектов с операциями/функциями, обладающими побочными эффектами.</li>
15 <li>Используйте инкремент и декремент только там, где нет разницы между префиксным и постфиксным вариантом: отдельно от всего, на своей собственной строчке кода.</li>
15 <li>Используйте инкремент и декремент только там, где нет разницы между префиксным и постфиксным вариантом: отдельно от всего, на своей собственной строчке кода.</li>
16 </ul>
16 </ul>