1. 程式人生 > >獲取物件屬性的幾種方法getOwnPropertyNames/Object.keys()/for...in

獲取物件屬性的幾種方法getOwnPropertyNames/Object.keys()/for...in

  1. getOwnPropertyNames
    獲取物件自身的可列舉和不可列舉屬性,不包括屬性名為Symbol值的屬性
var obj = {name: 'zyp', age: 18};
Object.defineProperty(obj, 'like', {
	enumerable: false,
	value: 'reading'
})
Object.defineProperty(obj, Symbol(), {
	value: 'symbol'
})
var properNameArr = Object.getOwnPropertyNames(obj); // properNameArr結果為["name", "age", "like"]
  1. Object.keys()
    獲取物件自身的可列舉屬性
var obj = {name: 'zyp', age: 18};
Object.defineProperty(obj, 'like', {
	enumerable: false,
	value: 'reading'
})
Object.defineProperty(obj, Symbol(), {
	value: 'symbol'
})
var properNameArr = Object.keys(obj);  // properNameArr結果為["name", "age"]
  1. for…in
    獲取物件自身及其原型鏈上的可列舉屬性
var obj = {name: 'zyp', age: 18};
Object.defineProperty(obj, 'like', {
	enumerable: false,
	value: 'reading'
})
Object.defineProperty(obj, Symbol(), {
	value: 'symbol'
})
Object.prototype.haha = 'haha'
var properNameArr = [];
for(let i in obj) {
	properNameArr.push(i)
}
console.log(properNameArr) // properNameArr結果為["name", "age", "haha"]

要注意的是:以上三種方法遍歷物件的可列舉屬性時,返回的結果順序是不確定的,因為這種無序性,因此不建議在使用for…in迴圈進行遍歷是對物件的屬性進行刪除/新增/修改等操作,除非是針對當前正在被訪問的屬性。也因為這種無序性,在對陣列這種有順序的資料結構進行遍歷時,最好不要用for…in(改用for迴圈/forEach/for…of)。