Scoped变量正在创建引用而不是新实例

时间:2013-11-07 23:47:21

标签: javascript

遇到一个奇怪的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]

    }

}

Also in JSFiddle

我始终理解var ids = this.selectedIDs会有效地将<{1}}的内容复制到新的实例中 - 但似乎并非如此。

关于为什么会发生这种情况的任何想法,以及绕过它的最佳方法(除了通过for循环手动重新创建它)?

2 个答案:

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