为什么我在 node.js 中用 for in 循环迭代时得到函数

why i get function while iterating with for in loop in node.js

我正在使用 for in 循环迭代一个对象数组,我得到了其中的所有对象,但我也得到了一个函数,我想知道我是如何得到这个的。 我的迭代代码看起来像:

 for (var key in student) {
        console.log(student[key]);
 }

我与对象相处的是

 function (value) {
    if (this.indexOf(value) !== -1) {
        this.splice(this.indexOf(value), 1);
        return true;
    } else {
        return false;
    }
}

即使我简单地使用

也会在抛出错误时产生问题
console.log(student[key].length);

非常感谢任何意见。

因为 for-in 循环访问对象及其原型上的 所有 可枚举属性,包括那些引用函数的属性。显然,有人在引用函数的 student 数组(或 Array.prototype)中添加了一个可枚举的 属性。

如果您不希望它出现,请通过 Object.defineProperty 使 属性 不可枚举,或者如果它在对象的原型链上而不是对象本身并且您只想要对象的"own" 属性,添加 hasOwnProperty 检查(或使用 Object.keys 获取 属性 名称的数组)。

但是如果 student 真的是一个 数组 for-in 通常是循环遍历其条目的错误工具;有关详细信息,请参阅 For-each over an array in JavaScript? 的答案。


在您提出的评论中:

when i use nested forEach loop it suggest me dont use function inside loop what to do in that case sir?

该警告并不总是很重要,有时(甚至经常)您可以忽略它。但是如果你想避免在循环中创建函数,只需将函数移出循环即可。例如,你可以把这个:

function foo() {
    outer.forEach(function(outerEntry) {
        outerEntry.forEach(function(innerEntry) {
            // Use `innerEntry` here...
        });
    });
}

进入

function foo() {
    outer.forEach(handleOuter);

    function handleOuter(outerEntry) {
        outerEntry.forEach(handleInner);
    }

    function handleInner(innerEntry) {
        // Use `innerEntry` here...
    }
}