
hasOwnProperty 与 PropertyIsEnumerable 是 JavaScript 中用于检查对象属性的两种方法。hasOwnProperty 主要检查对象自身而非原型链中是否具有特定属性。例如:若对象 obj 包含属性 x, 则 obj.hasOwnProperty('x') 返回 true,反之则为 false。进一步示例,若 obj 通过原型链获取属性 x,hasOwnProperty('x') 依旧返回 false。若对象 obj 包含自定义属性 toString,hasOwnProperty('toString') 返回 true。PropertyIsEnumerable 方法则用于确认属性是否可枚举,即是否可由 for...in 循环访问。所有自定义属性默认可枚举,故 for (key in {}) 会遍历到所有自定义属性。但 Object.prototype.toString 属性不可枚举,for...in 不会遍历到该属性。为了防止自定义 toString 属性被枚举,可使用 Object.defineProperty 设置 enumerable 属性为 false。若需仅遍历对象本身属性而非原型链,使用 Object.keys(obj).forEach 方法。检测 PropertyIsEnumerable 的必要性较低,Object.getOwnPropertyDescriptor 方法能提供更精确的信息,仅需检查 own property 是否可枚举。综上,hasOwnProperty 用于确认对象自身属性,而 PropertyIsEnumerable 则用于检查属性可枚举性,两者各有用途,但后者用到的场合较少,通常被前者替代。
