2011-04-08 69 views
0
<html> 
<head> 
<script type="text/javascript"> 


Array.prototype.getUnique = function() { 
    var o = new Object(); 
    var i, e; 
    for (i = 0; e = this[i]; i++) {o[e] = 1}; 
    var a = new Array(); 
    for (e in o) {a.push (e)}; 
    return a; 
} 

function Perform(){ 
    var arr = new Array(); 

    arr[0] = "hello"; 
    arr[1] = "world"; 

    for(i in arr){ 
     console.log(arr[i]); 
    } 
} 

</script> 
</head> 
<body onload="Perform()"> 
</body> 
</html> 

在控制檯上面的代碼的結果是意外輸出(...在...)環

hello 
world 
function() 

從其中確實來自最後function()

回答

4

for ... in在JavaScript 不重新排列陣列。忘記你的其他編程語言 - 這是JavaScript,語法相似的語言,意思是完全不同的東西

for ... in遍歷對象的所有屬性,包括其原型鏈中的所有屬性。

因此,總是使用hasOwnProperty來檢查屬性是否是對象本身定義:

for (var name in obj) { 
    if (obj.hasOwnProperty(name)) { 
    doSomething(obj[name]); 
    } 
} 

不應使用for ... in遍歷數組。改用索引。

搜索SO幾百個關於這個話題的類似問題。

2

function()來自prototype - 這是getUnique函數。


爲了避免這種情況,你不應該通過陣列與for .. in迭代循環。使用普通的老:

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

在必須使用的情況下for .. in(例如,通過對象的鍵迭代),您應經常檢查hasOwnProperty()

for (var i in arr) { 
    if (arr.hasOwnProperty(i)) { 
     console.log(arr[i]); 
    } 
}