for in 和 for of 的区别
-
for in遍历的是数组的索引(或对象的键名),而for of遍历的是数组元素值。
-
使用for in会遍历数组所有的可枚举属性,包括原型,例如上栗的原型方法method和name属性 。而for of遍历的只是数组内的元素,而不包括数组的原型属性method和索引name 。
Array.prototype.method=function(){ console.log(this.length); } var myArray=[1,2,4] myArray.name="数组"; for (var index in myArray) { console.log(myArray[index]); } //1 //2 //4 //数组 //[Function (anonymous)] for (var value of myArray) { console.log(value); } //1 //2 //4注意:如果不想遍历原型方法和属性的话,可以在循环内部判断一下,hasOwnPropery方法可以判断某属性是否是该对象的实例属性 。而且通过ES5的Object.keys(myObject)获取对象的实例属性组成的数组,不包括原型方法和属性
-
for in遍历对象顺序有可能不是按照实际对象的内部顺序, 这是因为:
对象的遍历输出并不是按照顺序来的,这跟浏览器有关系,Chrome跟IE是不一样的,所以给出以下结论:
Chrome Opera 的 JavaScript 解析引擎遵循的是新版 ECMA-262 第五版规范。因此,使用 for-in 语句遍历对象属性时遍历顺序时并非由属性构建顺序决定。
而 IE6 IE7 IE8 Firefox Safari 的 JavaScript 解析引擎遵循的是较老的 ECMA-262 第三版规范,属性遍历顺序由属性构建的顺序决定。Chrome Opera 中使用 for-in 语句遍历对象属性时会遵循一个规律:
它们会先提取所有 key 的 parseFloat 值为非负整数的属性,然后根据数字顺序对属性排序首先遍历出来,然后按照对象定义的顺序遍历余下的所有属性。那么,解决办法呢?
可以把对象通过Object.keys提取对象的key出来变成数组,然后通过数组的排序,然后遍历数组,通过key去取对象的属性值。
而for of 适用与遍历数/数组对象/字符串/map/set等拥有迭代器对象的集合,但是不能遍历对象,因为对象中没有迭代器对象 。并且与forEach()不同的是,它可以正确响应break、continue和return语句
var obj={name:'abc','3':'ccc',age:23,school:'sdfds',class:'dfd',hobby:'dsfd'}; let res = Object.keys(obj) console.log(res) //[ '3', 'name', 'age', 'school', 'class', 'hobby' ]

浙公网安备 33010602011771号