Object.propertyIsEnumerable( )
是否可以通过for/in循环看到属性可用性
JavaScript 1.5; JScript 5.5; ECMAScript v3
语法
object.propertyIsEnumerable(propname)
参数
- propname
-
一个字符串,包含object原型的名字。
返回值
如果object具有名为propname的非继承属性,而且该属性是可枚举的(即用for/in循环可以枚举出它),则返回true。
描述
用for/in语句可以遍历一个对象“可枚举”的属性。但并非—个对象的所有属性都是可枚举的,通过JavaScript代码添加到对象的属性是可枚举的,而内部对象的预定义属性(如方法)通常是不可枚举的。propertylsEnumerable()方法提供了区分可枚举属性和不可枚举属性的方法。但要注意,ECMAScript标准规定,propertyIsEnumerable()方法不检测原型链,这意味着它只适用于对象的局部属性,不能检测继承属性的可枚举性。
示例
var o = new Object( ); // 创建一个对象 o.x = 3.14; // 定义—个属性 o.propertyIsEnumerable("x"); // true属性x是局部的、可枚举的 o.propertyIsEnumerable("y"); //false:o没有属性y o.propertyIsEnumerable("toString"); //false:toStrlng属性是继承的 Object.prototype.propertyIsEnumerable("toString"); // false: 枚举的
Bug
当标准限制propertylsEnumerable()方法只能检测非继承属性时,明显是错的。 Internet Explorer 5.5按标准实现了该方法。Nestacpe 6.0实现的propertyIsEnumerable()方法考虑了原型链。虽然这种方法可取,但它与标准冲突,所以Netscape 6.1修改了它,以便与IE 5.5匹配。由于标准中有这个错误,因此该方法不是那么有用。