这是我的第一个功能,我传给了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修改,What ???
$(“#giorni”)。on('click',function(){ var nuova = jsonSecCall;
$("#svgDateLine2").remove();
loadchart2("content", nuova,listaSecCall,"giorni");
checkContainer();
});
可能是json已经不在参考,有可能吗?
这是一个例子https://jsfiddle.net/tsjvmsd0/。 第一个控制台日志打印json修改,没问题,他们应该下一个控制台日志 打印原始json,但打印json修改。
答案 0 :(得分:0)
这是javascript的骗局。 JS中的所有内容都是按值传递的,除了对象之外,因为它们是引用的集合。这是出于性能原因 - 复制整个对象的成本很高。
要修改对象而不改变原始对象,您应该复制它。一种方法是使用Object.assign。它可能比制作如此深的对象副本更好; - )
然后该片段将
var copy = {}
Object.assign(copy, source)
答案 1 :(得分:0)
我不知道变量的类型,但通常我使用Array.prototype.slice进行复制。
var a = [1, 2, 3];
var b = a.slice(0); //Creates a new array
对于复制对象,请参阅@alexcleac answer。
答案 2 :(得分:0)
首先,它看起来并不像你在处理JSON,看起来你正在处理一个对象(或一个数组)。 JSON是一个字符串。
其次,您没有将原始JSON传递给loadchart2(正如您已经想到的那样)。您已经通过变量jsonSecCall
您可能想要做的是实际维护对象的原始JSON(字符串)形式,并将其用作原始的未修改对象。只要您想要原始对象引用,就可以对其进行JSON.parse
。