我正在与另一位开发人员讨论 hasOwnProperty 以及您应该如何在 javascript 的 for-in 循环中使用它,他提出了一个很好的问题。做for-in循环时,为什么toString、hasOwnProperty等内置方法没有出现在循环中?
5 回答
ECMAScript 为对象(例如原型)中的每个属性定义了几个属性。其中之一是enumerable
属性,如果它设置为false
,那么该属性将被跳过。
您实际上可以使用以下defineProperty
函数操作这些属性:
此方法允许精确添加或修改对象的属性。通过赋值添加的普通属性会创建在属性枚举期间显示的属性(for...in 循环),其值可能会更改,也可能会被删除。此方法允许从默认值更改这些额外的详细信息。
这是每个规格
for...in 循环不会遍历内置属性。其中包括对象的所有内置方法,例如 String 的 indexOf 方法或 Object 的 toString 方法。但是,循环将遍历所有用户定义的属性(包括任何覆盖内置属性的属性)。
它在内部基于这些属性的 enumerable 属性,您可以在EcmaScript 规范中查看(搜索“for-in”,“enumerable”属性在第 30 页进行了描述)
因此,内置属性不可枚举toString
,hasOwnProperty
也不可枚举。在 ECMAScript 3 中,每个用户定义的方法或属性都是可枚举的。在 ECMAScript 5 中,您可以选择方法或属性是否可枚举。
也许我误解了你的问题,但这里有一个从 for-in 循环内部工作的 hasOwnProperty 示例:
var i,o={some:"thing"};for(i in o)alert(o.hasOwnProperty("some"));