Почему моя переменная объекта данных изменяется, когда я не переназначаю ей манипулируемые значения? - PullRequest
1 голос
/ 03 мая 2019

Я клонирую переменную для манипуляции в одной из моих функций, и я НЕ переназначаю ее обратно.Почему второй console.log() печатает нижеприведенное?

img1

Вот код:

console.log('BEFORE -> ', JSON.parse(JSON.stringify(vm.referenceMatrix)));

var referenceId = null;

var referenceMatrix = vm.referenceMatrix;

for (var i = 0; i < length; i++) {
    referenceId = references[i].article_reference_id;

    referenceMatrix[referenceId] = i + 1;
}

console.log('AFTER -> ', JSON.parse(JSON.stringify(vm.referenceMatrix)));

//vm.referenceMatrix = referenceMatrix;

Как вы можете видеть, vm.referenceMatrix = referenceMatrix; закомментировано, так как это возможно?

Редактировать:

Этот код генерирует тот же вывод, что и на изображении выше:

console.log('BEFORE -> ', JSON.parse(JSON.stringify(vm.referenceMatrix)));

var referenceId = null;

var referenceMatrixs = vm.referenceMatrix;

for (var i = 0; i < length; i++) {
    referenceId = references[i].article_reference_id;

    referenceMatrixs[referenceId] = i + 1;
}

console.log('AFTER -> ', JSON.parse(JSON.stringify(vm.referenceMatrix)));

//vm.referenceMatrix = referenceMatrix;

Ответы [ 2 ]

3 голосов
/ 03 мая 2019

Возможно, вы пришли с другого языка, но в JavaScript - каждое назначение является ссылкой. Это означает, что:

const x = { value: 1};
const y = x;
y.value = 2;
console.log(x); // { value: 2 }

Поскольку объект не клонирован, и ссылка используется совместно с переменными слишком. Если вы хотите глубокое копирование переменных («копировать по значению», как в C ++), есть много способов сделать это ( Какой самый эффективный способ глубокого клонирования объекта в JavaScript? )

1 голос
/ 03 мая 2019

Я клонирую переменную для манипуляции в одной из моих функций

Я думаю, что вы имеете в виду эту строку кода:

var referenceMatrixs = vm.referenceMatrix;

Это не клонировать что-либо. Вместо этого он назначает ссылку на объект. Все изменения в referenceMatrixs также будут видны в vm.referenceMatrix.

Обратите внимание, что ваши выходные операторы do клонируют объект:

console.log('BEFORE -> ', JSON.parse(JSON.stringify(vm.referenceMatrix)));

Однако клон используется только для вывода и сразу же выбрасывается. Это много кода, практически бесполезного. Вы получите точно такой же результат с

    console.log('BEFORE -> ', vm.referenceMatrix);

Поскольку этот оператор не изменяет объект, здесь нет причин для клонирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...