對象可枚舉和不可枚舉屬性

 在JavaScript中,對象的屬性分爲可枚舉和不可枚舉之分,它們是由屬性的enumerable值決定的。可枚舉性決定了這個屬性可否被for…in查找遍歷到。函數

1、怎麼判斷屬性是否可枚舉性能

  js中基本包裝類型的原型屬性是不可枚舉的,如Object, Array, Number等,若是你寫出這樣的代碼遍歷其中的屬性:this

var num = new Number();
for(var pro in num) {
    console.log("num." + pro + " = " + num[pro]);
}

它的輸出結果會是空。這是由於Number中內置的屬性是不可枚舉的,因此不能被for…in訪問到。spa

Object對象的 propertyIsEnumerable() 方法能夠判斷此對象是否包含某個屬性,而且這個屬性是否可枚舉。prototype

須要注意的是:若是判斷的屬性存在於Object對象的原型內,無論它是否可枚舉都會返回false。code

2、枚舉性的做用對象

屬性的枚舉性會影響如下三個函數的結果:blog

for…inip

Object.keys()get

JSON.stringify()

先看一個例子,按以下方法建立zx對象:

function Person() {
    this.name = "ZX";
}
Person.prototype = {
    constructor: Person,
    job: "student",
};
 
var ZX = new Person();
Object.defineProperty(zx, "sex", {
    value: "female",
    enumerable: false
});

其中用defineProperty爲對象定義了一個名爲」sex」的不可枚舉屬性

接下來作如下驗證:

for(var pro in ZX) {
    console.log("ZX." + pro + " = " + ZX[pro]);
  }

遍歷結果:

枚舉性檢驗1

能夠看到除了」sex「以外的屬性都遍歷到了

2.

console.log(Object.keys(kxy));

結果:

枚舉性檢驗2

只包含」name」屬性,說明該方法只能返回對象自己具備的可枚舉屬性。

3.

console.log(JSON.stringify(kxy));

結果:

可枚舉性檢驗3

此方法也只能讀取對象自己的可枚舉屬性,並序列化爲JSON對象。

相關文章
相關標籤/搜索