关于for的一系列
遍历数组
for循环
遍历数组常用for循环 ES5遍历数组的方法有forEach,map,filter,some,every,reduce等
使用forEach不能使用break和return跳出循环
es5的forEach方法其实性能比for循环还要弱,使用for循环可以将长度用遍历存起来,可以优化性能
Array.prototype.method = function () { |
for…in
使用for in 遍历数组的毛病
1.index是字符串
2.遍历顺序可能不是数组的内部顺序
3.会遍历数组的可枚举对象包括原型,例如上面的method和name
所以for in 不适合遍历数组
for(let index in myArray) { |
for…of
使用for of 遍历的是数组的值而 for in 遍历的是数组的键名
for of遍历只会遍历数组自身的值,而不会去遍历原型和其他属性
for(let val of myArray) { |
遍历对象
1.使用for in遍历对象
Object.prototype.method = function () { |
如果不想遍历原型上的方法和属性可以使用hasOwnPropery
hasOwnPropery可以判断某属性是否是对象的实例属性,从而过滤掉原型上的属性
for(let i in myObj) { |
for…of
也可以使用for of 搭配Object.keys 来遍历对象 返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含Symbol属性).
相关的Object属性还有
Object.getOwnPropertyNames(obj) 返回一个数组,包含对象自身的所有属性(不含Symbol属性,但是包括不可枚举属性).
使用Reflect.ownKeys(obj)遍历 返回一个数组,包含对象自身的所有属性,不管属性名是Symbol或字符串,也不管是否可枚举.
for(let key of Object.keys(myObj)) { |
如果实在想用 for of遍历对象,可以给该对象添加Symbol.iterator迭代器接口
接口自己实现
for of循环会先调用集合的Symbol.iterator方法,然后返回一个新的迭代器对象,
迭代器对象可以是任意具有next方法的对象,迭代器对象会重复调用这个方法
每循环一次调用一次
迭代器对象可以是任意具有next方法的对象,迭代器对象会重复调用这个方法var
使用Genertaor 自带next()
myObj[Symbol.iterator] = function* () { |
使用for of 遍历Map对象 顺便回顾一下Map对象的基本使用
const myMap = new Map([ |
小结
for of 使用于遍历数组/数组对象[{},{}]/字符串/map/set等有迭代器对象的集合
但不能遍历对象,应为对象没有迭代器对象,它可以正确的相应break、continue、return语句
es5的forEach方法其实性能比for循环还要弱,使用for循环可以将长度用遍历存起来,可以优化性能