2010-02-09 24 views
1

版本1:JavasScript:为什么my_array.length不起作用?

var spamfoo = new Array(); 
spamfoo.push(['name', 'url']); 
spamfoo.push(['dog', 'cat']); 
alert(spamfoo); 
// Alerts: name,url,dog,cat 
alert(spamfoo.length); 
// Alerts: 2 
// ??? (shouldn't this be 4?) 

版本2:

var spamfoo = new Array(); 
spamfoo.push(['name', 'url']); 
spamfoo = spamfoo + ['dog', 'cat']; 
alert(spamfoo); 
// Alerts: name,url,dog,cat 
alert(spamfoo.length); 
// Alerts: 15 
// ??? (this one I wasn't sure about anyways because I didn't know if you could add an array) 

这怎么可能? ['value', 'value']不是数组,而不是?

回答

3

答案是my_array.length确实有效,但您错过了一些正在发生的隐式类型转换以及push()所做的一些事情。

在第一个示例中,您正在创建一个多维数组。从技术上讲,它是一个数组而不是真正的多维数组。第一个代码片段创建这个阵列的数组:

[ 
    ["name", "url"], 
    ["dog", "cat"] 
] 

它的长度为2以便结果正确。

第二个示例使用连接运算符+spamfoo转换为字符串,这意味着length现在返回字符串长度。字符串长度是15,所以这也是正确的。

您可能要将此行添加到您的例子:

alert(typeof spamfoo); 

如果是的话,你会看到第一个示例显示object和第二显示器string

3

在第一部分,你会得到一个嵌套的数组(2×2),因此spamfoo.length回报2.它看起来像:

[ 
    ['name', 'url'], 
    ['dog', 'cat'] 
] 

第二部分,是cletus said above,是一个类型转换成字符串

+0

+1。同意。推两次后,容器将包含2件东西。这应该被接受的答案。 – 2010-02-09 01:31:50

+0

是的,我同意。基本上你插入另一个数组对象到你的数组中。 – 2010-02-09 01:33:31

0

是否这样做

var spamfoo = new Array(); var x = [“name”,“url”,“d”]; spamfoo.push(“name”,“url”,“d”); spamfoo.push(“xxxx”); //spamfoo.push('dog');

//警示:名称,网址,狗,猫 alert(spamfoo.length);

1

您希望在推送这些阵列之前将它们弄平。试试这个:

var spamfoo = []; 
Array.prototype.push.apply(spamfoo, ["name", "url"]); 
Array.prototype.push.apply(spamfoo, ["dog", "cat"]); 
alert(spamfoo.length); // alerts 4 
0

我发布的第一个是错的。还有额外的“var x = xxxxxxxxx”

这是正确的。

var spamfoo = new Array(); 

spamfoo.push("name", "url","d"); 
spamfoo.push("xxxx"); 
//spamfoo.push('dog'); 

// Alerts: name,url,dog,cat 
alert(spamfoo.length); 

ķ主要是对的。这是一个错误spamfoo.push([ '名', '链接']); spamfoo.push(['dog','cat']);

将数组插入到数组对象中。