循環如果代碼是這樣的:的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
}
的原因是什麼?
循環如果代碼是這樣的:的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
}
的原因是什麼?
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]);
}
或'arr.forEach(function(value){alert(value); });'。 – louisbros
確實是這樣做的,但不是OP問題的原因。真正的原因是「for」陳述後的分號,結束了。 Array構造函數可以不用'new'來調用,然後構造一個新的數組(參見ES5 [15.4.1.1](http://es5.github.com/#x15.4.1.1)) – bfavaretto
是的,我意識到那是在我最初的回答之後。改變了第一段以反映它,保留了答案,因爲我仍然認爲它對於OP是有用的,並且對於評論有點冗長。 –
你得到不同的結果的原因是,你正在使用不正確的語法爲您的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");
不應該有一個';'前''{在for/in循環 – louisbros
@大衛嘗試在互聯網explorer.I剛在Chrome中測試沒有第一個摘要的提示 –
@php嘗試使用IE瀏覽器,並且在第一段中沒有任何提醒,我剛剛試過它 –