JS 获取对象属性各方法区别

116 阅读1分钟

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