ES5 也可以使用 forEach。 ES5也有map、filter、some、every、reduce、reduceRight等遍历字段的功能,但它们的返回结果不同。 而如果使用foreach来遍历字段,则无法使用break来打破循环,也无法使用return返回到内部函数。
Array.prototype.method=function(){ console.log(this.length); } var myArray=[1,2,4,5,6,7] myArray.name="数组" for (var index in myArray) { console.log(myArray[index]); }
forin遍历字段的错误
1.索引index是字符串数字,不能直接用于几何运算
2. 遍历顺序可能不按照实际字段的内部顺序
3.使用forin会遍历该字段的所有可枚举属性,包括prototype。比如上面栗子的prototype方法和name属性
因此,forin更适合遍历对象。 不要使用 forin 来遍历链表。
那么不仅仅是使用for循环,如何更简单正确地遍历字段来满足我们的期望(即不遍历方法和名称),ES6中的forof就更胜一筹了。
Array.prototype.method=function(){ console.log(this.length); } var myArray=[1,2,4,5,6,7] myArray.name="数组"; for (var value of myArray) { console.log(value); }
记住,forin遍历的是链表的索引(即键值),而forof遍历的是链表的元素值。
forof 只遍历字段内的元素,不包括字段的原型属性方法和索引名。
遍历对象
遍历对象时,一般使用forin来遍历对象的键值。
Object.prototype.method=function(){ console.log(this); } var myObject={ a:1, b:2, c:3 } for (var key in myObject) { console.log(key); }
forin可以遍历myObject的原型方法。 如果不想遍历原型方法和属性jquery 对象 字符串,可以在循环内部判断。 hasOwnPropery方法可以判断某个属性是否是对象的实例属性。
for (var key in myObject) { if(myObject.hasOwnProperty(key)){ console.log(key); } }
还可以使用ES5的Object.keys(myObject)来获取对象的实例属性组成的字段,不包括原型方法和属性。
Object.prototype.method=function(){ console.log(this); } var myObject={ a:1, b:2, c:3 }
总结
for (var key of Object.keys(someObject)) { console.log(key + ": " + someObject[key]); }
for (var [key, value] of phoneBookMap) { console.log(key + "'s phone number is: " + value); }
jQuery.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator];
所有具有 Symbol.iterator 的对象都被认为是可迭代的。 在接下来的文章中,你会发现可迭代对象的概念几乎贯穿了整个语言。 除了 for-of 循环之外jquery 对象 字符串,还有 Map 和 Set 构造函数、解构参数和新的扩展运算符。
var zeroesForeverIterator = { [Symbol.iterator]: function () { return this; }, next: function () { return {done: false, value: 0}; } };