Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我的数组在使用slice()后会被更改?_Javascript_Arrays_Immutability - Fatal编程技术网

Javascript 为什么我的数组在使用slice()后会被更改?

Javascript 为什么我的数组在使用slice()后会被更改?,javascript,arrays,immutability,Javascript,Arrays,Immutability,我正在从app-config.js文件中加载一个变量,然后用.slice()复制它,以防止其状态发生变化。令我懊恼的是,我用来改变数据的函数似乎没有尊重这种避免变异的尝试MySensitityVars不断变化,尽管我不太清楚如何变化,因为我只是直接在mySeries上操作。你知道为什么会这样吗?代码如下: var mySeries = mySensitivityVars.slice(); //Dummy Processing Algorithm function myDumm

我正在从app-config.js文件中加载一个变量,然后用.slice()复制它,以防止其状态发生变化。令我懊恼的是,我用来改变数据的函数似乎没有尊重这种避免变异的尝试
MySensitityVars
不断变化,尽管我不太清楚如何变化,因为我只是直接在
mySeries
上操作。你知道为什么会这样吗?代码如下:

    var mySeries = mySensitivityVars.slice();


//Dummy Processing Algorithm
    function myDummyAlgo(sliderIndex, newValue, range) {
         console.log(mySeries[sliderIndex].data)

        var modifier = newValue/(range/2)
        var newSeries = mySensitivityVars[sliderIndex].data.map(function(num){
            return num * modifier
        })
        console.log(newSeries)
        // mySeries[sliderIndex].data = newSeries

        // console.log(sensitivityChart.series[0].data)
        sensitivityChart.series[sliderIndex].setData(newSeries);
    };

如果看不到
mySensitivityVars
的内容,很难说,但我猜你是在改变对原始对象的引用,而不是复制对象


mySensitityVars
中是否有任何对象?如果是这样的话,
mySeries
中的对应对象将指向
mysensititityvars
中的原始对象,而不是独立的重复对象,这就是为什么您可能会看到突变问题。

如果看不到
mysensititityvars
的内容,很难判断,但我猜你是在改变对原始对象的引用,而不是复制对象


mySensitityVars
中是否有任何对象?如果是这样的话,
mySeries
中的对应对象将指向
mysensititityvars
中的原始对象,而不是独立的重复对象,这就是您可能看到变异问题的原因。

切片可以复制数组,但数组中引用的任何对象都不会被复制(仅复制引用)

切片可以复制阵列,但阵列内引用的任何对象都不会被复制(仅复制引用)

执行以下操作时:

mySeries[sliderIndex].data newSeries;
数组
mySeries
mysensititityvars
的副本,但数组中的对象不是副本。两个数组都包含对相同对象的引用,修改
data
属性会影响这两个数组。您还需要复制对象:

mySeries = mySentitivyVars.map(o => Object.assign({}, o));
如果对象包含对其他对象的引用,则可能需要执行深度复制。执行此操作时,请参见:

mySeries[sliderIndex].data newSeries;
数组
mySeries
mysensititityvars
的副本,但数组中的对象不是副本。两个数组都包含对相同对象的引用,修改
data
属性会影响这两个数组。您还需要复制对象:

mySeries = mySentitivyVars.map(o => Object.assign({}, o));

如果对象包含对其他对象的引用,则可能需要进行深度复制。请参见

如果希望数组发生变异,则应克隆数组,而不是复制数组。可以使用JSON.parse(JSON.stringify(mysensititityvars)),这是一种非常快速的深度克隆技术。
这将确保分配新对象,而不是复制引用。

如果希望数组发生变异,应该克隆数组而不是复制数组。可以使用JSON.parse(JSON.stringify(mySensitityVars))这是一种非常快速的深度克隆技术。
这将确保分配新对象,而不是引用的副本。

.slice
是浅拷贝,而不是深拷贝。@Jonasw:这不太可能工作,因为数组中的对象似乎有方法。@felix hm那么我们还不能帮上忙…你对
mySeries
做什么?唯一修改它的行是注释的out,这就是你所说的吗?
.slice
是浅拷贝,而不是深拷贝。@Jonasw:这不太可能,因为数组中的对象似乎有方法。@felix hm那么我们还是无能为力……你对
mySeries
做了什么?修改它的唯一一行被注释掉了,这就是你所说的t?.对象是引用类型的值,但这与“按引用传递”无关。许多人都犯了这个错误…@FelixKling非常正确。因此进行了编辑。.对象是引用类型的值,但与“按引用传递”无关.很多人都犯了这个错误…@FelixKling非常正确。进行了相应的编辑。谢谢!!这最终是一个有效的解决方案。考虑到Marcin提到被复制的对象实际上是引用,而只有数组本身是一个新的副本,这是有意义的。谢谢!!这最终是一个有效的解决方案。在lMarcin提到要复制的对象实际上是引用,而只有数组本身是新的副本。