传递数组按值运行

时间:2017-07-18 09:03:43

标签: javascript jquery

这是我的第一个功能,我传给了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修改。

3 个答案:

答案 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