propertyIsEnumerable() 方法用来检测一个属性是否可枚举,如果是就返回 true,否则就返回 false。
如果一个属性同时满足以下两个条件,我们就称它为可枚举属性:
- 该属性是对象的自有属性。也就是对象本身就包含该属性,而不是从原型链继承而来。使用 hasOwnProperty() 方法可以检测自有属性。
- 该属性是自定义的,而不是内置的,可以通过 for in 循环列举出来。
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,说明可以枚举
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/23184.html