JS: 数组的循环函数
JS 数组相关的循环函数,用得挺多,所以有些坑还是要去踩一下,先来看一道面试题。
注意:下面提到的不改变原数组仅针对基本数据类型。
面试题
模拟实现数组的 map 函数。
心中有答案了吗?我的答案放在最后。
map( callback( cur, index, arr ), thisArg )
map 方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。
map 不改变原数组(可以在 callback 执行时改变原数组)
let a = [1, 2, 3]
let b = a.map(item => item*2) // 不改变原数组
a // [1, 2, 3]
b // [2, 4, 6] // 在 callback 执行时改变原数组
a.map((cur, i, arr) => arr[i] *= 2)
a // [2, 4, 6]
没有 return 时,返回
undefinedlet c = a.map((cur, i, arr) => arr[i] *= 2) c // [undefined, undefined, undefined]
原数组中新增加的元素不会被 callback 访问
let a = [1, 2, 3]
let b = a.map((cur, i, arr) => {
arr.push(arr.length + 1)
return cur*2
}) b // [2, 4, 6]
a // [1, 2, 3, 4, 5, 6]
filter( callback( cur, index, arr ), thisArg )
filter 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。
这个没什么好说的,filter 只返回过滤后的新数组,依然不会改变原数组
let a = [1, 2, 3]
let b = a.filter(item => item % 2 == 0)
a // [1, 2, 3]
b // [2]
需要注意的是,尽量不要在 filter 中直接return item。
/* 一般情况是没问题的 */
let a = [1, 2, 3]
let b = a.filter(item => item)
a // [1, 2, 3]
b // [1, 2, 3]
/* false、0、undefined、null */
let c = [true, false, 0, undefined, null]
let d = c.filter(item => item)
c // [true, false, 0, undefined, null]
d // [true]
一般情况下直接return item是没问题的,但遇到false、0、undefined、null这几个特殊值时,就会出问题。因为 filter 是根据return的值来判断返回的新数组是否要添加遍历到的原数组索引值,而不是直接在新数组中添加return的值。
简单来说,就是 filter 中的 callback 的 return 应该返回一个 boolean 值,true 即满足过滤条件,false 则不满足过滤条件。
forEach( callback( cur, index, arr ), thisArg )
forEach 方法对数组的每个元素执行一次提供的函数。
forEach 无法中断,需要中断的则表明:不应该使用 forEach。当然,使用 try、catch 是可以实现中断的,但不推荐。
let a = [1, 2, 3] try {
a.forEach(item => {
console.log(item)
if (item % 2 == 0) throw new Error('hhh')
})
} catch (e) {
console.log('中断')
} /*
1
2
中断
*/
forEach 也是不会改变原数组的
let a = [1, 2, 3]
a.forEach(item => item*2)
a // [1, 2, 3]
every( callback( cur, index, arr ), thisArg )
every 方法测试数组的所有元素是否都通过了指定函数的测试。
这个没什么好说的,但 every 和 some 都有个坑。
坑:空数组调用 every 会返回true。
// 返回了 true
[].every(item => item > 0) // true
some( callback( cur, index, arr ), thisArg )
some 方法测试是否至少有一个元素通过由提供的函数实现的测试。
坑:空数组调用 some 会返回false。
// 和 every 相反,这里返回了 false
[].some(item => item > 0) // false
reduce( callback( prev, cur, index, arr ), initVal )
reduce 方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。
如果没有提供
initVal,reduce 会取数组中的第一个值为prev, 然后从数组索引 1 开始执行 callback,跳过第一个索引。如果提供initlVal,从索引 0 开始,prev为initVal。如果数组为空且没有提供
initVal会报错。[].reduce((prev, cur)=> cur) // TypeError
实现 map 函数
Array.prototype._map = function(callback, thisArg) {
if (typeof callback !== 'function') {
throw new TypeError(`${callback} is not a function`)
}
let res = []
for (let i=0; i<this.length; i++) {
res.push(callback.call(thisArg, this[i], i, this))
}
return res
}
JS: 数组的循环函数的更多相关文章
- js数组的splice函数
一直没搞懂数组的splice函数,今天稍微测试了一下,了解了它的功能,在这里记录一下 1.测试 测试① var a = [1,2,3]; console.info(a.splice(1,1)); co ...
- JS数组(Array)处理函数总结
1.concat() 连接两个或更多的数组该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本.例如: <script type="text/javascript"&g ...
- js数组之可变函数
在js的数组中有两个方法为数组添加元素:1.push();2.unshift(),push函数是将元素添加到数组的末尾,现在不用说大家估计也能猜出来,unshift这个函数就是把元素添加到数组的开头的 ...
- js数组,数字函数,字符串函数,表单验证,hashMap,堆栈,日期函数,call函数
1.javascript的数组API Js代码 收藏代码 //定义数组 var pageIds = new Array(); pageIds.push('A'); 数组长度 pageIds.lengt ...
- js数组之sort()函数
一般我们使用sort函数进行数组的排序,sort()方法有一个可选参数,是用来确定元素顺序的函数.如果这个参数被省略,那么数组中的元素将按照ASCII字符顺序进行排序.如: var arr = [&q ...
- js 数组的forEach 函数
var numbers = [4, 9, 16, 25]; function myFunction(item, index) { console.log("item:" + ite ...
- js数组 函数
js数组 filter(),map(),some(),every(),forEach(),lastIndexOf(),indexOf() 文章1:http://www.jb51.net/article ...
- js 数组常用的操作函数整理
平时多做企业应用开发,抱着实用为主,对前端技术理解得比较肤浅,下面就是肤浅地对 js 数组的属性和方法及对它操作的 jquery 方法做些记录: js 数组是 js 内建的一个非常强大数据类型,由于 ...
- 页面循环绑定(变量污染问题),js面向对象编程(对象属性增删改查),js字符串操作,js数组操作
页面循环绑定(变量污染问题) var lis = document.querySelectorAll(".ul li") for ( var i = 0 ; i < lis. ...
随机推荐
- windows下Oracle数据库完全删除
1.1 停止所有oracle的服务 1.2 删除安装路径 app及其下所有文件 1.3 删除注册表 regedit 进入 在下列列表中找到与oracle相关的注册表项删除 1.HKEY_L ...
- (15)3 kinds of bias that shape your worldview
https://www.ted.com/talks/j_marshall_shepherd_3_kinds_bias_that_shape_your_worldview/transcript 00:1 ...
- AttributeError: type object 'testClass' has no attribute 'testMothod'
点击"Unittest for test_post_API.testClass"按钮,点击”Edit configuration...“,弹出对话框Run/Debug config ...
- .Net实现Windows服务安装完成后自动启动的两种方法
考虑到部署方便,我们一般都会将C#写的Windows服务制作成安装包.在服务安装完成以后,第一次还需要手动启动服务,这样非常不方便. 方法一:在安装完成事件里面调用命令行的方式启动服务 此操作之前要先 ...
- 第19章:MongoDB-聚合操作--聚合管道--$limit+$skip
①$limit “$limit”:负责数据的取出个数: “$skip”:数据的跨过个数. ②范例:使用“$limit”设置取出的个数
- 21-z-index
z-index 这个东西非常简单,它有四大特性,每个特性你记住了,页面布局就不会出现找不到盒子的情况. z-index 值表示谁压着谁,数值大的压盖住数值小的, 只有定位了的元素,才能有z-index ...
- 【1】ASP.NET异步(1)
图标说明了异步的基础认识. 1.如果没有Ajax,提交之后整个页会刷新(左图).右图所示的虚线范围区域加入了ajax技术,提交之后只更新了虚线区域的内容,这样看比较直白. <form>①& ...
- POJ3616--Milking Time(动态规划)
Bessie is such a hard-working cow. In fact, she is so focused on maximizing her productivity that sh ...
- hdu1258
给你两个数t,n 接下来输入n个数字 让你输出所有数字相加等于n的组合 4 6 4 3 2 2 1 1 t n 4 3+1 2+2 2+1+1 Sample Input 4 6 4 3 2 2 1 1 ...
- URL中文编码
/// <summary> /// GB2312编码 /// </summary> /// <param name=" ...