1.   for in 循环

for in 循环诞生于es5,主要用于遍历对象的可枚举属性(自有属性、继承自原型的属性)。可枚举,可理解为可遍历,是由属性的enumerable值决定的,在js中基本包装类型的原型属性是不可枚举的

jquery map嵌套遍历 js遍历嵌套对象_javascript

jquery map嵌套遍历 js遍历嵌套对象_字符串_02

如果对象中还嵌套有对象,可以对内部对象做循环,比如这样:

jquery map嵌套遍历 js遍历嵌套对象_数组_03

也可以这样:

jquery map嵌套遍历 js遍历嵌套对象_数组_04

 

2. Object.keys(obj)

返回值是:以数组形式返回对象属性名,也就是返回对象的key。        //如果obj是数组,则返回数组的下标

jquery map嵌套遍历 js遍历嵌套对象_字符串_05

jquery map嵌套遍历 js遍历嵌套对象_作用域_06

在ES5里,如果此方法的参数不是对象(而是一个原始值),那么它会抛出 TypeError。在ES6中,非对象的参数将被强制转换为一个对象,我猜应该是强制转换为了一个数组对象: var obj = ['a', 'b', 'c'], 因为返回的是数组下标. 

jquery map嵌套遍历 js遍历嵌套对象_javascript_07

jquery map嵌套遍历 js遍历嵌套对象_javascript_08

 

3. Object.getOwnPropertyNames(obj)

返回对象的所有自身属性的属性名(包括不可枚举属性, 但不包括Symbol属性)组成的数组。

和Object.keys()相同:以数组形式返回对象属性名,也就是返回对象的key。       //如果obj是数组,则返回数组的下标

jquery map嵌套遍历 js遍历嵌套对象_字符串_09

jquery map嵌套遍历 js遍历嵌套对象_数组_10

jquery map嵌套遍历 js遍历嵌套对象_作用域_11

jquery map嵌套遍历 js遍历嵌套对象_javascript_12

Object.getOwnPropertyNames() 与 Object.keys()的区别是, 前者会返回不可枚举属性, 比如:

jquery map嵌套遍历 js遍历嵌套对象_数组_13

jquery map嵌套遍历 js遍历嵌套对象_作用域_14

 

4.Object.getOwnPropertySymbols(obj)

方法对象自身的所有 Symbol 属性的数组。

与Object.getOwnPropertyNames()类似,可以将对象的所有符号属性作为 Symbol 数组获取。 但是,Object.getOwnPropertyNames()本身不包含对象的 Symbol 属性,只包含字符串属性。

jquery map嵌套遍历 js遍历嵌套对象_jquery map嵌套遍历_15

jquery map嵌套遍历 js遍历嵌套对象_数组_16

因为所有的对象在初始化的时候不会包含任何的 Symbol,除非你在对象上赋值了 Symbol 否则Object.getOwnPropertySymbols()只会返回一个空的数组。

我在学习中发现: 如果设置 var name = Symbol('name1'); 就会报错 "Cannot convert a Symbol value to a string", 因为定义的变量会把它提升到当前函数作用域顶部,如果是浏览器全局作用域就会成为window的一个属性, 这就触犯了Symbol()隐式类型转换. 解决办法: 用let声明, 或者像我这样用非window属性名

jquery map嵌套遍历 js遍历嵌套对象_数组_17

jquery map嵌套遍历 js遍历嵌套对象_作用域_18

 

5.Reflect.ownKeys(obj)

注意这里是Reflect.ownKeys, 而不是Object.ownKeys    

Reflect是es6提供的一个内建的对象,用来提供方法去拦截JavaScript的操作。
Reflect不是一个函数对象,所以它是不可构造的,
也就是说它不是一个构造器,你不能通过`new`操作符去新建或者将其作为一个函数去调用Reflect对象。
Reflect的所有属性和方法都是静态的。

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

可以这样理解:  Reflect.ownKeys() = Object.getOwnPropertyNames() + Object.getOwnPropertySymbols()

 

6.Reflect.enumerate(obj)

返回一个Iterator对象,遍历对象自身的和继承的所有可枚举属性(不含Symbol属性), 与for ... in 循环相同.

不过, Reflect.enumerate() 在ECMAScript 2016 (es7) 中已被移除,在各浏览器中已被废弃。