是否可以将这个“单例数组声明”写得更短?有不同的脚本可以添加一些东西,array
但它们是异步加载的,所以我不知道哪个会array
先初始化。
var array = array || [];
array.push("foo");
console.debug(array[0]);
我尝试过这样的事情,但这不起作用:
(array || []).push("foo");
有什么建议么?
是否可以将这个“单例数组声明”写得更短?有不同的脚本可以添加一些东西,array
但它们是异步加载的,所以我不知道哪个会array
先初始化。
var array = array || [];
array.push("foo");
console.debug(array[0]);
我尝试过这样的事情,但这不起作用:
(array || []).push("foo");
有什么建议么?
如果您需要保留现有变量(如果您不知道将首先执行哪一段代码,就会发生这种情况),您的代码不能写得更短。
当然,您可以根据需要更改默认值:
var array = array || ['foo'];
但是如果变量已经存在,它就不会再添加foo
了。可能不是你想要的。
旧答案
用你给定的例子:
var array = ['foo'];
var array = [];
array.push("foo");
console.debug(array[0]);
如果您不动态添加元素,那么这就足够了:
var array = ["foo"];
console.debug(array[0]);
更新:
同样,如果您事先了解您的元素,请执行
var array = array || ['foo']
不知道你想要什么array || []
。但这就是你得到相同结果的方式:
var array = new Array("foo");
最短的方法是在尝试推送时检查数组是否已经定义:
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;
};
只需使用括号符号,因为它比使用 new Array() 更快。如果需要动态添加项目,则需要使用 .push(); - 或者自己处理数组的数字索引。
好的,没有阅读您上面关于异步加载脚本的评论。为什么不在加载任何其他脚本之前声明您的数组,这样您就可以确定您的数组存在?
取决于您希望如何影响传入的数组
var newVals = (vals || []).concat(["c","d"]);
或者
var newVals = [].concat((vals || []), ["c","d"]);