如果不使用.push()

时间:2018-01-05 21:42:59

标签: javascript node.js ecmascript-6

出于某种原因,我不能在不使用.push()的情况下将任何内容分配给全局数组。

(function() {
    var globalEmail = [];

    var testClear = function() {
        var arr = [1, 2, 3];

        if (globalEmail.length > 1) {
            globalEmail = [];
        }
        else {
            globalEmail = arr;
        }
    };

    window.globalEmail = globalEmail;
    window.testClear = testClear;
})();

如果我在控制台中呼叫testClear()然后globalEmail,则globalEmail保持不变。

3 个答案:

答案 0 :(得分:2)

对于空数组,您可以将长度设置为零,对于分配,您可以将Array#pushspread syntax ...

一起使用

Summary

答案 1 :(得分:1)

如评论中所述,您在此处丢失了引用,因为您将globalEmail分配给新数组,因此window.globalEmail与新的globalEmail数组不同。

您需要修改数组(对于您的示例,使用spliceconcat)。

答案 2 :(得分:0)

您希望将globalEmail变量定义为全局变量,而不是本地变量。

(function() {
    window.globalEmail = []; // this goes here

    var testClear = function() {
        var arr = [1, 2, 3];

        if (window.globalEmail.length > 1) {
            window.globalEmail = [];
        }
        else {
            window.globalEmail = arr;
        }
    };

    //window.globalEmail = globalEmail; <-- not here
    window.testClear = testClear;
})();

window.并非绝对必需,但函数中的var globalEmail;定义了一个局部变量,这首先不是您想要的。

虽然,如果testClear()的要点是清除任何数组,那么它就没有正确实现。相反,它应该采用一个参数,你可以处理该参数。

function testClear(a)
{
    var arr = [1, 2, 3];

    if(a.length > 1) {
        a.splice(0);
    }
    else {
        a.splice(0);
        a.push.apply(a, arr);
    }
}

testClear(window.globalEmail);

然后我认为testClear()函数更有意义。

请注意,a.push.apply()存在一些缺点,这些缺点会在大型数组上中断。有关详细信息,请参阅此处How to extend an existing JavaScript array with another array, without creating a new array?