2013-04-01 62 views
-1

循環如果代碼是這樣的:的JavaScript,在數組

arr=Array("a","b","c"); 
for(i in arr); 
{ 
alert(i); 
} 

沒有任何警告,但如果是這樣的:

arr=new Array("a","b","c"); 
for(i in arr) 
{ 
alert(i);//alerts 0,1,2 
} 

的原因是什麼?

+4

不應該有一個';'前''{在for/in循環 – louisbros

+0

@大衛嘗試在互聯網explorer.I剛在Chrome中測試沒有第一個摘要的提示 –

+0

@php嘗試使用IE瀏覽器,並且在第一段中沒有任何提醒,我剛剛試過它 –

回答

3

Array是一個構造函數。要創建一個新的對象,你應該使用new運算符來創建該對象,然後綁定並運行構造函數。在這種情況下,它實際上應該可以工作,你的問題很可能與你的for循環旁邊的分號有關,正如評論中指出的那樣。

順便說一句,用於創建新陣列的一般建議使用簡單的符號

var arr = ["a","b","c"]; 

它也值得懷疑使用了,與在JavaScript的數組循環,因爲這將打擊任何附加在數組上定義的屬性。 (所以如果你說arr.x = 2它也將遍歷x

最好使用迭代形式

var i =0, length =arr.length; 
for (;i<length; i++) { 

    alert(arr[i]); 
} 
+0

或'arr.forEach(function(value){alert(value); });'。 – louisbros

+0

確實是這樣做的,但不是OP問題的原因。真正的原因是「for」陳述後的分號,結束了。 Array構造函數可以不用'new'來調用,然後構造一個新的數組(參見ES5 [15.4.1.1](http://es5.github.com/#x15.4.1.1)) – bfavaretto

+0

是的,我意識到那是在我最初的回答之後。改變了第一段以反映它,保留了答案,因爲我仍然認爲它對於OP是有用的,並且對於評論有點冗長。 –

1

你得到不同的結果的原因是,你正在使用不正確的語法爲您的for/in環。

for(i in arr); 
{ 
alert(i); 
} 

應該不會有第一個分號。

還要注意的是一個更好的方式來遍歷在一個陣列將是:

arr.forEach(function(value, index){ 
    alert(value); // or alert(index); 
}); 

正如bfavaretto已經提到。

如果不使用關鍵字new調用Array函數,將會像使用new關鍵字一樣創建並返回一個新的Array對象。

所以這兩個會提醒同樣的事情:

arr1 = new Array("a","b","c"); 
arr2 = Array("a","b","c");