7

我正在与另一位开发人员讨论 hasOwnProperty 以及您应该如何在 javascript 的 for-in 循环中使用它,他提出了一个很好的问题。做for-in循环时,为什么toString、hasOwnProperty等内置方法没有出现在循环中?

4

5 回答 5

5

ECMAScript 为对象(例如原型)中的每个属性定义了几个属性。其中之一是enumerable属性,如果它设置为false,那么该属性将被跳过。

您实际上可以使用以下defineProperty函数操作这些属性:

此方法允许精确添加或修改对象的属性。通过赋值添加的普通属性会创建在属性枚举期间显示的属性(for...in 循环),其值可能会更改,也可能会被删除。此方法允许从默认值更改这些额外的详细信息。

于 2011-05-27T17:42:29.093 回答
4

我很确定这些方法的内部[[Enumerable]]属性设置为,false但我找不到任何明确说明的地方。

更新:显然,不可枚举是规范中定义的属性的默认设置(如果未另行指定)(请参见下面链接中的表 7)。

您可以在规范中找到有关这些属性的更多信息:属性属性

如果true,则该属性将通过 for-in 枚举进行枚举(请参阅12.6.4)。否则,该属性被称为不可枚举的。

于 2011-05-27T17:42:36.390 回答
4

这是每个规格

for...in 循环不会遍历内置属性。其中包括对象的所有内置方法,例如 String 的 indexOf 方法或 Object 的 toString 方法。但是,循环将遍历所有用户定义的属性(包括任何覆盖内置属性的属性)。

来自for..in 上的 Mozilla 开发者网络页面

它在内部基于这些属性的 enumerable 属性,您可以在EcmaScript 规范中查看(搜索“for-in”,“enumerable”属性在第 30 页进行了描述)

于 2011-05-27T17:40:02.737 回答
1

因此,内置属性不可枚举toStringhasOwnProperty也不可枚举。在 ECMAScript 3 中,每个用户定义的方法或属性都是可枚举的。在 ECMAScript 5 中,您可以选择方法或属性是否可枚举。

于 2011-05-27T17:46:14.443 回答
0

也许我误解了你的问题,但这里有一个从 for-in 循环内部工作的 hasOwnProperty 示例:

var i,o={some:"thing"};for(i in o)alert(o.hasOwnProperty("some"));
于 2011-05-27T17:39:35.360 回答