<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()
来自哪里?
答案 0 :(得分:4)
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]);
}
}