Javascript 为什么我的变量的副本被意外更改?

Javascript 为什么我的变量的副本被意外更改?,javascript,Javascript,我创建了变量bpJson,但不理解它为什么会改变。我每5秒记录一次,每次迭代都会改变。我只希望BabypeData会改变,而bpJson每次都保持不变。setPieOptions中没有bpJson,因此我没有包含该函数的代码 var createVariance = function(bpJson, babyPieData){ var n = bpJson.length; for ( var i = 0; i < n; i++){ var amount =

我创建了变量bpJson,但不理解它为什么会改变。我每5秒记录一次,每次迭代都会改变。我只希望BabypeData会改变,而bpJson每次都保持不变。setPieOptions中没有bpJson,因此我没有包含该函数的代码

var createVariance = function(bpJson, babyPieData){
    var n = bpJson.length;
    for ( var i = 0; i < n; i++){
        var amount = Math.floor(Math.random() * 4);
        var operator = Math.floor(Math.random() *2) + 1;
        if (operator === 1){
            babyPieData[i] = (bpJson[i] + amount);
            if (babyPieData[i] > 100){
                babyPieData[i] = 100;
            }
        }else{
            babyPieData[i] = (bpJson[i] - amount);
            if (babyPieData[i] < 0){
                babyPieData[i] = 1;
            }
        }
        setPieOptions(babyPieData);
    }
};

var getBabyPieData = function(){
    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'php/baby-pie.php');
    xhr.send();
    xhr.onload = function(){
        var babyPieData = JSON.parse(xhr.response);
        console.log('original babyPieData = ' + babyPieData);
        var bpJson = babyPieData;
        setPieOptions(babyPieData);
        var babyPieDataTimer = window.setInterval(function(){
            createVariance(bpJson, babyPieData);
            console.log(bpJson);
        }, 5000);
    };
}();
var createVariance=function(bpJson,babypedata){
var n=bpJson.length;
对于(变量i=0;i100){
Babypedata[i]=100;
}
}否则{
BabypeData[i]=(bpJson[i]-金额);
if(babypedata[i]<0){
BabypeData[i]=1;
}
}
设置选项(BabypeData);
}
};
var getbabypedata=函数(){
var xhr=new XMLHttpRequest();
open('GET','php/baby pie.php');
xhr.send();
xhr.onload=函数(){
var babypedata=JSON.parse(xhr.response);
log('original babypedata='+babypedata);
var bpJson=babypedata;
设置选项(BabypeData);
var babypedatatimer=window.setInterval(函数(){
createVariance(bpJson,BabypeData);
log(bpJson);
}, 5000);
};
}();

因为
bpJson
babypedata
是同一个对象。

从您的代码中可以清楚地看出,您使用的是一个对象;看起来可能是一个数组

变量不直接包含数组之类的对象,它们包含对它们的引用;实际对象在别处。您可以将其想象为一个变量,其中包含一个数字,告诉JavaScript引擎在何处查找对象:

+−−−−−−−−−−−−−+ | babyPieData | +−−−−−−−−−−−−−+ +−−−−−−−−−+ | Ref:123456 |−−−−−−−−−−−−>| (Array) | +−−−−−−−−−−−−−+ +−−−−−−−−−+ | 0: 42 | | 1: 67 | +−−−−−−−−−+ 这不会创建数组的副本。它只创建数组引用的第二个副本。两个变量仍然引用(指向)同一数组:

+−−−−−−−−−−−−−+ | babyPieData | +−−−−−−−−−−−−−+ | Ref:123456 |−−−−−−+ +−−−−−−−−−−−−−+ | | | +−−−−−−−−−+ +−−−−−>| (Array) | +−−−−−−−−−−−−−+ | +−−−−−−−−−+ | bpjSon | | | 0: 42 | +−−−−−−−−−−−−−+ | | 1: 67 | | Ref:123456 |−−−−−−+ +−−−−−−−−−+ +−−−−−−−−−−−−−+
slice
无参数创建浅拷贝:

+−−−−−−−−−−−−−+ | babyPieData | +−−−−−−−−−−−−−+ +−−−−−−−−−+ | Ref:123456 |−−−−−−−−−−−−>| (Array) | +−−−−−−−−−−−−−+ +−−−−−−−−−+ | 0: 42 | | 1: 67 | +−−−−−−−−−+ +−−−−−−−−−−−−−+ | bpJson | +−−−−−−−−−−−−−+ +−−−−−−−−−+ | Ref:554654 |−−−−−−−−−−−−>| (Array) | +−−−−−−−−−−−−−+ +−−−−−−−−−+ | 0: 42 | | 1: 67 | +−−−−−−−−−+ +−−−−−−−−−−−−−+ |Babypedata| +−−−−−−−−−−−−−+ +−−−−−−−−−+ |参考号:123456|−−−−−−−−−−−−>| (数组)| +−−−−−−−−−−−−−+ +−−−−−−−−−+ | 0: 42 | | 1: 67 | +−−−−−−−−−+ +−−−−−−−−−−−−−+ |bpJson| +−−−−−−−−−−−−−+ +−−−−−−−−−+ |参考号:554654|−−−−−−−−−−−−>| (数组)| +−−−−−−−−−−−−−+ +−−−−−−−−−+ | 0: 42 | | 1: 67 | +−−−−−−−−−+

正如@Scott所说,“因为bpJson和babypedata是同一个对象。”
按照链接创建任何js对象的独立副本,而不是特定的数组。

主题之外,因为“为什么这段代码不起作用。”@bhspencer是的,我很熟悉。这个问题很好。@bhspencer如果这个标准一直适用,那么网站上大约90%的问题都将被关闭。此问题包含问题的明确说明以及提供答案所需的所有代码。重复。虽然T.J.的答案要好得多…@bhspencer我不知道你多久回答一次网络开发(JavaScript、CSS等)问题,但许多参与者没有足够的经验或技术深度来真正在很大程度上实现这一规则。如果不是这样的话,生活会轻松得多,但情况就是这样。我编辑了问题标题,希望能使搜索目标稍微好一点。请考虑关闭一个题为“为什么这个代码不起作用”的问题,而不是写一行答案。它包含有问题的代码,以及对问题的描述。这也许不是有史以来最伟大的问题,但有足够多的证据可以看到问题并提供答案。我不知道变量只是对对象的引用。你的解释非常有助于我理解为什么代码不起作用,我非常感激。@Mike:很高兴这有帮助!是的,变量确实直接包含数字和布尔等基本体的值(无论如何,在它们的标准解释中),但对于对象(包括数组),它是一个值(如数字)作为参考。
var bpJson = babyPieData.slice();
+−−−−−−−−−−−−−+ | babyPieData | +−−−−−−−−−−−−−+ +−−−−−−−−−+ | Ref:123456 |−−−−−−−−−−−−>| (Array) | +−−−−−−−−−−−−−+ +−−−−−−−−−+ | 0: 42 | | 1: 67 | +−−−−−−−−−+ +−−−−−−−−−−−−−+ | bpJson | +−−−−−−−−−−−−−+ +−−−−−−−−−+ | Ref:554654 |−−−−−−−−−−−−>| (Array) | +−−−−−−−−−−−−−+ +−−−−−−−−−+ | 0: 42 | | 1: 67 | +−−−−−−−−−+