为什么在JavaScript的for-in循环中不显示toString和hasOwnProperty(etc)?

| 我与另一位开发人员谈论过hasOwnProperty,以及您应该如何在javascript中的for-in循环中使用它,他有一个很好的问题。在进行for-in循环时,为什么toString,hasOwnProperty和其他内置方法不会出现在循环中?     
已邀请:
        ECMAScript为对象(例如原型)中找到的每个属性定义了几个属性。其中之一是ѭ0these属性,如果将其设置为
false
,则将跳过该属性。 您实际上可以使用
defineProperty
函数来操纵这些属性:   此方法允许精确添加或修改对象上的属性。通过分配添加常规属性会创建在属性枚举(for ... in循环)中显示的属性,其值可能会更改,并且可能会删除。此方法允许将这些额外的详细信息从其默认值更改。     
        根据规格   for ... in循环不会迭代   内置属性。这些包括所有   对象的内置方法,例如   字符串的indexOf方法或对象的   toString方法。但是,循环   将遍历所有用户定义的   属性(包括任何   覆盖内置属性)。 在Mozilla开发人员网络页面上for..in 它在内部基于这些属性的可枚举属性,您可以在EcmaScript规范中进行检查(搜索\“ for-in \”,\“ enumerable \”属性在第30页中进行了介绍)     
        我很确定这些方法的内部[[Enumerable]]属性设置为
false
,但是在明确声明的地方我找不到任何东西。 更新:显然,规范中定义的属性的默认设置是不可枚举的(如果未另行指定)(请参见下面链接中的表7)。 您可以在规范中找到有关这些属性的更多信息:属性属性:   如果为
true
,则该属性将通过for-in枚举进行枚举(请参见12.6.4)。否则,该属性被称为不可枚举。     
        内置属性不可枚举,因此
toString
hasOwnProperty
不可枚举。在ECMAScript 3中,每个用户定义的方法或属性都是可枚举的。在ECMAScript 5中,您可以选择方法或属性是否可枚举。     
        也许我误解了您的问题,但是这是hasOwnProperty在for-in循环内部工作的一个示例:
var i,o={some:\"thing\"};for(i in o)alert(o.hasOwnProperty(\"some\"));
    

要回复问题请先登录注册