forEach和for循环的区别:
forEach
和for
循环都可以用来处理数组数据,做遍历处理。在做全体数据处理的时候,推荐用forEach
,书写方便、直观、简洁。但是遇到需要对符合条件的数组项做筛选处理的时候推荐使用for循环,原因在于for
循环可以打断(break
)跳出循环,而forEach
方法不可以,只要调用就会对所有的数组项做对应处理,有时会多做无谓的劳动,浪费资源。 arr.forEach(function(item, index, arr){})
map方法的使用:
map
方法就是对数组的每一项调用函数,然后返回一个新的数组。
arr.map(function(item, index, arr){ return something})举个例子:arr = [1,22,10,20];arr2 = arr.map(item => { return 2*item})arr2 // [2,44,20,40]map方法还可以把字符串转换为数组:var str = "text";var map = Array.prototype.map;var strArr = map.call(str,function(item){ return item+10});strArr// ["t10","e10","x10","t10"]复制代码
这里我们注意到“text”是字符串不是数组,那么他怎么可以调用数组方法呢?可以回想一下字符串是不是支持for...in
, 是不是可以通过 str[index]
去获取对应下标的字符?原来字符串对象是类数组,类数组对象是可以调用map方法的,只是不能直接调用,因为该对象的构造函数的原形对象上没有该方法。而数组对象的map方法存在于Array构造函数的原形对象上。所有先获取到map
方法再通过call
方法调用。Array.prototype.map.call([this],arguments)
filter方法 返回一个由符合条件的数组项组成的数组。
var arr = [1,10,20,30];var brr = arr.filter((item)=>{ return item>10; }) // brr [20, 30] 复制代码
注意: 这里的箭头函数内部必须返回一个值,这个值转换成布尔值之后决定返回的数组中是否包含该项,true则包含,false则不包含。
every() 方法 检测数组中是否每一项都符合函数中的条件。
var arr = [1,10,20,30];var flag = arr.every((item)=>{ return item>10; }) // flag false复制代码
这里flag为false是因为这个数组中存在不大于10的项。这里的箭头函数同样需要返回一个布尔值,如果不返回的话,flag就会是false。 还有调用every的数组不能为空数组,如果为空则返回的值一直返回true。
some() 方法和every()方法恰恰相反。
只要有一个数组项符合条件就会返回true,剩下的数组项就不会再执行。调用some方法的数组同样不能为空,如果是空的话就会返回false。