2010-02-09 54 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']);

將數組插入到數組對象中。