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