为什么我不能设置传递给函数的对象,但可以设置它的子对象?

问题描述

我正在尝试编写一个函数,让用户上传他们的本地 JSON 文件作为一个 save 对象来替换它:

function uploadJSON(importObject,importID) {
  //{...}
  reader.onload = function () {
    importObject = JSON.parse(reader.result);
    uploadAnchorNode.remove();
  }
  //{...}
}

当我调用 uploadJSON(save,"someid")console.log(save) 时,它会显示旧的保存。

如果我将第 4 行设置为:

save = JSON.parse(reader.result);
//or:
importObject.settings = JSON.parse(reader.result).settings;
importObject.game = JSON.parse(reader.result).game;
importObject.errors = JSON.parse(reader.result).errors;

效果很好。

为什么我不能像这样设置整个对象:importObject = JSON.parse(reader.result);

解决方法

因为您收到了对对象的引用

想象一下这种情况:

{% for mapping_operation in mapping_operation_list.all %}

如果您没有觉得这令人惊讶(并且没有理由让您感到惊讶),那么以下内容也不会让您感到惊讶,因为它们完全相同。

var foo = {                // now "foo" contains a reference to an object
    data: "something"
};

var bar = foo;             // now "bar" contains a new reference to the same object

bar = {};                  // overwriting "bar" will not change "foo"

您可以更改对象的属性,然后对该对象的所有引用都将显示相同的状态也不足为奇,因为该对象只存在一次。