1

我试图在单个 javascript 语句中定义一个数组(包括其他数组作为值),我可以循环通过它来验证提交时的表单。

我写(尝试)创建内联数组的函数如下:

function arr(){
    var inc;
    var tempa = new Array(Math.round(arguments.length/2));
    for(inc=0; inc<arguments.length; inc=inc+2) {
        tempa[arguments[inc]]=arguments[inc+1];
    }
    return tempa;
}

这里调用了 3 次来分配一个数组:

window.validArr = arr(
    'f-county',arr('maxlen',10, 'minlen',1),
    'f-postcode',arr('maxlen',8, 'minlen',6)
);

但是在 javascript 调试器中,该变量为空,并且该arr()函数没有返回任何内容。有谁知道为什么我对这段代码应该做什么的期望不正确?

我已经想出了如何在没有这个函数的情况下创建数组,但我很好奇为什么这段代码不起作用(我以为我比这更了解 javascript)。)

4

2 回答 2

2

好吧,从您的代码的作用来看,您并没有真正制作数组。在 JavaScript 中,数组的特殊之处在于对数字索引属性的管理。否则它们只是对象,因此它们也可以具有其他属性,但是如果您不将数组用作数组,则最好只使用对象:

function arr(){
    var inc;
    var tempa = {};
    for(inc=0; inc<arguments.length; inc=inc+2) {
        tempa[arguments[inc]]=arguments[inc+1];
    }
    return tempa;
}

您从调试器中看到的是它试图将您的数组显示为应该显示的真实数组的结果:也就是说,它的数字索引属性。如果您按原样调用“arr()”函数,然后查看(从您的示例)结果的“f-county”属性,您会在那里看到一些东西。

此外,如果您确实发现自己想要一个真正的数组,那么将它们初始化为特定大小绝对没有意义。只需创建一个新数组[]

    var tempa = [];
于 2012-04-11T14:15:19.093 回答
1

您的代码有效。只需检查您的变量,您就会看到数组上有自定义键。如果不展开,您的调试器只会以简短的语法向您显示(数字)索引值 - 不适合您。

但是,您可能需要了解数组和对象之间的区别。对象只是键值对(您可以称其为“映射”)及其原型。数组是一种特殊类型的对象。它具有特殊的原型方法、length功能和不同的方法:存储索引值对(即使索引仍然是键)。因此,您不应该将 Array 用作关联数组

因此,它们的字面语法不同:

var array = ["indexed with key 0", "indexed with key 1", ...];
var object = {"custom":"keyed as 'custom'", "another":"string", ...};
// but you still can add keys to array objects:
array.custom = "keyed as 'custom'";
于 2012-04-11T14:38:42.643 回答