5种对象属性遍历方法对比

实验代码

// 创建对象x,并分别赋值可遍历与不可遍历属性
let x = {}
x.name = 'tl'
Object.defineProperty(x, 'age', {
    value: 17,
    writable: true,
    enumerable: false,
    configurable: true
})
// 验证是否能遍历symbol属性的键名
Object.defineProperty(x, Symbol('symbolKey'), {
    value: 'symbolVal',
    writable: true,
    enumerable: false,	// 确认与enumerable属性无关
    configurable: true
})


// 创建x的原型对象p,并分别赋值可遍历与不可遍历属性
let p = {}
p.sex = 'm'
Object.defineProperty(p, 'job', {
    value: 'engineer',
    writable: true,
    enumerable: false,
    configurable: true
})

x.__proto__ = p

in

'name' in x		// true
'age' in x		// true
'sex' in x		// true
'job' in x		// true
  • 结论:对于in操作符,只要通过该对象可以访问该属性(在自身访问或通过原型链访问)即返回true,因为 in 操作符没有进行枚举,因此不受enumerable值的影响

for - in

for (let key in x) {
	console.log(key)
}
// name
// sex
  • 结论:拥有in操作符的特性,只要通过该对象可以访问该属性即可以遍历,因此可以得到原型链上的key,同时由于for是明显的枚举操作,因此会受到enumerable值的影响,即不可遍历enumerablefalse的值。即循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)。

Object.keys

Object.keys(x)	// ["name"]
  • 结论:只可访问对象自身的key,同时由于是遍历操作,因此会受到enumerable值的影响,即不可遍历enumerablefalse的值,返回一个key组成的数组。即对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名。

Object.getOwnPropertyNames

Object.getOwnPropertyNames(x)	// ["name", "age"]
  • 结论:只可访问对象自身的key, 但是包括不可枚举的属性,即对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)的键名。

Object.getOwnPropertySymbols

Object.getOwnPropertySymbols(x)	// [Symbol(symbolKey)]
  • 结论:返回一个数组,包含对象自身的所有 Symbol 属性的键名。(与enumerable无关)

Reflect.ownKeys

Reflect.ownKeys(x)	// ["name", "age", Symbol(symbolKey)]
  • 结论:返回一个数组,包含对象自身的(不含继承的)所有键名,不管键名是 Symbol 或字符串,也不管是否可枚举。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tanleiDD

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值