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);
}
答案 0 :(得分:2)
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]);
}
}
你明白为什么你的循环现在看起来像“错误”吗?