在一些开发场景中,可能需要获取一个对象的所有属性字段名,或者同时获取属性字段名和属性值,比如下面这样commonobject:letobj={type:1,keyword:'js'}这个obj对象只有type和keyword两个属性字段,属性值为1和js。实际过程中的对象可能更复杂,字段更多。对于遍历一个对象的属性,最容易想到的方法就是使用for循环,因为它更直接,而且通常用得比较多。除了直接使用for循环外,还有其他几种方式。这里主要分为三类,一共7个方法:for循环方法for...infor...ofObject方法Object.keys()Object.entries()Object.getOwnPropertyNames()Object.getOwnPropertySymbols()Reflect方法Reflect。自己的钥匙()1。for...infor...in语句可用于遍历对象的所有可枚举属性,包括继承的属性。下面的代码用于打印一个obj对象的所有属性字段和属性值:letobj={type:1,keyword:"js"};for(letkeyinobj){console.log(key,obj[key])}输出结果如下:type1keywordjs2,for...offor...of语句主要用于循环一个属性可迭代的对象。要成为可迭代对象,一个对象必须实现@@iterator方法,这意味着该对象(或其原型链上的对象)必须具有一个键为@@iterator的属性,可通过常量Symbol.iterator访问。对于普通对象,它们不是可迭代对象。如果直接使用for...of遍历,会报错。让我们测试一下:letobj={type:1,keyword:"js"};for(letkeyofobj){console.log(key,obj[key])}运行后出现如下错误,直接提示objisnotaniterableobject,如下:那么如何使用for...of要遍历对象属性,首先需要做的是将obj对象转化为可迭代对象。在这里您可以使用Object.keys()方法。调整后的代码如下:letobj={type:1,keyword:"js"};for(letkeyofObject.keys(obj)){console.log(key,obj[key])}输出结果如下:type1keywordjs3,Object.keys()在上面的for...of语句中,object.keys已经使用()方法将obj对象转换为可迭代对象。其实你也可以直接使用Object.keys()方法来遍历一个对象的属性。我们来看看它的定义。Object.keys()方法会返回一个对象,该对象由一个给定对象本身的可枚举属性组成的数组,数组中属性名的顺序与对象正常循环时返回的顺序一致。测试代码如下:letobj={type:1,keyword:"js"};Object.keys(obj).forEach(key=>console.log(key,obj[key]))的输出如下:type1keywordjs4,Object.entries()除了上述的Object.keys()方法,还有使用Object.entries()方法,其定义如下:Object.entries()方法返回给定对象自身可枚举属性的键值对数组,排列在与使用for...in循环遍历对象时返回的顺序相同(区别在于for-in循环还枚举了原型链中的属性)。测试代码如下:letobj={type:1,keyword:"js"};Object.entries(obj).forEach(item=>console.log(item[0],item[1]))输出结果如下:type1keywordjs方法和Object.keys()方法的区别就是循环返回的结果是键值对,而Object.keys()只返回对象的属性名,不包含值。如果只是想遍历一个对象的所有属性值,那么可以使用另外一个方法:Object.values()5、Object.getOwnPropertyNames()这个方法也可以用来遍历一个对象的属性,其定义如下:Object.getOwnPropertyNames()方法返回一个数组,该数组由指定对象的所有自身属性的属性名组成(包括不可枚举但不包括符号值作为名称的属性)。我们看一下测试代码:letobj={type:1,keyword:"js"};Object.getOwnPropertyNames(obj).forEach(key=>console.log(key,obj[key]))输出结果如下:type1keywordjs6,Object.getOwnPropertySymbols()这个方法也可以用来遍历属性对象的属性,其定义如下:Object.getOwnPropertySymbols()方法返回给定对象本身的所有Symbol属性的数组。从它的定义可以看出,它只能用来遍历Symbol属性,不能遍历非Symbol属性。对于一个普通的对象来说,如果没有Symbol属性,那么实际上是不可能使用这种方法来遍历的。具体测试代码如下:letobj={type:1,keyword:"js"};Object.getOwnPropertySymbols(obj).forEach(key=>console.log(key,obj[key]))不能输出任何结果因为obj对象没有任何Symbol属性,使用Object.getOwnPropertySymbols(obj)方法,只会得到一个空数组。我们定义一个包含Symbol属性的对象,同时遍历这个对象的属性:lettype=Symbol('type');letkeyword=Symbol('keyword');letsymbolObj={};symbolObj[type]=1;symbolObj[keyword]='js';symbolObj['name']='javascript';Object.getOwnPropertySymbols(symbolObj).forEach(key=>console.log(key,symbolObj[key]));输出结果如下:Symbol(type)1Symbol(keyword)'js'symbolObj对象虽然有3个属性,但是只会输出其中2个:Symbol(type)和Symbol(keyword)属性,普通属性名不会被输出。7、Reflect.ownKeys()除了使用Object提供的静态方法外,还可以使用Reflect.ownKeys()方法遍历对象属性。首先我们看一下Reflect对象是什么:Reflect是一个内置对象,提供拦截JavaScript操作的方法,不能通过new运算符调用,也可以将Reflect对象作为函数调用。Reflect的所有属性和方法都是静态的(就像Math对象一样)。让我们看一下Reflect.ownKeys()方法的定义。静态方法Reflect.ownKeys()返回一个由目标对象本身的属性键组成的数组。从它的定义可以看出,它类似于Object.keys()方法,测试代码如下:letobj={type:1,keyword:"js"};Reflect.ownKeys(obj)。forEach(key=>consoleThe.log(key,obj[key]))的输出如下:type1keywordjs参考https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Loops_and_iterationhttps://developer.mozilla。org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Objecthttps://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Reflect
