Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.12.2018, 14:18
hoz hoz вне форума
Интересующийся
Отправить личное сообщение для hoz Посмотреть профиль Найти все сообщения от hoz
 
Регистрация: 26.11.2018
Сообщений: 19

Почему так странно работает постинкремент ?
Имею опыт разработки на Java. Перешёл вот несколько дней назад на JS (изучаю ещё). Читаю учебник. Читаю запоем, что бы не пропустить какие-то нюансы. На один из них я наткнулся сегодня:
Читаю здесь
Есть 2 момента:
1.
var i = 1;
var a = ++i; // (*)

alert(a); // 2

Здесь всё понятно и логично.
2.
var i = 1;
var a = i++; // (*)

alert(a); // 1

Это не логично и не понятно вообще.
Потому что есть строка:
var a = i++; // (*)

Здесь порядок исполнения операторов и соот-но кода будет следующий:
  • i++
  • a = "то что получилось в результате выполнения предыдущей операции, а это 2"
Потом у нас есть ;, который обозначает, что инструкция выполнена и появился переход к следующей инструкции. Уже должно было бы значение a измениться и стать 2. Но этого не происходит.
Хотя, в любом другом языке было бы проще. Вернётся после выполнения так сказать строки тоже самое. Разница лишь в том, что выведет переменная с пост(пре)инкрементов в момент этой операции. Но не иначе.
Кто-нить это вообще понимает мне интересно? Или это костыль?
Ответить с цитированием
  #2 (permalink)  
Старый 07.12.2018, 14:43
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

я не понимаю в чем затруднение
++ работает точно так же как и в старом добром С, откуда он и взят

i++ запоминает старое значение, инкрементирует переменную, возвращает старое значение
Ответить с цитированием
  #3 (permalink)  
Старый 07.12.2018, 15:09
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,217

Сообщение от hoz
Это не логично и не понятно вообще.
Все как раз логично и понятно...
Переменной присваивается значение другой переменной, после чего происходит постинкремент последней.
Ответить с цитированием
  #4 (permalink)  
Старый 07.12.2018, 15:10
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,217

Сообщение от Alexandroppolus
i++ запоминает старое значение
Странная формулировка... Постикремент "запоминает" уже инкрементное значение.
Ответить с цитированием
  #5 (permalink)  
Старый 07.12.2018, 15:12
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,217

Сообщение от hoz
Здесь порядок исполнения операторов и соот-но кода будет следующий:
i++
a = "то что получилось в результате выполнения предыдущей операции, а это 2"
Этот порядок исполнения только в твоей голове...
В JS же будет следующее

i=1;
a=i;
i=i+1;
alert(a+', '+i);
Ответить с цитированием
  #6 (permalink)  
Старый 07.12.2018, 15:13
hoz hoz вне форума
Интересующийся
Отправить личное сообщение для hoz Посмотреть профиль Найти все сообщения от hoz
 
Регистрация: 26.11.2018
Сообщений: 19

Сообщение от ksa Посмотреть сообщение
Все как раз логично и понятно...
Переменной присваивается значение другой переменной, после чего происходит постинкремент последней.
У "=" приоритет самый почти низкий, кроме "+" и "-". Каким боком сразу присвоится тогда?
Ответить с цитированием
  #7 (permalink)  
Старый 07.12.2018, 15:14
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,217

Сообщение от hoz
Хотя, в любом другом языке было бы проще.
Во всех ЯП постинкремент работает одинаково. Иначе нет никакой разницы с инкрементом...
Ответить с цитированием
  #8 (permalink)  
Старый 07.12.2018, 15:16
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,217

Сообщение от hoz
Каким боком сразу присвоится тогда?
Это все работает "по определению" постинкремента.

Если ты не веришь букваю... Не веришь своим глазам...
Тебя остается только пожалеть.
Ответить с цитированием
  #9 (permalink)  
Старый 07.12.2018, 15:27
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,217

Сообщение от hoz
Здесь порядок исполнения операторов и соот-но кода будет следующий:
i++
a = "то что получилось в результате выполнения предыдущей операции, а это 2"
Так еще покажу разницу инкремента и постинкремента...

var a=0;
var b=0;
alert('Инкремент '+(++a));
alert('Постинкремент '+b++);
alert('a='+a+', '+'b='+b);

Последний раз редактировалось ksa, 07.12.2018 в 15:29.
Ответить с цитированием
  #10 (permalink)  
Старый 07.12.2018, 15:37
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от ksa
покажу разницу инкремента и постинкремента
И второе тоже инкремент - первый префиксный, а второй постпрефиксный
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему не работает подключенный скрипт?? ivt22 Элементы интерфейса 1 04.01.2016 10:59
jQuery функция, не пойму почему так работает vanoha jQuery 5 15.11.2014 19:03
Почему это работает? (инклуд JS в JS) Василий Б. Общие вопросы Javascript 4 11.06.2010 12:41
jQuery не так работает на сервере dial jQuery 2 19.11.2009 15:19