我正在研究一本有关功能性javascript的书。在那本书中,有以下代码:
const forEachObj = (obj,fn) =>{
for(let prop in obj){
if(obj.hasOwnProperty(prop)){
fn(prop,obj[prop]);
}
}
};
我理解这是遍历对象的每个属性,然后询问该对象是否具有该属性,然后运行提供的功能。
我不了解if怎么做。并非总是如此吗?是否只是问从prop
获得的obj
是否是obj
的财产?
答案 0 :(得分:6)
从MDN
hasOwnProperty()方法返回一个布尔值,指示对象是否具有指定的属性作为其自身的属性(而不是继承它)。
很多属性(例如toString
)都是继承的,但是当检查对象上定义的键时,可能不需要迭代。
答案 1 :(得分:0)
此obj.hasOwnProperty(prop)
询问prop
是否属于对象本身,而不是继承的属性。
答案 2 :(得分:0)
for...in
运算符对对象原型链中的所有属性进行操作-hasOwnProperty()
检查该对象本身是否具有该属性,并且该属性没有被继承。来自MDN:
与in运算符不同,此方法不检查对象原型链中的属性。
答案 3 :(得分:0)
要补充已经发布的答案,获取对象的所有属性,然后使用hasOwnProperty()
进行过滤等效于使用Object.entries()
来获取对象的所有可枚举的自身属性的列表。不是从其祖先继承的所有属性。
您也可以使用Object.keys()
进行同样的操作。
const forEachObj1 = (obj, fn) => {
for (let prop in obj) {
if (obj.hasOwnProperty(prop)) {
fn(prop, obj[prop]);
}
}
};
const forEachObj2 = (obj, fn) => Object.entries(obj).forEach(([key, val]) => fn(key, val));
const forEachObj3 = (obj, fn) => Object.keys(obj).forEach(key => fn(key, obj[key]));
const obj = { a: 1, b: 2 };
const func = (key, val) => console.log(key, val);
forEachObj1(obj, func);
forEachObj2(obj, func);
forEachObj3(obj, func);