阐明我对JavaScript的理解

时间:2019-02-25 20:36:13

标签: javascript

我正在研究一本有关功能性javascript的书。在那本书中,有以下代码:

const forEachObj = (obj,fn) =>{
    for(let prop in obj){
        if(obj.hasOwnProperty(prop)){
            fn(prop,obj[prop]);
        }
    }
};

我理解这是遍历对象的每个属性,然后询问该对象是否具有该属性,然后运行提供的功能。

我不了解if怎么做。并非总是如此吗?是否只是问从prop获得的obj是否是obj的财产?

4 个答案:

答案 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);