1

遇到一个奇怪的 Javascript 错误,如果能得到一些见解,那就太好了。我已经设法调试它以了解问题所在,我只是无法弄清楚原因以及解决它的非黑客方法。

我正在尝试创建一个数组的新实例作为函数内的变量,因此我可以在不影响主数组的情况下对其进行操作。相反,我得到了某种参考,所以对我的新变量进行操作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]

    }

}

同样在 JSFiddle

我一直认为这var ids = this.selectedIDs会有效地将的内容复制this.selectedIDs到该新实例中 - 但情况似乎并非如此。

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

4

2 回答 2

2

我一直认为 var ids = this.selectedIDs 会有效地复制内容

好的,但是你的理解是错误的。这是一个任务。

考虑一下:

var ids = this.selectedIDs.slice()
于 2013-11-07T23:51:06.270 回答
0

我一直认为这var ids = this.selectedIDs会有效地将 this.selectedIDs 的内容复制到该新实例中 - 但事实似乎并非如此。

除了“不,这根本不会发生”之外,我不知道如何描述这一点。JavaScript 不是 C++;当您将某些内容分配给变量时,它永远不会被复制。你总是得到一个参考,除了原语,它们是不可变的,这使得这一点没有实际意义。(呵呵。)

您可以使用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]
}
于 2013-11-07T23:51:01.327 回答