遍历
for...in循环遍历的是对象的可枚举属性列表。如何用来遍历属性值呢?我们可以用for循环:
var myArray = [1,2,3]
for (var i = 0; i < myArray.length; i++) {
// 1 2 3
console.log(myArray[i])
}
这里虽然获取的是属性值,但其实本质上还是遍历的属性,然后通过属性来获取属性值。
ES5新增了一些辅助迭代器,如forEach、every、some等。每种辅助器都可以接受一个回调函数并把它用于数组的每个元素上。它们三者唯一的区别在于处理函数返回值的方式不同。
forEach不会接收函数返回值,也就是说,即使函数在某个条件下return了,仅会影响当前条件值,而不会阻断循环,仍然会一直执行下去,直至遍历完整个数组。
var myArray = [1,2,3]
myArray.forEach((item, index) => {
if (index === 1) return 2
console.log(item) // 1 3
})
这里当数组的下标是1时,执行到了return,对于回调函数本身来说,肯定是不会继续往下执行了,这也符合程序的逻辑,但并不会阻碍循环,只是当前条件下程序有自己的执行规则而已。
every辅助函数检查的是必须所有元素都符合规则,才返回true,在回调函数执行的过程中,当遇到第一个不符合规则的元素时,那直接返回false了,而不会往下继续执行。
var myArray = [1,2,3]
var validate = myArray.every(item => {
console.log(item) // 1 2
return item < 2
})
console.log(validate) // false
当执行到数组元素2时,发现已经不符合小于2的条件了,所以也就中断循环直接返回false了,而不会继续再执行元素3的情况,没有必要。
some辅助函数检查的是是否存在满足回调函数规则的元素,当检查到第一个符合的元素,即返回true,而不再继续循环了。
var myArray = [1,2,3]
var validate = myArray.some(item => {
console.log(item) // 1 2
return item > 1
})
console.log(validate) // true
some回调函数检查的是数组中是否存在大于1的元素,当循环到元素2的时候,即满足了条件,返回true,也不会继续执行了。