16.02.2018, 10:03
|
Новичок на форуме
|
|
Регистрация: 27.03.2017
Сообщений: 9
|
|
Переприсвоение переменной
Доброго,
Встречается такой код:
function foo(arg1) {
arg1 = arg1 || 'что-то опциональное';
...
}
Все работает отлично, но вопрос. Будет ли такое переприсвоение иметь негативные последствия, допустим, утечки памяти? Вообще, будет ли заново выделяться память под ту же самую переменную? Или все зашибись, не надо париться?
Спасибо.
|
|
16.02.2018, 10:09
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,228
|
|
Сообщение от Михаил Хе
|
Или все зашибись, не надо париться?
|
Все зашибись.
|
|
16.02.2018, 10:10
|
Профессор
|
|
Регистрация: 27.11.2015
Сообщений: 2,899
|
|
Михаил Хе,
А вот такая ситуация вас не волнует?
for (var i = 0; i < 1000; i++) { ... }
Счетчику переприсваивается значение
Переприсвоение ничем не отличается от обычного присвоения - значение присваивается одной и той же переменной
|
|
16.02.2018, 11:09
|
Новичок на форуме
|
|
Регистрация: 27.03.2017
Сообщений: 9
|
|
Сообщение от Dilettante_Pro
|
Михаил Хе,
А вот такая ситуация вас не волнует?
for (var i = 0; i < 1000; i++) { ... }
|
спасибо, но тут другое. Тут новое значение другое и оно логически другое и должно меняться.
Меня насторожило, что именно происходит при переприсвоении переменной обратно на себя, может ли движок правильно "ничего не сделать, не париться попусту".
|
|
16.02.2018, 11:13
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,228
|
|
Сообщение от Михаил Хе
|
но тут другое
|
Отнюдь!
Все это "одно и то же дело". Вот тебе еще одно...
var s=0;
var val=10;
s=s+val;
И такого сплошь и рядом!
Если бы твои опасения были не напрасны - в мире JS наступил бы крах!
|
|
16.02.2018, 11:17
|
Профессор
|
|
Регистрация: 27.11.2015
Сообщений: 2,899
|
|
Михаил Хе,
Сообщение от Михаил Хе
|
спасибо, но тут другое и должно меняться
|
чем i = i + 1 логически другое по сравнению с arg1 = arg1 || 'что-то опциональное' ?
Кому и что оно должно?
|
|
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.
|
|
16.02.2018, 12:29
|
Профессор
|
|
Регистрация: 27.11.2015
Сообщений: 2,899
|
|
Михаил Хе,
Сообщение от Михаил Хе
|
движок не должен ничего делать
|
Он делает то, что написано в операторе - берет значение переменной var1 и присваивает его переменной var1.
|
|
16.02.2018, 12:37
|
Профессор
|
|
Регистрация: 27.11.2015
Сообщений: 2,899
|
|
Кстати, в вашем начальном примере возможно даже изменение типа переменной
function foo(arg1) {
arg1 = arg1 || 'что-то опциональное';
alert(arg1);
}
foo(0);
foo(1);
foo('что-то');
Последний раз редактировалось Dilettante_Pro, 16.02.2018 в 12:48.
|
|
16.02.2018, 12:54
|
|
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
Сообщение от Михаил Хе
|
arg1 = arg1 || 'что-то опциональное';
Вообще, будет ли заново выделяться память под ту же самую переменную?
|
память выделится в случае, если arg1 пустое значение и надо создать строку. Вот под строку и выделится (хотя под капотом тут все не так просто, например, эта строка может создаться только один раз и использоваться многократно, поскольку неизменяема).
Если arg1 не пустое, до операции со строкой дело не дойдет, остается arg1 = arg1.
здесь память тоже не выделяется, она уже выделена на стеке, arg1 обычная стековая переменная, просто записываются данные в ячейку памяти.
|
|
|
|