当我不为它重新分配操纵值时,为什么我的数据对象变量被更改了?

时间:2019-05-03 16:19:27

标签: javascript vue.js vuejs2

我正在克隆一个变量以在我的一个函数中进行操作,并且我没有将其重新分配回去。为什么第二个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 个答案:

答案 0 :(得分:3)

也许您来自另一种语言,但是使用JavaScript-每个作业都是通过引用进行的。这意味着:

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

因为未克隆对象,并且引用在太变量之间共享。 如果您想深层复制变量(例如在C ++中“按值复制”),可以通过多种方式来实现(What is the most efficient way to deep clone an object in JavaScript?

答案 1 :(得分:1)

  

我正在克隆变量以在其中一个函数中进行操作

我想你是说这行代码:

var referenceMatrixs = vm.referenceMatrix;

这不会克隆任何内容。相反,它为对象分配了一个引用。 referenceMatrixs的所有更改也将在vm.referenceMatrix中显示。

请注意,您的输出语句要做克隆对象:

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

但是,克隆仅用于输出,并立即被丢弃。这是很多没有目的的代码。您将获得与

完全相同的结果
    console.log('BEFORE -> ', vm.referenceMatrix);

由于此语句不会修改对象,因此没有理由在此处进行克隆。