假设我这样做..
var arr = Array();
var i = 3333;
arr[i] = "something";
如果你对这个数组进行字符串化,它将返回一个字符串,其中包含一大堆未定义的数字条目,用于索引小于 3333 的那些条目......
有没有办法让javascript不这样做?
我知道我可以使用对象 {} 但我不想这样做,因为我想做诸如 shift() 之类的数组操作,这些操作不适用于对象
假设我这样做..
var arr = Array();
var i = 3333;
arr[i] = "something";
如果你对这个数组进行字符串化,它将返回一个字符串,其中包含一大堆未定义的数字条目,用于索引小于 3333 的那些条目......
有没有办法让javascript不这样做?
我知道我可以使用对象 {} 但我不想这样做,因为我想做诸如 shift() 之类的数组操作,这些操作不适用于对象
如果您为每个 OP 创建一个数组,它只有一个属性名称为“333”且长度为 334 的成员,因为长度始终设置为至少比最高索引大一。例如
var a = new Array(1000);
长度为 1000 且没有成员,
var a = [];
var a[999] = 'foo';
长度为 1000,一个成员的属性名称为“999”。
只获取已定义成员的快速方法是使用 for..in:
function myStringifyArray(a) {
var s = [];
var re = /^\d+$/;
for (var p in a) {
if (a.hasOwnProperty(p) && re.test(p)) {
s.push(a[p]);
}
}
return '' + s;
}
请注意,成员可能会乱序返回。如果这是一个问题,您可以改用 for 循环,但对于非常稀疏的数组,它会更慢:
function myStringifyArray(a) {
var s = [];
var re = /^\d+$/;
for (var i=0, iLen=a.length; i<iLen; i++) {
if (a.hasOwnProperty(i)) {
s.push(a[i]);
}
}
return '' + s;
}
在一些较旧的浏览器中,遍历数组实际上会创建丢失的成员,但我认为这在现代浏览器中没有问题。
请彻底测试上述内容。
数组的文字表示必须包含数组的所有项,否则第 3334 项不会在索引 3333 处结束。
您可以将数组中的所有未定义值替换为您想用作空项的其他值:
for (var i = 0; i < arr.length; i++) {
if (typeof arr[i] == 'undefined') arr[i] = '';
}
另一种选择是构建您自己的 stringify 方法,该方法将创建分配而不是数组文字。即,而不是这样的格式:
[0,undefined,undefined,undefined,4,undefined,6,7,undefined,9]
您的方法将创建如下内容:
(function(){
var result = [];
result[0] = 0;
result[4] = 4;
result[6] = 6;
result[7] = 7;
result[9] = 9;
return result;
}())
但是,如果您需要,这样的格式当然与 JSON 不兼容。