枚举对象属性

获得对象上所有可枚举的实例属性

function Person(){}
Person.prototype.name= 'Niccholas';
Person.prototype.age=29;
Person.prototype.sayName = function (){
    console.log(this.name);
}
//获得对象上所有可枚举的实例属性
let keys = Object.keys(Person.prototype);
console.log(keys);//[ 'name', 'age', 'sayName' ]

获得所有实例属性,无论是否可枚举

//列出所有实例属性,无论是否可枚举
keys = Object.getOwnPropertyNames(Person.prototype);
console.log(keys)//[ 'constructor', 'name', 'age', 'sayName' ]

属性枚举的顺序

for-in循环和Object.keys()的枚举顺序是不确定的。Object.getOwnPropertyNames()Object.getOwnPropertySymbols()Object.assign()的枚举顺序是确定性的。

先以升序枚举数值键,然后以插入顺序枚举字符串和符号键。在对象字面量中定义的键以他们逗号分隔的顺序插入。

let k1 = Symbol('k1');
let k2 = Symbol('k2');

let o={
    1:1,
    first: 'first',
    [k1]:'sym2',
    second:'second',
    0:0
};
o[k2]='sym2';
o[3]=3;
o.third='third';
o[2]=2;

console.log(Object.getOwnPropertyNames(o));
console.log(Object.getOwnPropertySymbols(o));