慎重用for...in与for...of
for...in
和for...of
都是用于数据的遍历。for...in
是ES5
标准,用于遍历对象属性(键),而for...of
是ES6
标准,是对for...in
的修正,用于遍历对象元素(值),for...of
兼容性不是很好(除了PC端老顽固IE
之外,移动端某些安卓机和浏览器也是不支持它,具体可以查看MDN)。
for…in
1 | Object.prototype.objMethod = function() {}; |
由上面的例子可以看出,for...in
的一些特性:
- 可以对
JSON
对象(数组和对象)进行遍历 for...in
会遍历对象的所有可枚举属性,包括原型,例如一些我们挂载到原型链上的一些method
和name
- 遍历很有可能不是按照对象的内部顺序(我们预期的)进行
- 对数组遍历时index索引为字符串型,在某些时候直接进行几何运算可能达不到预期结果
for…of
for...in
貌似强大的同时也带来很多副作用,想要达到预期的记过需要额外的代码来处理,所以for...of
应运而生
1 | Object.prototype.objMethod = function() {}; |
可以看出,for...of
方法在for...in
上做了优化,并且限制了只能遍历数组。当然在ES5
中,具有遍历数组功能的还有map
、filter
、some
、every
、reduce
、reduceRight
等,但是需要注意的是,有些方法不能被break
句柄打断循环,使用retun
也不能返回到外层,如forEach
其实不难看出for...in
是属于鸡肋属性了,而for...of
由于兼容性原因,在某些地方也应该慎用,即使是移动端也要慎用,应该它并不兼容所有内核。
参考
for…in
for…of
for-of循环是遍历实现iterator接口的成员