Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Почему меняется значение переменной (https://javascript.ru/forum/misc/21376-pochemu-menyaetsya-znachenie-peremennojj.html)

Ichigeki 07.09.2011 00:57

Почему меняется значение переменной
 
есть переменная lmp типа Date. В ней записана дата 1 сентября 2011. Делаю так

alert(lmp); //выводит 1 сентября 2011
incrementedDate = lmp;
incrementedDate.setDate(incrementedDate.getDate() + (lenOfCycle - 17) );
alert(lmp); // выводит 5 сентября 2011, т.е. значение incrementedDate


Почему значение lmp меняется???? Убейте, но не пойму!!!

Sweet 07.09.2011 01:09

Потому что lmp и incrementedDate ссылаются на один и тот же объект. И он изменяется.

Ichigeki 07.09.2011 01:29

а я думал, что lmp просто копируется в incrementedDate..

В чем же тогда смысл переменных, если простое присваивание приводит к такому результату? И вообще, не знал, что в JS есть ссылки :) Удивлен :)

popov654 07.09.2011 01:49

В JS вообще везде ссылки... ужас :)

ваый 07.09.2011 11:21

Цитата:

Сообщение от popov654
В JS вообще везде ссылки... ужас

Неправда. Но все объекты передаются по ссылке. Если надо по значению, надо клонировать.

Kolyaj 07.09.2011 11:28

Цитата:

Сообщение от ваый
Но все объекты передаются по ссылке.

Неправда. Ссылка на объект передаётся по значению, а не объект передаётся по ссылке.

Ichigeki 07.09.2011 19:09

Цитата:

Сообщение от ваый (Сообщение 125307)
Неправда. Но все объекты передаются по ссылке. Если надо по значению, надо клонировать.

а как клонировать? :)

ваый 07.09.2011 19:20

Я использую эту функцию, когда надо создать клон объекта.
function clone(obj) {
    if (obj == null || typeof(obj) != 'object') {
        return obj;
    }

    var temp = obj.constructor();

    for (var key in obj) {
        temp[key] = clone(obj[key]);
    }

    return temp;
}
Тогда
incrementedDate = clone(lmp);

popov654 07.09.2011 19:39

Цитата:

Но все объекты передаются по ссылке.
Секундочку. Надеюсь, это не распространяется на примитивные типы данных?

Kolyaj 07.09.2011 21:49

Цитата:

Сообщение от popov654
Надеюсь, это не распространяется на примитивные типы данных?

А примитивный тип данных это объект?


Часовой пояс GMT +3, время: 04:56.