ES5具有遍历数组功能的还有map、filter、some、every、reduce、reduceRight等,只不过他们的返回结果不一样
1、map():通过指定函数处理数组的每个元素,并返回处理后的数组。
注意:map不会改变原数组,map不会检查空数组
var num = [4, 9, 16, 25];
num.map(Math.sqrt) // [2, 3, 4, 5]
console.log(num) // [4, 9, 16, 25]
2、some():用于检测数组中的元素是否满足指定条件(函数提供)
- 如果有一个元素满足条件,则表达式返回true ,
剩余的元素不会再执行检测 - 如果没有满足条件的元素,则返回false
- unction形参和map一样
some不会改变原数组,some不会检查空数组
var ages = [3, 10, 18, 20];
ages.some(function(age){ return age>10}) // true
console.log(ages) // [3, 10, 18, 20];
3、every:用于检测数组所有元素是否都符合指定条件(通过函数提供)
every和some正好相反:
- 如果数组中检测到有一个元素不满足,则整个表达式返回 false ,且剩余的元素不会再进行检测。
- 如果所有元素都满足条件,则返回 true。
var ages = [32, 33, 16, 40];
ages.every(checkAdult) // false
function checkAdult(age) {
return age >= 18;
}
4、filter:创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素
filter会根据函数中的筛选条件将返回的结果组成一个新的数组并返回
var ages = [32, 33, 16, 40];
function checkAdult(age) {
return age >= 18;
}
function myFunction() {
console.log(ages.filter(checkAdult)); // 32 33 40
}
5、forEach:
没有返回值,只针对每个元素调用func。
优点:代码简介。
缺点:无法使用break,return等终止循环。
let list = [1, 2, 3, 4, 5];
let other = [];
list.forEach((d, i) => {
other.push(d * 2);
});
console.log(other);
// print: [2, 4, 6, 8, 10]
6、for... in 和for... of 的区别
1、使用for in会遍历数组所有的可枚举属性,包括原型
2、原型方法method和name属性,所以for in更适合遍历对象,不要使用for in遍历数组。for…in循环不仅遍历数字键名,还会遍历手动添加的其他键,甚至包括原型链上的键。
3、for…in遍历出的结果是key;for…of遍历出的结果是value
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]);
}
// 1,2,3,4,5,6,7,'数组',function(){console.log(this.length);}
for in 可以遍历到myObject的原型方法method,如果不想遍历原型方法和属性的话,可以在循环内部判断一下,hasOwnPropery方法可以判断某属性是否是该对象的实例属性
只有属性存在实例中才会返回true
for (var key in myObject) {
if(myObject.hasOwnProperty(key)){
console.log(key);
}
}
同样可以通过ES5的Object.keys(myObject)获取对象的实例属性组成的数组
如果要取得对象上所有可枚举的实例属性,可以使用Object.keys(), 返回字符串数组。
Object.prototype.method=function(){
console.log(this);
}
var myObject={
a:1,
b:2,
c:3
}
Object.keys(myObject)
//["a", "b", "c"]
4、for...of 不会遍历原型,输出value
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);
}
// 1,2,3,4,5,6,7
for..of适用遍历数/数组对象/字符串/map/set等拥有迭代器对象的集合.但是不能遍历对象,因为没有迭代器对象.与forEach()不同的是,它可以正确响应break、continue和return语句
for-of循环不支持普通对象,但如果你想迭代一个对象的属性,你可以用for-in循环(这也是它的本职工作)或内建的Object.keys()方法:
for (var key of Object.keys(someObject)) {
console.log(key + ": " + someObject[key]);
}
for-of循环首先调用集合的Symbol.iterator方法,紧接着返回一个新的迭代器对象。迭代器对象可以是任意具有.next()方法的对象;for-of循环将重复调用这个方法,每次循环调用一次