js 遍历对象

----------------------------------------------------------------------------------------------------------------------------

以下为2022年5月16日更新

遍历对象的方式

1.for..in..

2.Object.keys

3.Object.getOwnPropertyNames()

4.Object.getOwnPropertySymbols()

5.Reflect.ownKeys()

对象的属性划分:

1.原型属性

2.对象自身可枚举属性

3.对象自身不可枚举属性

4.symbol属性

想了解什么是自身可枚举属性和不可枚举属性,查看下方连接

对象自身可枚举属性和不可枚举属性icon-default.png?t=M4ADhttps://blog.csdn.net/xiaoyugan000/article/details/124793989?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165267903416782388051998%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=165267903416782388051998&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-124793989-null-null.142^v9^control,157^v4^control&utm_term=%E4%BB%80%E4%B9%88%E6%98%AF%E5%AF%B9%E8%B1%A1%E8%87%AA%E8%BA%AB%E5%8F%AF%E6%9E%9A%E4%B8%BE%E5%B1%9E%E6%80%A7%E5%92%8C%E4%B8%8D%E5%8F%AF%E6%9E%9A%E4%B8%BE%E5%B1%9E%E6%80%A7&spm=1018.2226.3001.4187es6新添class 类关键字,类的内部定义的方法都是不可枚举的

        //原型属性
		const obj = Object.create({
			bar:'bar'
		})
		//对象自身可枚举属性
		obj.foo = "foo"
		//对象自身不可枚举属性
		Object.defineProperty(obj,'name',{
			enumerable:false,
			value:'zs'
		})
		//symbol属性
		obj[Symbol('age')]="age"

 一、for...in..

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

        //原型属性
		const obj = Object.create({
			bar:'bar'
		})
		//对象自身可枚举属性
		obj.foo = "foo"
		//对象自身不可枚举属性
		Object.defineProperty(obj,'name',{
			enumerable:false,
			value:'zs'
		})
		//symbol属性
		obj[Symbol('age')]="age"
		


		for(var key in obj){
			console.log(key,obj[key])
		}

 

bar原型属性和foo 对像自身可枚举属性被输出

如果不希望原型链上的属性被输出,可配合hasOwnProperty使用

hasOwnProperty():这个方法会查找一个对象有没有某个属性,但不会在原型链上找

        //原型属性
		const obj = Object.create({
			bar:'bar'
		})
		//对象自身可枚举属性
		obj.foo = "foo"
		//对象自身不可枚举属性
		Object.defineProperty(obj,'name',{
			enumerable:false,
			value:'zs'
		})
		//symbol属性
		obj[Symbol('age')]="age"
		
		for(var key in obj){
			if(obj.hasOwnProperty(key)){
				console.log(key,obj[key])
			}
			
		}

可以看到原型属性被过滤掉了。

 关于for...in...的属性输出顺序

1.大于等于0的整数会按照小到大顺序输出,负数和小数会按照字符串处理

2.字符串类型会按照定义的顺序进行输出

3.Symbol属性不进行输出

二、Object.keys()   

es5版本新增

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

        //原型属性
		const obj = Object.create({
			bar:'bar'
		})
		//对象自身可枚举属性
		obj.foo = "foo"
		//对象自身不可枚举属性
		Object.defineProperty(obj,'name',{
			enumerable:false,
			value:'zs'
		})
		//symbol属性
		obj[Symbol('age')]="age"
		
		Object.keys(obj).forEach(key=>{
			console.log(key,obj[key])
		})

只输出了自身的可枚举属性foo

Object.keys()的属性输出顺序同for...in...相同

 三、getOwnpropertyNames()

es5版本新增

获取对象自身的所有属性名,包含不可枚举属性,但不包括原型链上的属性和Symbol属性。

        //原型属性
		const obj = Object.create({
			bar:'bar'
		})
		//对象自身可枚举属性
		obj.foo = "foo"
		//对象自身不可枚举属性
		Object.defineProperty(obj,'name',{
			enumerable:false,
			value:'zs'
		})
		//symbol属性
		obj[Symbol('age')]="age"
		
		Object.getOwnPropertyNames(obj).forEach(key=>{
			console.log(key,obj[key])
		})

 

如何判断对象属性是否为可枚举属性

1.Object.getOwnPropertyDescriptor(对象,’属性‘)

Object.getOwnPropertyDescriptor(对象,’属性‘)方法会返回一个描述对象,描述对象中的enumerable属性若为ture则说名是可枚举属性。

        //原型属性
		const obj = Object.create({
			bar:'bar'
		})
		//对象自身可枚举属性
		obj.foo = "foo"
		//对象自身不可枚举属性
		Object.defineProperty(obj,'name',{
			enumerable:false,
			value:'zs'
		})
		//symbol属性
		obj[Symbol('age')]="age"
		
		console.log(Object.getOwnPropertyDescriptor(obj,'foo'))
		console.log(Object.getOwnPropertyDescriptor(obj,'name'))
		

 

2.Object.prototype.propertyIsEnumerable()

obj.propertyIsEnumerable(要判断的属性) 会返回布尔值,true为可枚举属性。

        //原型属性
		const obj = Object.create({
			bar:'bar'
		})
		//对象自身可枚举属性
		obj.foo = "foo"
		//对象自身不可枚举属性
		Object.defineProperty(obj,'name',{
			enumerable:false,
			value:'zs'
		})
		//symbol属性
		obj[Symbol('age')]="age"
		
		console.log(obj.propertyIsEnumerable('foo'))
		console.log(obj.propertyIsEnumerable('name'))

 四、Object.getOwnPropertySymbols()

es6版本新增

获取对象自身的所有Symbol属性,不包含原型链上的Symbol属性

      //原型属性
		const obj = Object.create({
			bar:'bar',
			[Symbol('sex')]:"sex"
		})
		//对象自身可枚举属性
		obj.foo = "foo"
		//对象自身不可枚举属性
		Object.defineProperty(obj,'name',{
			enumerable:false,
			value:'zs'
		})
		//symbol属性
		obj[Symbol('age')]="age"
		
		Object.getOwnPropertySymbols(obj).forEach(key=>{
			console.log(key,obj[key])
		})

 原型上的Symbol属性并没有输出

五、reflect.ownKeys()

es6新增

获取对象自身的所有属性名,包括不可枚举属性和Symbol属性,不包括原型链

        //原型属性
		const obj = Object.create({
			bar:'bar',
			[Symbol('sex')]:"sex"
		})
		//对象自身可枚举属性
		obj.foo = "foo"
		//对象自身不可枚举属性
		Object.defineProperty(obj,'name',{
			enumerable:false,
			value:'zs'
		})
		//symbol属性
		obj[Symbol('age')]="age"
		
		Reflect.ownKeys(obj).forEach(key=>{
			console.log(key,obj[key])
		})

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值