JavaScript propertyIsEnumerable() 是 Object 原型方法(也称实例方法),它定义在 Object.prototype 对象之上,所有 Object 的实例对象都会继承 propertyIsEnumerable() 方法。
propertyIsEnumerable() 方法用来检测一个属性是否可枚举,如果是就返回 true,否则就返回 false。
如果一个属性同时满足以下两个条件,我们就称它为可枚举属性:
propertyIsEnumerable() 的语法格式如下:
参数说明:propertyName 参数表示要检测的属性名称。
返回值:propertyIsEnumerable() 方法的返回值为 Boolean 类型。如果 propertyName 是可枚举属性,那么返回 true,否则返回 false。
在大多数情况下,使用 in 运算符是探测对象中属性是否存在的最好途径。然而在某些情况下,可能希望仅在当一个属性是自有属性时才检查其是否存在。in 运算符会检查自有属性和原型属性,所以不得不选择hasOwnProperty() 方法。
var person = {
'first-name' : 'zhang',
'last-name' : 'san',
sayName : function () {
console.log(this['first-name'] + this['last-name']);
}
};
console.log('first-name' in person); //true
console.log(person.hasOwnProperty('first-name')); //true
console.log('toString' in person); //true
console.log(person.hasOwnProperty('toString')); //false
for/in 语句可用来遍历一个对象中的所有属性名,该枚举过程将会列出所有的属性,包括原型属性和自有属性。很多情况下需要过滤一些不想要的值,如方法或原型属性。最为常用的过滤器是 hasOwnProperty 方法,也可以使用 typeof 运算符进行排除。
for (var name in person) {
if (typeof person[name] != 'function') { //排除所有方法
console.log(name + ':' + person[name]);
}
}
使用 for/in 语句枚举,属性名出现的顺序是不确定的,最好的办法就是完全避免使用 for/in 语句,可以创建一个数组,在其中以正确的顺序包含属性名。通过使用 for/in 语句,可以不用担心可能会出现原型属性,并且按正确的顺序取得它们的值。
var properties = ['sayName', 'first-name', 'last-name']; //使用数组定义枚举顺序
for (var i = 0; i < properties.length; i ++) {
console.log(properties[i] + ':' + person[properties[i]]);
}
对于 JavaScript 对象来说,用户可以使用 for/in 语句遍历一个对象“可枚举”的属性。但并不是所有对象属性都可以枚举,只有用户自定义的自有属性和原型属性才允许枚举。
对于下面的自定义对象 o,使用 for/in 循环可以遍历它的所有自有属性、原型属性,但是 JavaScript 允许枚举的属性只有 a、b 和 c。
function F() {
this.a = 1;
this.b = 2;
}
F.prototype.c = 3;
F.d = 4;
var o = new F();
for (var I in o) {
console.log(I);
}
为了判定指定自有属性是否允许枚举,Object 对象定义了 propertyIsEnumerable() 方法。该方法的返回值为 true,则说明指定的自有属性可以枚举,否则是不允许枚举的。
console.log(o.propertyIsEnumerable("a")); //返回值为true,说明可以枚举
console.log(o.propertyIsEnumerable("b")); //返回值为true,说明可以枚举
console.log(o.propertyIsEnumerable("c")); //返回值为false,说明不可以枚举
console.log(o.propertyIsEnumerable("d")); //返回值为false,说明不可以枚举
var o = F;
console.log(o.propertyIsEnumerable("d")); //返回值为true,说明可以枚举