首页 > 编程笔记 > JavaScript笔记 > JS面向对象编程

JS propertyIsEnumerable()方法:检测一个属性是否可枚举

JavaScript propertyIsEnumerable() 是 Object 原型方法(也称实例方法),它定义在 Object.prototype 对象之上,所有 Object 的实例对象都会继承 propertyIsEnumerable() 方法。

propertyIsEnumerable() 方法用来检测一个属性是否可枚举,如果是就返回 true,否则就返回 false。

如果一个属性同时满足以下两个条件,我们就称它为可枚举属性:
propertyIsEnumerable() 的语法格式如下:

object.propertyIsEnumerable("propertyName");

参数说明: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

示例1

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 语句遍历一个对象“可枚举”的属性。但并不是所有对象属性都可以枚举,只有用户自定义的自有属性和原型属性才允许枚举。

示例2

对于下面的自定义对象 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);
}

示例3

为了判定指定自有属性是否允许枚举,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,说明可以枚举

所有教程

优秀文章