[js] js 对象的遍历方式

对象属性划分

  • 原型属性
  • 对象自身可枚举属性
  • 对象自身不可枚举属性
  • Symbol 属性
// 原型属性
const obj = Object.create({ bar: 'bar',[Symbol('s1')]: 's1' });

// 对象自身可枚举属性
obj.foo = 'foo';

// 对象自身不可枚举属性
Object.defineProperty(obj, 'name', {
    enumerable: false,
    value: 'king'
});

// Symbol 属性
obj[Symbol('age')] = 'age';

for … in

获取对象自身可枚举属性+原型链上的可枚举属性, 不包含 Sysbol 属性

for (let k in obj) {
    console.log(k);
}
/*
 foo
 bar
 */

配合 hasOwnProperty() 方法使用, 过滤原型链上的属性

for (let k in obj) {
    if (obj.hasOwnProperty(k)) {
      console.log(k);
    }
}
/*
 foo
 */

补充: class 的 function

类内部定义的所有方法都是不可枚举的

class Person {
    constructor(name) {
            this.name = name;
        }
        // getName 是类的原型上的方法
    getName() {
        return this.name;
    }
}
const p = new Person('wcy');
for (let k in p) {
    console.log(k);
}
// name

for … in 属性顺序

  1. 对于大于等于0的整数, 会按照大小进行排序, 对于小数和负数会当作字符串处理
  2. 对于String类型, 按照定义顺序输出
  3. Symbol 属性会过滤, 不会输出

Object.keys()

获取对象自身的可枚举属性, 不包含原型链上的可枚举属性和Symbo属性

ES5 新增

Object.keys(obj).forEach(item => {
    console.log(item);
});
// foo

Object.keys() 属性顺序

  1. 对于大于等于0的整数, 会按照大小进行排序, 对于小数和负数会当作字符串处理
  2. 对于String类型, 按照定义顺序输出
  3. Symbol 属性会过滤, 不会输出

Object.getOwnPropertyNames()

获取对象自身的所有属性名, 包括不可枚举属性

不包含原型链上的属性和Symbol 属性

ES5 新增

Object.getOwnPropertyNames(obj).forEach(item => {
    console.log(item);
});
/*
foo
name
*/

如何判断属性是否可枚举

Object.getOwnPropertyDescriptor

Object.prototype.propertyIsEnumerable

Object.getOwnPropertySymbols()

获取对象自身的所有 Symbol 属性

不包含原型链上的 Symbol 属性

ES6 新增

Object.getOwnPropertySymbols(obj).forEach(item => {
    console.log(item);
})
// Symbol(age)

Reflect.ownKeys()

获取对象自身所有属性名, 包括不可枚举+Symbol 属性

ES6 新增

Reflect.ownKeys(obj).forEach(item => {
    console.log(item);
});
/*
foo
name
Symbol(age)
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值