使用for(... in ...)循环遍历数组时出现意外输出

时间:2011-04-08 06:14:23

标签: javascript

<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()来自哪里?

2 个答案:

答案 0 :(得分:4)

JavaScript中的

for ... in 不会占用阵列。忘记你的其他编程语言 - 这是JavaScript,语法类似的语言意味着完全不同的东西

for ... in遍历对象的所有属性,包括其原型链中的所有属性。

因此,总是使用hasOwnProperty 来检查属性是否在对象本身上定义:

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

不应使用for ... in来迭代数组。改为使用索引。

搜索SO以查找有关此主题的数百个类似问题。

答案 1 :(得分: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]);
    }
}