for...in的区别是以任意顺序迭代一个对象的可枚举属性,包括继承的可枚举属性。(包括继承属性)(不包括Symbol)可以遍历数组遍历顺序先遍历(非负)整型属性(整数属性,升序排列),然后按照创建的顺序遍历其他属性letobj={"49":"Germany","41":"Switzerland","44":"GreatBritain","1":"USA",name:"ljy","-5":"jeu","type":"lily","2.34":"pai","-6":"dhoe"};for(letkeyinobj){console.log(key);}结果为:1414449name-5type2.**34**-6原因是ECMAScript规范定义了“数值属性按照索引值升序排列,字符串属性按照索引值升序排列到创造的顺序。》这里我们把对象中的数值属性称为“排序属性”。这里有一篇详细的文章>不推荐使用for-in遍历数组*for-in是为遍历对象属性而构建的,有可能遍历数组因为数组也是一个对象*Order*for-in遍历得到的key都是字符串类型,对应数组'0','1',...*如果数组添加了自定义的可枚举属性,也会遍历-offor-of是ES6新的迭代器(Iterator)方法,只要对象有Symbol.iterator属性,就认为有iterator接口,可以使用Array,Map,Set,String,TypedArray,argumentsobject,NodeList对象都可以遍历,普通object对象不支持,需要实现Symbol.iterator方法for-of,遍历顺序按照每个成员加入的顺序数据结构.for-of遍历数组获取key值.d默认迭代器不包含Inherit属性,除非自定义迭代器vara=[1,'10',0,'s','']for(letkeyofa){console.log(key);}1100sObject.keysObject.keys、Object.values和Object.entries按照for-in返回顺序遍历对象自身(不包括继承)的所有可枚举属性(不包括Symbol),同样的字符串leta=[1,1,2,3]控制台。log(Object.keys(a))//result['0','1','2','3']题外话,数组长度属性不可枚举Object.getOwnPropertyDescriptor(a,'length')//结果{可配置:假,可枚举:假,值:4,可写:真}
