我正在克隆一个变量以在我的一个函数中进行操作,并且我没有将其重新分配回去。为什么第二个console.log()
打印以下内容?
代码如下:
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;
答案 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);
由于此语句不会修改对象,因此没有理由在此处进行克隆。