JS propertyIsEnumerable()方法:檢測一個屬性是否可列舉

2020-07-16 10:05:11
JavaScript propertyIsEnumerable() 是 Object 原型方法(也稱實體方法),它定義在 Object.prototype 物件之上,所有 Object 的範例物件都會繼承 propertyIsEnumerable() 方法。

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,說明可以列舉