目录
- 1. for
- 数组遍历
- 2. for ... of
- 3. forEach( )
- 4. some( )
- 5. every( )
- 6. filter( )
- 7. map( )
- 8. find( )
- 9. findIndex( )
- 10. reduce( )
- 11. reduceRight( )
- 对象遍历
- 1. for ... in
- 2. Object.keys( )
- 3. Object.values( )
- 4. Object.entries( )
- 5. Object.getOwnPropertyNames( )
1. for
for 循环可以自定义循环次数;
let arr = [1, 3, 5, 7];
for (var i= 0; i <arr.length;i++) {console.log(i,arr[i]);
}
数组遍历
2. for … of
for ... of
可以迭代循环 可迭代对象如:Array,Map,Set,String,TypedArray,arguments 对象
等等)
注:对象不可使用 for ... in
迭代循环;
let arr =[1,3,5,7];
for (let key of arr) {console.log(key); // 数组下标
}
以下几个循环都接收一个回调函数,该回调函数可接收三个参数 callback( item[,index[,selfarr] )
- item:回调函数正在处理的数组元素;
- index(可选):正在处理的元素在数组中所处的下标;
- selfarr (可选):调用 map 方法的数组本身;
3. forEach( )
arr.forEach( callback( item[,index[,selfarr] ) )
forEach 遍历:每循环一次数组中的元素,就调用一次 callback 回调函数。
返回值:undefined;
提示:1.forEach 不能通过 return、break、contain 跳出循环;
底层实现:
// forEach 底层实现
function forEach(callback){for(var i=0;i<arr.length;i++){callback(arr[i],i,arr)}
}
// forEach 使用
let arr = [1,3,5,7];
arr.forEach( item => {console.log(item);
}
4. some( )
let newarr = arr.some( callback( item[,index[,selfarr] ) )
返回值:布尔值 ture / false;
some 方法会对数组中的每一项都进行遍历,找到第一个满足条件的元素就终止循环
,返回 true ,如果数组中没有满足条件的元素,返回 false;
注:some 方法不会改变原数组
;
底层实现:
//some 底层实现
function some(callback){var flag = false;for(var i=0;i<arr.length;i++){if(callback(arr[i],i,arr)){flag = true;break;}}return flag;
}
// some 使用
let arr = [1,3,5,7];
let some = arr.some(item => {return item > 3;
)
console.log(arr); // arr = [1,3,5,7]
console.log(some); // true 数组每一项与3对比,结果依次为 false true true true some 方法只要有以一项为 true 就返回 true
5. every( )
let newarr = arr.every( callback( item[,index[,selfarr] ) )
返回值:布尔值 ture / false;
every 方法会对数组中的每一项都进行遍历,需要每一项条件都成立才返回 true
,否则只要有一项不成立就返回 false。
注:every 方法不会改变原数组
;
底层实现:
// every 底层实现
function every(callback){var flag = true;for(var i=0;i<arr.length;i++){if(!callback(arr[i],i,arr)){flag = false;break;}}return flag;
}
let arr = [1,3,5,7];
let every = arr.every(item => {return item > 0;
})
console.log(arr); // arr = [1,3,5,7];
console.log(every); // true;
6. filter( )
let newarr = arr.filter( callback( item[,index[,selfarr] ) )
filter 方法会处理数组中的每一个元素,并将处理结果为 true (或满足条件的元素)的元素过滤
出来进行返回,这些元素会组成一个新的数组
。filter 遍历适合于筛选元素。
返回值:callback 返回为 true 的元素组成一个新的数组;如果没有元素返回结果为 true,返回空数组;
注:filter 方法不会改变原数组
;
底层实现:
//filter 底层实现
function filter(callback){var res = [];for(var i=0;i<arr.length;i++){if(callback(arr[i],i,arr)){res.push(arr[i])}}return res;
}
//filter 用法
let arr = [1,3,5,7];let filter = arr.filter(item => {return item > 4;
})
console.log(arr); // arr = [1,3,5,7]
console.log(filter); //arr = [5,7]
7. map( )
let newarr = arr.map( callback( item[,index[,selfarr] ) )
map 方法会处理数组中的每一个元素,并将每个元素的处理结果通过 return 返回出去,这些结果会组成一个新的数组。
返回值:回调函数 callback 将每次 return 的结果(结果可以为 undefined 或 null
)组成一个新的数组;
注:1. map 遍历会遍历数组中每一项,不会跳出循环;
2. map 方法不影响原数组元素;
3. 新数组的长度同原数组长度一样;
注:map 方法不会改变原数组
;
底层实现:
// map 底层实现
function map(callback){var res = [];for(var i=0; i<arr.length; i++){ // arr 待遍历的数组res.push(callback(arr[i],i,arr))}return res;
}
// map 使用
let arr = [1,3,5,7]; let map = arr.map(item => {return item *2;
})let map1 = arr.map(item => {return item > 3;
})
console.log(arr); // arr = [1,3,5,7]
console.log(map); // map = [2,6,10,14];
console.log(map1); // map1 = [false,false,true,true]
8. find( )
let item = arr.find( callback( item[,index[,selfarr] ) )
返回值:返回第一个符合条件的数组成员
,没有符合条件则返回 undefined
注:find 方法不会改变原数组
;
9. findIndex( )
let index = arr.findIndex( callback( item[,index[,selfarr] ) )
返回值:返回符合条件的数组成员的下标
,没有符合条件则返回 -1
注:findIndex 方法不会改变原数组
;
// find、findIndex 用法:
let arr = [1,3,5,7];// find()
let item = arr.find(function(val,index,arr) {console.log(val,index,arr); // 1,0,[1,3,5,7]return val > 4; // 返回 5,虽然 5 7 都符合大于 4 的条件,但是只返回找到符合条件的第一个,即元素 5
})
console.log(item); // 返回 5,虽然 5 7 都符合大于 4 的条件,但是只返回找到符合条件的第一个,即元素 5// findIndex( )
let ind = arr.findIndex(val => val >5);
console.log(ind); // 3,大于 5 的值的数组元素仅有 7,7 所在的下标为 3
10. reduce( )
arr.reduce( callback(preval, item, index, arr), val)
callback:回调函数,该回调函数中可以传递以下几个参数:
- preval:初始值 或 上次循环中的返回值;
- item:当前数组元素;
- index:当前数组元素的下标;
- arr:当前数组元素所在的数组对象;
- val:传递给回调函数的初始值;
注:reduce 遍历可以记录上次循环中处理结果;
// reduce 底层实现
function reduce(fn){if(arr.length==1) return arr[0]var res = arr[0];for(var i=1;i<arr.length;i++){res = fn(res,arr[i],i,arr);}return res;
}
// reduce 用法
let arr = [1,3,5,7];
let reduce = arr.reduce((preval,item) => {console.log(preval,item);return preval+item;
},0)
console.log(arr); // arr = [1,3,5,7]
console.log(reduce); // reduce = 16
11. reduceRight( )
arr.reduce( callback(preval, item, index, arr), val)
和 reduce() 方法类似,不同的是,reduceRight() 方法中数组元素是从右到左计算,可将其看作原数组先逆序排列再进行 reduce 方法的结合
let map = arr.reduce((preval, item) => {console.log(`pre: ${preval}, item: ${item}`);return preval + item;
}, 0)
console.log('map:',map);let map1 = arr.reduceRight((preval, item) => {console.log(`pre: ${preval}, item: ${item}`);return preval + item;
}, 0)
console.log('map1:',map1);
对象遍历
1. for … in
for ... in
可以用来遍历对象,获取键名
;遍历数组,获取数组元素下标
(数组元素下标相对于对象键名)
for ... in
可以通过 continue 、break 和 return 中断遍历
,不同的是 return
需要放在函数体中进行中断
// for ... in
let stu = {name:'andy',age:10,sex:'female'
}for(let key in stu){console.log(key,stu[key]); // name 'andy' 每次遍历,都会将键名赋值给 key
}
2. Object.keys( )
ES6 新特性,参数:被返回其枚举自身属性的对象;
返回值:可枚举属性组成的数组
注:当参数不是对象,Object.keys() 方法会将参数转为对象类型,索引充当键名,返回由键名组成的数组。
参数有以下几种情况:
- 对象,Object.keys() 方法获取
对象的键名
,返回一个由键名(键名为字符串类型)组成的数组; - 数组,Object.keys() 方法获取
数组元素索引
,返回一个由索引值(索引值为字符串类型)组成的数组; - 字符串,Object.keys() 方法获取字
符串的索引
,返回一个由索引值(索引值为字符串类型)组成的数组;
…
3. Object.values( )
ES6 新特性,参数:被返回可枚举属性值的对象;
返回值:包含对象自身的所有可枚举属性值的数组;
注:如果参数不是对象,Object.values() 会将参数先转为对象,返回由属性值组成的数组。
参数有以下几种情况:
- 对象,Object.values() 方法获取
对象的属性值
,返回一个由属性值组成的数组; - 字符串,Object.values() 方法获取
字符串的单个字符
,返回一个由字符组成的数组;
// 对象
let stu = {name:'andy',age:20,sex:'female'
}
let keysArr= Object.keys(stu);
console.log(keysArr); // [ "name", "age", "sex" ]let valArr = Object.values(stu);
console.log(valArr); // [ "andy", 10, "female" ]// 数组
let arr = ['apple','orange','banana'];
let keysArr= Object.keys(arr);
console.log(keysArr); // [ "0", "1", "2" ]let valArr = Object.values(arr);
console.log(valArr); // [ "apple", "orange", "banana" ]// 字符串
let str = 'ysjx';
let keysArr= Object.keys(str);
console.log(keysArr); // [ "0", "1", "2","3" ]
let valArr = Object.values(stu);
console.log(valArr); // [ "y", "d", "j","x" ]
4. Object.entries( )
参数:可以返回其可枚举属性的键值对的对象;
返回值:给定对象自身可枚举属性的键值对数组;(返回多个数组,一个数组由可枚举对象的一个属性及其对应的属性值组成,如:[属性,属性值]
)
参数有以下几种情况:
- 对象;
- 数组;
- 字符串
5. Object.getOwnPropertyNames( )
获取对象的所有属性(和 Object.keys()
类似),但 Object.getOwnPropertyNames()
还可以获取不可枚举的属性
参考博客:1. JS 遍历底层实现