当前位置: 首页 > news >正文

【前端手撕】数组api

碎碎念

校内任务告一段落!(暂时

map

map:映射—— 将原数组的每个元素映射成一个新值,组成新数组返回。

Array.prototype.map = function(fn) { const res = [] for (let i = 0; i < this.length; i++) { res.push(fn(this[i], i,this)) } return res }

1. 使用map是arr.map这样用,所以this指向的是arr

2. fn有三个参数是因为:

JavaScript 官方规定Array.prototype.map的回调函数必须接收这 3 个参数(按顺序):

  1. currentValue(当前元素的值) → 对应this[i]

  2. index(当前元素的索引) → 对应i

  3. array(调用 map 的原数组) → 对应this

后续调用的时候传参可以只传部分,但底层map仍然是塞了三个实参,只不过fn只接收部分,忽略了其他。

Tip

几乎所有数组方法的回调函数都是传这三个参数:

方法是否传 3 个参数备注
forEach✅ 是只遍历,不返回新数组
map✅ 是返回新数组
filter✅ 是返回新数组(筛选)
some/every✅ 是返回布尔值(测试是否通过)
find/findIndex✅ 是查找元素或索引
reduce特殊回调是(累加器, 当前值, 索引, 数组)4 个参数(因为多了一个累加器)

filter

filter()是 JavaScript 数组原型上的一个内置方法。它的核心功能是根据指定条件(回调函数),从原数组中筛选出符合要求的元素,并组成一个新数组返回。即不破坏原数组。

Array.prototype.filter = function(fn) { const res = [] for (let i = 0; i < this.length; i++) { // 如果fn返回true(即满足条件),则把当前元素加到res数组中 if (fn(this[i], i, this)) { res.push(this[i]) } } return res }

reduce

reduce方法通过维护一个持续传递的累加器(即上一次回调的返回值res),将数组中的每个元素依次进行归并操作,最终将整个数组坍缩(归约)为一个单一的结果值(可以是数字、对象或数组等)。

Array.prototype.reduce = function(fn, initValue) { let res, start = 0 if (arguments.length !== 1) { // 传了两个参数,有初始值 res = initValue } else { // 只传了一个参数,从第一个元素开始 res = this[0] start = 1 } for (let i = start; i < this.length; i++) { // fn 执行完后返回一个新值,覆盖掉 res,继续下一次循环。 res = fn(res, this[i], i, this) } return res }

Tip

1. 边界问题处理

如果数组是空的,并且用户没有传初始值,按照这段代码:res = this[0]会变成undefinedstart = 1,循环不执行,最后返回undefined。但真实的 JS 引擎在这种情况下会直接报错(TypeError: Reduce of empty array with no initial value)。因此可以在开头加一句:

if (this.length === 0 && arguments.length === 1) { throw new TypeError('Reduce of empty array with no initial value'); }

2. 为什么用arguments.length来判断是否有初始值,而不是直接用if (initValue === undefined)

因为undefined是合法的初始值。例如:

[1, 2].reduce(fn, undefined);
  • 如果用initValue === undefined判断,会误以为没传初始值,导致程序逻辑错乱。

  • 如果用arguments.length === 2判断,就能精准识别:“用户确实传了第二个参数(只是值恰好是undefined)”,从而正确地把res设为undefined

http://www.gsyq.cn/news/1557914.html

相关文章:

  • 打通设计壁垒:实战LCEDA立创商城元件库向Cadence的高效迁移
  • Overlap:MIDPOINT(中值通道线)技术指标详解
  • 2026遵义2026正规漏水检测维修公司精选口碑榜TOP5权威推荐-精准定位检测漏水点-专业防水补漏堵漏维修、卫生间/厨房/屋顶/天沟/地下室/阳台防水漏水检测维修 - 安佳防水
  • MC68340串行模块深度解析:循环模式、多点模式与寄存器编程实战
  • Windows终端配置proxy - 老码识途
  • 多平台直播录制解决方案:从数据采集到内容管理的完整技术实现
  • ARM9微控制器架构解析:从AHB总线矩阵到外设驱动实战
  • 2026秦皇岛漏水检测维修精选优质服务商TOP5推荐!卫生间漏水/厨房漏水/屋顶天花板漏水/阳台漏水/地下室漏水防水补漏检测维修-正规防水补漏公司优选口碑榜测评推荐 - 即刻修防水
  • 2026年当前迪庆角钢采购策略:一站式服务如何破解高原工程材料难题 - 品牌鉴赏官2026
  • 2026遂宁2026正规漏水检测维修公司精选口碑榜TOP5权威推荐-精准定位检测漏水点-专业防水补漏堵漏维修、卫生间/厨房/屋顶/天沟/地下室/阳台防水漏水检测维修 - 安佳防水
  • Linux安装BIP高级版 - 老码识途
  • 如何把个人代码库做成靠谱的开源项目:从脚手架到自动发版
  • 揭秘JSON数据可视化新境界:Vue Json Pretty的智能展示方案
  • GanttProject 3步玩转项目管理:让复杂项目变简单的免费开源工具
  • MC68340微控制器架构解析:片上总线、DMA与模块化设计如何提升嵌入式系统性能
  • 2026辽阳2026正规漏水检测维修公司精选口碑榜TOP5权威推荐-精准定位检测漏水点-专业防水补漏堵漏维修、卫生间/厨房/屋顶/天沟/地下室/阳台防水漏水检测维修 - 安佳防水
  • 终极指南:如何在跨平台项目中免费使用PingFangSC字体提升中文显示一致性
  • 2026年中石晶墙板批发市场趋势与优质服务商综合推荐 - 品牌鉴赏官2026
  • GLM 5.2 深度技术分析:百万上下文、Agent 编程能力与本地部署可行性
  • 企业级即时通讯防撤回解决方案:基于内存补丁技术的完整实现指南
  • 从线性规划到列生成:高校排课模型的效率跃迁之路
  • 2026盐城漏水检测维修精选优质服务商TOP5推荐!卫生间漏水/厨房漏水/屋顶天花板漏水/阳台漏水/地下室漏水防水补漏检测维修-正规防水补漏公司优选口碑榜测评推荐 - 即刻修防水
  • 技术解析:BatchNorm的标准化公式与PyTorch实现细节
  • 曲辕RPA-FTP上传文件夹
  • 实时处理器用户级中断硬件优化与实现
  • 从CRM图表重构,吃透「开闭原则」
  • 从序列到合成:Primer Premier 5引物设计实战指南
  • 那个“超2000万人在用“的工具,有一个细节没人告诉你
  • 2026百色漏水检测维修精选优质服务商TOP5推荐!卫生间漏水/厨房漏水/屋顶天花板漏水/阳台漏水/地下室漏水防水补漏检测维修-正规防水补漏公司优选口碑榜测评推荐 - 即刻修防水
  • 2026年6月,新中式家具口碑好的实力工厂推荐速览,实木套系家具/榫卯结构新中式家具,新中式家具源头厂家找哪家 - 品牌推荐师