0. 对象
用数组举例:
let obj = [1, 2, 3];
obj.__proto__.name = "obj";
Object.defineProperty(a.__proto__, 'p', {value:3, enumerable: false})
1. for...in
for...in可以访问对象及其原型链上的所有可枚举的属性
for(let i in obj) {
console.log(i);
}
//0
//1
//2
//name
//由于p不可遍历,没有出现在结果里
2. Object.keys()
Object.keys()返回一个数组,值为当前对象自身里的可枚举的属性
for(let i of Object.keys(obj)) {
console.log(i);
}
//0
//1
//2
// 相比for...in,少了name属性
3. Object.getOwnPropertyNames()
Object.getOwnPropertyNames()返回一个数组,值为当前对象自身里的所有属性(包括可枚举和不可枚举)
for(let i in Object.getOwnPropertyNames(a)) {
console.log(i);
}
//0
//1
//2
//length #不可枚举
4. in 操作符
in 操作符判断对象是否有某属性(包括继承的以及不可枚举的)
"name" in a // true
'1' in a //true
"p" in a //true