迭代对象时未定义

时间:2017-05-24 14:17:31

标签: javascript for-loop undefined

object传递给我的函数。在console.log ged时似乎没问题,但是迭代似乎是错误的(有时是一个元素,有时是两个元素)。我无法理解其他元素的去向。

我的功能如下:

console.log('Banks');
console.log(banks);

for(var prop in banks) {
    var bank = banks[prop];
    console.log('Bank ' + prop);
    console.log(bank);
}

Result (log)

2 个答案:

答案 0 :(得分:2)

JavaScript中的

for ... in构造通常很糟糕。使用for循环应该适合您:

for (var i = 0; i < banks.length; i++)
{
    var bank = banks[i];
    console.log('Банк ' + i);
    console.log(bank);
}

答案 1 :(得分:1)

vzwick是对的:for...in循环通常不理想,因为它的默认行为不是大多数人所期望的。实际上,for...in不仅遍历对象的自身属性,还遍历原型属性。看看这个简单的例子:

function Person(firstname, lastname) {
  this.firstname = firstname;
  this.lastname = lastname;
}

Person.prototype.sayHello = function () {
  return 'Hello, ' + this.firstname + ' ' + this.lastname;
}

var person = new Person('John', 'Doe');

for (var prop in person) {
  console.log(person[prop]);
}

如您所见,sayHello已呈现。因此想象一下大型原生物体的结果,它具有大量的原型属性......一团糟,对吧?这就是为什么JavaScript具有可枚举性的概念。 for...in仅考虑可枚举的属性。因此,如果我们不想看到sayHello,我们可以这样做:

function Person(firstname, lastname) {
  this.firstname = firstname;
  this.lastname = lastname;
}

Object.defineProperty(Person.prototype, 'sayHello', {
  value: function () {
    return 'Hello, ' + this.firstname + ' ' + this.lastname;
  },
  enumerable: false
});

var person = new Person('John', 'Doe');

for (var prop in person) {
  console.log(person[prop]);
}

console.log(person.sayHello());

但是,通常的做法是使用Object.prototype.hasOwnProperty(),如下所示:

function Person(firstname, lastname) {
  this.firstname = firstname;
  this.lastname = lastname;
}

Person.prototype.sayHello = function () {
  return 'Hello, ' + this.firstname + ' ' + this.lastname;
}

var person = new Person('John', 'Doe');

for (var prop in person) {
  if (person.hasOwnProperty(prop)) {
    console.log(person[prop]);
  }
}

你明白为什么你的循环现在看起来像“错误”吗?