獲取物件屬性的幾種方法getOwnPropertyNames/Object.keys()/for...in
阿新 • • 發佈:2019-01-11
- 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"]
- 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"]
- 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)。