遇到一个奇怪的Javascript错误,很高兴获得一些洞察力。我已经设法调试它以了解问题所在,我只是无法找出为什么以及一种非hackey解决方法。
我正在尝试在函数内创建一个新的数组实例作为变量,因此我可以在不影响主数组的情况下对其进行操作。相反,我得到某种引用,因此对我的新变量ids
执行操作也会影响ids
等于的数组。
我简化了我的代码以更清楚地证明问题:
var defence = {
selectedIDs: new Array(),
toggleTerm: function(term, id) {
// add to the main array
this.selectedIDs.push(5);
// adds to this.selectedIDs
this.showTweet();
},
showTweet: function() {
// copy the array as a new variable in the scope of the function
var ids = this.selectedIDs;
if (ids.length == 1) {
ids.push(10); // this pushes to 'ids' AND 'this.selectedIDs'
}
console.log(this.selectedIDs); // outputs [5, 10]
}
}
我始终理解var ids = this.selectedIDs
会有效地将<{1}}的内容复制到新的实例中 - 但似乎并非如此。
关于为什么会发生这种情况的任何想法,以及绕过它的最佳方法(除了通过for循环手动重新创建它)?
答案 0 :(得分:2)
我一直都知道var ids = this.selectedIDs会 有效地复制内容
好的,但您的理解是wrong。这是一项任务。
请考虑一下:
var ids = this.selectedIDs.slice()
答案 1 :(得分:0)
我始终理解
var ids = this.selectedIDs
会 有效复制 this.selectedIDs的内容到新的 实例 - 但似乎并非如此。
我不知道如何描述这个,除了“不,这根本不会发生”。 JavaScript不是C ++;当您为变量分配内容时,从不复制。你总是得到一个引用,除了基元的情况,它是不可变的,使得这一点没有实际意义。 (HEH。)
您可以使用concat
,但如果这不是实际情况,可能会有更合适的内容。
showTweet: function() {
var ids = this.selectedIDs;
if (ids.length === 1) {
ids = ids.concat(10); // Array.prototype.concat returns a new array
}
console.log(this.selectedIDs); // outputs [5]
}