先说结论:for..in..会遍历对象的自有属性及其原型链上的属性,所以要保证预期的话可以用obj.hasOwnProperty(key)
去判断是否是对象的自有属性。
我们知道for..in..可以用来遍历对象,那么遍历出来的属性是否是你的预期呢?什么时候超出了你的预期?我们来看下面的代码
function Person(name) {
this.name = name;
}
Person.prototype.eat = function(){
console.log("eat");
}
let xiaoming = new Person('xiaoming');
function Doctor(age) {
this.age = age;
}
Doctor.prototype = xiaoming;
let xiaohong = new Doctor(18);
console.log(xiaohong);
我们采用了原型链的继承方式,打印出来的xiaohong是{age: 18}
当我们使用for..in..遍历时,预期如下:
let arr = [];
for(let key in xiaohong){
arr.push(key);
}
console.log(arr);
// 预期打印结果:['age']
实际的打印结果:['age', 'name', 'eat']
结论:
for..in..会遍历对象的自有属性及其原型链上的属性,所以要保证预期的话可以用obj.hasOwnProperty(key)
去判断是否是对象的自有属性