按值将数组传递给函数



这是我的第一个函数,我传递给json 如果这是我第一次保存 JSON 是原始的,则结束。

function loadchart2(div, json, lista,tipo) {
var listaId = lista;
if(l==0){
jsonSecCall =JSON.parse(JSON.stringify(json));
listaSecCall=listaId;
l++;

}

我修改json,然后单击一个按钮。 调用第二个函数并调用 loadcart2 并传递 json 原始内容,但实际上接收了 json 修改,什么???

$("#giorni"(.on('click',function (( { var nuova=jsonSecCall;

$("#svgDateLine2").remove();
loadchart2("content", nuova,listaSecCall,"giorni");
checkContainer();

});

可能 json 它已经消失了以供参考,可能吗??

这是 https://jsfiddle.net/tsjvmsd0/的示例。 第一个控制台日志打印 json 已修改,没问题,下一个控制台日志应该 打印原始 JSON,但打印 JSON 已修改。

这是javascript的缺点。JS中的所有内容都是按值传递的,对象除外,因为它们是引用的集合。这是出于性能原因 - 复制整个对象的成本很高。

要在不改变原始对象的情况下修改对象,应复制它。一种方法是使用 Object.assign。这可能比制作如此深的对象副本要好;-(

然后代码段将是

var copy = {}
Object.assign(copy, source)

我不知道你的变量的类型,但通常我使用Array.prototype.slice进行复制。

var a = [1, 2, 3];
var b = a.slice(0); //Creates a new array

有关复制对象的信息,请参阅@alexcleac答案。

首先,看起来你不是在处理JSON,而是在处理一个对象(或数组(。JSON 是一个字符串

其次,您没有将原始 JSON 传递给 loadchart2(正如您已经发现的那样(。您已经通过变量修改了对象引用jsonSecCall

您可能想要做的是实际维护对象的原始 JSON(字符串(形式,并将其用作原始的、未修改的对象。每当您想要原始对象引用时,都可以对其进行JSON.parse

最新更新