1

是否可以将这个“单例数组声明”写得更短?有不同的脚本可以添加一些东西,array但它们是异步加载的,所以我不知道哪个会array先初始化。

var array = array || [];
    array.push("foo");

console.debug(array[0]);

我尝试过这样的事情,但这不起作用:

(array || []).push("foo");

有什么建议么?

4

6 回答 6

1

如果您需要保留现有变量(如果您不知道将首先执行哪一段代码,就会发生这种情况),您的代码不能写得更短。

当然,您可以根据需要更改默认值:

var array = array || ['foo'];

但是如果变量已经存在,它就不会再添加foo了。可能不是你想要的。

旧答案

用你给定的例子:

var array = ['foo'];
于 2012-10-11T12:50:52.720 回答
0
var array = [];
array.push("foo");

console.debug(array[0]);

如果您不动态添加元素,那么这就足够了:

var array = ["foo"];
console.debug(array[0]);

更新:

同样,如果您事先了解您的元素,请执行

 var array = array || ['foo']
于 2012-10-11T12:50:10.850 回答
0

不知道你想要什么array || []。但这就是你得到相同结果的方式:

var array = new Array("foo");
于 2012-10-11T12:51:45.380 回答
0

最短的方法是在尝试推送时检查数组是否已经定义:

var array = ​typeof array === 'undefined' ? ['foo'] : array.push('foo');​​​​​​​​​​

为了便于阅读,您可能需要创建一个延迟加载的 getter:

var addToArray = function (item) {
    // ensure array is defined
    if (typeof array === 'undefined') {
        array = [].push(item);
    }

    // redefine this function as a reference to push
    addToArray = array.push;
};
于 2012-10-11T12:58:06.260 回答
0

只需使用括号符号,因为它比使用 new Array() 更快。如果需要动态添加项目,则需要使用 .push(); - 或者自己处理数组的数字索引。

好的,没有阅读您上面关于异步加载脚本的评论。为什么不在加载任何其他脚本之前声明您的数组,这样您就可以确定您的数组存在?

于 2012-10-11T12:59:25.177 回答
0

取决于您希望如何影响传入的数组

var newVals = (vals || []).concat(["c","d"]);

或者

var newVals = [].concat((vals || []), ["c","d"]);
于 2012-10-11T13:01:59.570 回答