1、for in 遍历数组与对象时,得到的是索引、key值,并且是所有的可枚举属性,包括原型链上的属性(可枚举属性【js自定义属性】/不可枚举属性【对象的内置属性以及 enumerable: false的属性,如数组的length 就是一个内置属性,所以for…in遍历不出来)
2、for of 遍历的是对象的属性所对应的值(value),并不包括原型链上的属性,并且只能是可迭代对象,普通对象是不行的,因为它没有迭代器。
3、for in遍历的缺点:
(1)index索引为字符串型数字,不能直接进行几何运算
(2)遍历顺序有可能不是按照实际内部顺序(浏览器的JavaScript 解析引擎遵循的规范不一致的原因)
(3)使用for in会遍历数组所有的可枚举属性,包括原型(可以通过hasOwnProperty方法来过滤)。
所以for in更适合遍历对象,不要使用for in遍历数组。

4、Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和正常循环遍历该对象时返回的顺序一致。
顺序分三种情况:
(1)Key 都为自然数时,按照自然数的大小进行升序排序
(2)Key都为String类型(Number 也会转为 String)时,则按照加入的时间顺序进行排序
(3)Key 都为symbol时,则按照添加的顺序进行排序的
(4)如果是以上类型的相互结合,结果是先按照自然数升序进行排序,然后按照非数字的 String 的加入时间排序,然后按照 Symbol 的时间顺序进行排序,也就是说他们会先按照上述的分类进行拆分,先按照自然数、非自然数、Symbol 的顺序进行排序,然后根据上述三种类型下内部的顺序进行排序。
5、Object.getOwnPropertyNames()方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组。不会获得原型上的属性。
6、Object.getOwnPropertySymbols() 方法返回一个给定对象自身的所有 Symbol 属性的数组。