Javascript.RU

Голосование: var1 = var1; // переприсвоение
Открытый опрос: другие пользователи будут видеть, кто как проголосовал.
Опции опроса
var1 = var1; // переприсвоение

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.02.2018, 10:03
Новичок на форуме
Отправить личное сообщение для Михаил Хе Посмотреть профиль Найти все сообщения от Михаил Хе
 
Регистрация: 27.03.2017
Сообщений: 9

Переприсвоение переменной
Доброго,

Встречается такой код:

function foo(arg1) {
  arg1 = arg1 || 'что-то опциональное';
  ...
}


Все работает отлично, но вопрос. Будет ли такое переприсвоение иметь негативные последствия, допустим, утечки памяти? Вообще, будет ли заново выделяться память под ту же самую переменную? Или все зашибись, не надо париться?

Спасибо.
Ответить с цитированием
  #2 (permalink)  
Старый 16.02.2018, 10:09
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,215

Сообщение от Михаил Хе
Или все зашибись, не надо париться?
Все зашибись.
Ответить с цитированием
  #3 (permalink)  
Старый 16.02.2018, 10:10
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

Михаил Хе,
А вот такая ситуация вас не волнует?
for (var i = 0; i < 1000; i++) { ... }

Счетчику переприсваивается значение

Переприсвоение ничем не отличается от обычного присвоения - значение присваивается одной и той же переменной
Ответить с цитированием
  #4 (permalink)  
Старый 16.02.2018, 11:09
Новичок на форуме
Отправить личное сообщение для Михаил Хе Посмотреть профиль Найти все сообщения от Михаил Хе
 
Регистрация: 27.03.2017
Сообщений: 9

Сообщение от Dilettante_Pro Посмотреть сообщение
Михаил Хе,
А вот такая ситуация вас не волнует?
for (var i = 0; i < 1000; i++) { ... }
спасибо, но тут другое. Тут новое значение другое и оно логически другое и должно меняться.

Меня насторожило, что именно происходит при переприсвоении переменной обратно на себя, может ли движок правильно "ничего не сделать, не париться попусту".
Ответить с цитированием
  #5 (permalink)  
Старый 16.02.2018, 11:13
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,215

Сообщение от Михаил Хе
но тут другое
Отнюдь!
Все это "одно и то же дело". Вот тебе еще одно...

var s=0;
var val=10;
s=s+val;

И такого сплошь и рядом!
Если бы твои опасения были не напрасны - в мире JS наступил бы крах!
Ответить с цитированием
  #6 (permalink)  
Старый 16.02.2018, 11:17
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

Михаил Хе,
Сообщение от Михаил Хе
спасибо, но тут другое и должно меняться
чем i = i + 1 логически другое по сравнению с arg1 = arg1 || 'что-то опциональное' ?
Кому и что оно должно?
Ответить с цитированием
  #7 (permalink)  
Старый 16.02.2018, 12:25
Новичок на форуме
Отправить личное сообщение для Михаил Хе Посмотреть профиль Найти все сообщения от Михаил Хе
 
Регистрация: 27.03.2017
Сообщений: 9

Давайте без эмоций, я понимаю, что дело плевое и вроде как проблем нет, но мой пример кардинально отличается от этого:

var s=0;
var val=10;
s=s+val;


и от этого
i = i + 1;


В этих двух примерах движок JS реально делает действия по изменению состояния переменных.

В логическом случае с
var1 = var1;


движок не должен ничего делать. Я правильно разъяснил?

Давайте вникать.

Последний раз редактировалось Михаил Хе, 16.02.2018 в 12:28.
Ответить с цитированием
  #8 (permalink)  
Старый 16.02.2018, 12:29
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

Михаил Хе,
Сообщение от Михаил Хе
движок не должен ничего делать
Он делает то, что написано в операторе - берет значение переменной var1 и присваивает его переменной var1.
Ответить с цитированием
  #9 (permalink)  
Старый 16.02.2018, 12:37
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

Кстати, в вашем начальном примере возможно даже изменение типа переменной
function foo(arg1) {
  arg1 = arg1 || 'что-то опциональное';
  alert(arg1);
}
foo(0);
foo(1);
foo('что-то');

Последний раз редактировалось Dilettante_Pro, 16.02.2018 в 12:48.
Ответить с цитированием
  #10 (permalink)  
Старый 16.02.2018, 12:54
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Сообщение от Михаил Хе
arg1 = arg1 || 'что-то опциональное';

Вообще, будет ли заново выделяться память под ту же самую переменную?
память выделится в случае, если arg1 пустое значение и надо создать строку. Вот под строку и выделится (хотя под капотом тут все не так просто, например, эта строка может создаться только один раз и использоваться многократно, поскольку неизменяема).

Если arg1 не пустое, до операции со строкой дело не дойдет, остается arg1 = arg1.
здесь память тоже не выделяется, она уже выделена на стеке, arg1 обычная стековая переменная, просто записываются данные в ячейку памяти.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вернуть имя переменной Йакуд Общие вопросы Javascript 21 18.05.2014 10:10
посылка переменной kent0026 jQuery 5 04.01.2014 17:34
Как значение переменной вставить в имя переменной? jsgogo Общие вопросы Javascript 3 02.06.2013 12:11
Передать значение этой переменной скрипту пхп не обновляя страницы jei Общие вопросы Javascript 10 01.03.2013 18:14
Создание переменной по значению другой переменной bahek2462774 Общие вопросы Javascript 2 09.10.2011 10:11