Почему несвязанная переменная влияет на другую переменную?moment.js - PullRequest
0 голосов
/ 20 января 2019

У меня есть этот код.start - это 30 м до end.Когда я вычитаю еще 5 м, это влияет и на end:

let start = moment().subtract(30,"m");
let end = moment();

console.log(start);  // 11:00
console.log(end); // 11:30

start = end.subtract(35,"m");

console.log(start); // 10:55
console.log(end); // 10:55

Я понимаю, почему это происходит - потому что метод subtract () изменяет переменную, для которой вызывается.Поэтому я использовал другую переменную new_time, чтобы попытаться остановить воздействие на end:

let start = moment().subtract(30,"m");
let end = moment();

console.log(start); // 11:00
console.log(end); // 11:30

let new_time = end;
start = new_time.subtract(35,"m");

console.log(start); // 10:55
console.log(end); // 10:55

Но на end все еще влияют!Зачем?!Как я могу заставить мой код работать ...

Пример кода здесь https://codepen.io/anon/pen/BvXGEW

Редактировать: Я только что прочитал о моменте клонирования , который я могу использоватьчтобы решить мою проблему, но я все еще не понимаю, как назначение совершенно другой переменной может повлиять на исходную переменную ...

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Методы, подобные subtract, действуют не на переменные, а на объекты. Переменные просто для ссылки / доступа к тем объектам, которые живут в памяти.

Запись new_time = end просто означает, что объект, доступный end, теперь доступен и new_time. Поэтому любые изменения в объекте, на который ссылается end, одинаково видны при взгляде на new_time.

Если вы хотите, чтобы они были независимыми, вы действительно должны клонировать end, прежде чем вносить в него какие-либо изменения.

0 голосов
/ 20 января 2019

Строка

let new_time = end;

копирует ссылку на объект end в new_time.Таким образом, обе переменные ссылаются на один и тот же объект.Существует только один объект и две переменные, ссылающиеся на него.

Решение:

let new_time = moment(end);

, которое создает другой моментный объект и присваивает его переменной new_time.Теперь у вас есть 2 разных объекта.

...