while OR do-while
//while语句
while(){
//......
}
//do-while语句
do{
//......
}while(){
//......
}
for
for(var i = 0; i < array.length; i++){
//......
}
forEach
//currentValue 当前元素
//index 当前元素的索引值。
//arr 当前元素所属的数组对象。
//thisValue 传递给函数的值一般用 "this" 值。如果这个参数为空, "undefined" 会传递给 "this" 值
objArr.forEach(function(currentValue,index,arr){
console.log(value);
},thisValue);
//用forEach遍历数组的话,不能中断循环(使用break或者return)
//如果要提前终止,必须把forEach()方法放在一个try块中,并能抛出一个异常。如果forEach()调用的函数抛出foreach.break异常,循环会提前终止。
function foreach(a,f,t){
try {
a.forEach(f,t)
}catch(e){
if(e === foreach.break)return;
else throw e;
}
}
foreach.break = new Error("StopIteration");
for-in
for-in 语句用于遍历数组或者对象的属性(键名)
//index 必须。当前元素的索引值
let objArr = [ 'a', 'b', 'c' ];
for(var index in objArr){
console.log(index) // 0 1 2
console.log(objArr[index]) // a b c
}
let es6 = {
edition: 6,
committee: "TC39",
standard: "ECMA-262"
};
for (let e in es6) {
console.log(e); // edition committee standard
console.log(es6[e]); // 6 TC39 ECMA-262
}
//for-in循环实际是为循环”enumerable“对象而设计的
****数组上不建议使用for-in循环****
以上代码会出现的问题:
1.index 值是字符串(String)类型,可能无意间进行字符串的计算“2”+1=“21”等,所以不能直接进行几何运算
2.循环不仅会遍历数组元素,还会遍历任意其他自定义添加的属性,如,objArr上面包含自定义属性,objArr.name,那这次循环中也会出现此name属性
3.某些情况下,上述代码会以随机顺序循环数组
for-of
//currentValue 必须。当前元素的值
for(let currentValue of objArr){
console.log(currentValue)
}
JavaScript6里引入了一种新的循环方法,它就是for-of循环,它既比传统的for循环简洁,同时弥补了forEach和for-in循环的短板。
如果循环普通对象,会报错 // TypeError: es6[Symbol.iterator] is not a function 或者 // Uncaught TypeError: es6 is not iterable
解决方法是,使用Object.keys方法将对象的键名生成一个数组,然后遍历这个数组
for (let key of Object.keys(someObject)) {
console.log(key + ': ' + someObject[key]);
}
如果使用for of 想要获取当前索引值
var arr = [ 'a', 'b', 'c' ];
for( let [ index,currentValue ] of new Map( arr.map( ( item, i ) => [ i, item ] ) ) ) {
console.log(index, currentValue);
}
或者
for( let [ index,currentValue ] of arr.entries() ) {
console.log(index, currentValue);
}
for-of可以循环遍历很多东西
1、循环一个数组(Array)
2、循环一个字符串
3、循环一个类型化的数组(TypedArray)
4、循环一个Map
5、循环一个set
6、循环一个 DOM collection(节点)
7、循环一个拥有enumerable属性的对象
8、循环一个生成器(generators)
map
//currentValue 必须。当前元素的值
//index 可选。当前元素的索引值
//arr 可选。当前元素属于的数组对象
//thisValue 对象作为该执行回调时使用,传递给函数,用作 "this" 的值。如果省略了 thisValue,或者传入 null、undefined,那么回调函数的 this 为全局对象。
array.map(function(currentValue,index,arr), thisValue)
map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
map() 方法按照原始数组元素顺序依次处理元素。
注意: map() 不会对空数组进行检测。
注意: map() 不会改原始数组。
filter
filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。
注意: filter() 不会对空数组进行检测。
注意: filter() 不会改变原始数组。
array.filter(function(currentValue,index,arr), thisValue)
var ages = [32, 33, 16, 40];
ages.filter(function(currentValue){
return currentValue >= 18; //32,33,40
})
some、every
some() 方法用于检测数组中的元素是否满足指定条件(函数提供)。
some() 方法会依次执行数组的每个元素:
如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测。
如果没有满足条件的元素,则返回false。
注意: some() 不会对空数组进行检测。
注意: some() 不会改变原始数组。
var resSome = array.some(function(currentValue,index,arr),thisValue)
every() 方法用于检测数组所有元素是否都符合指定条件(通过函数提供)。
every() 方法使用指定函数检测数组中的所有元素:
如果数组中检测到有一个元素不满足,则整个表达式返回 false ,且剩余的元素不会再进行检测。
如果所有元素都满足条件,则返回 true。
注意: every() 不会对空数组进行检测。
注意: every() 不会改变原始数组。
var resEvery = array.every(function(currentValue,index,arr), thisValue)
reduce、reduceRight
//total 必需。初始值, 或者计算结束后的返回值。
//currentValue 必需。当前元素
//currentIndex 可选。当前元素的索引
//arr 可选。当前元素所属的数组对象。
//initialValue 传递给函数的初始值
array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。
reduce() 可以作为一个高阶函数,用于函数的 compose。
注意: reduce() 对于空数组是不会执行回调函数的。
let arr = [1,2,3];
let ad = arr.reduce(function(i,j){
return i+j;
})
// 6
reduceRight和reduce相反,是从右到左
Object.keys()遍历对象的属性,返回一个数组
Object.getOwnPropertyNames()遍历对象的属性
网友评论