ES6学习之对象的遍历

写在前面的话:

在es6中一共有五种遍历对象的方法,如下:

(1)for...in

for...in循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)。

(2)Object.keys(obj)

Object.keys返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名。

(3)Object.getOwnPropertyNames(obj)

Object.getOwnPropertyNames返回一个数组,包含对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)的键名。

(4)Object.getOwnPropertySymbols(obj)

Object.getOwnPropertySymbols返回一个数组,包含对象自身的所有 Symbol 属性的键名。

(5)Reflect.ownKeys(obj)

Reflect.ownKeys返回一个数组,包含对象自身的所有键名,不管键名是 Symbol 或字符串,也不管是否可枚举。

for...in

<script>
            let  firstName=Symbol('firstName');
            let person={
                name:'lin',
                hands:'two'
            }
            let boy={
                name:'帅哥',
                height:178,
                weight:74,
                
            };
            boy[firstName]='dddddd';
Object.defineProperty(boy,'height',{enumerable:false})
Object.setPrototypeOf(boy,person);
for (let attr in boy)
{ console.log(attr)
console.log(boy[attr])
}
// (1)for...in

console.log('boy',boy); // for...in循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)。 </script>

其结果为:

从结果可以看出对 boy对象的遍历 可以得到他的直接身的属性name,height,weight还有从person继承的hand是属性,然而遍历不出Symbol属性和不可枚举的height属性。

Object.keys(obj)

    <script>
            let  firstName=Symbol('firstName');
            let person={
                name:'lin',
                hands:'two'
            }
            let boy={
                name:'帅哥',
                height:178,
                weight:74,
                
            };
            boy[firstName]='dddddd';
       Object.defineProperty(boy,'height',{enumerable:false}) Object.setPrototypeOf(boy,person);
var arr= Object.keys(boy); console.log('arr',arr); </script>

还是之前的例子这次使用object.keys()来遍历其结果为:

从结果可知Object.key()方法只能遍历出自身的属性 且Symbol属性也遍历不出,也遍历不出不可枚举的属性。

Object.getOwnPropertyNames()

<script>
            let  firstName=Symbol('firstName');
            let person={
                name:'lin',
                hands:'two'
            }
            let boy={
                name:'帅哥',
                height:178,
                weight:74,
                
            };
            boy[firstName]='dddddd';
            Object.setPrototypeOf(boy,person);
            Object.defineProperty(boy,'height',{enumerable:false})
            var  arr=    Object.getOwnPropertyNames(boy);
            console.log('arr',arr);
        </script>
        

使用object.getOwnPropertyNames()方法得到的结果如下:

 

该方法可以遍历出自身的属性包括不可枚举的属性,但是遍历不出Symbol属性和继承属性。

Object.getOwnPropertySymbols(obj)

<script>
            let  firstName=Symbol('firstName');
            let  lastName=Symbol('lastName');
            let person={
                name:'lin',
                hands:'two'
            }
            let boy={
                name:'帅哥',
                height:178,
                weight:74,
                
            };
            person[lastName]='lastnme';
            boy[firstName]='dddddd';
            Object.setPrototypeOf(boy,person);
            Object.defineProperty(boy,'height',{enumerable:false})
            var  arr=    Object.getOwnPropertySymbols(boy);
            console.log('arr',arr);
        </script>

该 Object.getOwnPropertySymbols()方法只能遍历出自身体的symbol属性,遍历不出原型对象person中的lastName属性。

Reflect.ownKeys(obj)

    <script>
            let  firstName=Symbol('firstName');
            let  lastName=Symbol('lastName');
            let person={
                name:'lin',
                hands:'two'
            }
            let boy={
                name:'帅哥',
                height:178,
                weight:74,
                
            };
            person[lastName]='lastnme';
            boy[firstName]='dddddd';
            Object.setPrototypeOf(boy,person);
            Object.defineProperty(boy,'height',{enumerable:false})
            var  arr= Reflect.ownKeys(boy);
            console.log('arr',arr);
        </script>

 Reflect.ownKeys(方法可以遍历出包含对象自身的所有键名,不管键名是 Symbol 或字符串,也不管是否可枚举。

以上的 5 种方法遍历对象的键名,都遵守同样的属性遍历的次序规则。

  • 首先遍历所有数值键,按照数值升序排列。
  • 其次遍历所有字符串键,按照加入时间升序排列。
  • 最后遍历所有 Symbol 键,按照加入时间升序排列。
posted @ 2020-03-15 13:30  七分暖  阅读(547)  评论(0编辑  收藏  举报
回到顶部