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

3. 函数新增了哪些扩展?

一、先给一个面试开场思路如果面试官问ES6 对函数新增了哪些扩展不要一上来就堆概念。比较好的回答方式是先分类ES6 对函数的扩展我一般会从参数、作用域、函数写法、this 绑定、尾调用、函数名、rest/spread这几个方面来说。比较核心的有默认参数、剩余参数rest、扩展运算符、箭头函数、函数的 name 属性增强、严格模式和参数作用域的变化、尾调用优化等。这样开头会很有结构。二、ES6 中函数新增了哪些扩展1函数参数默认值ES6 之前如果想给参数默认值通常这样写function foo(x, y) { y y || default return [x, y] }这种写法有问题比如当y 0、、false时也会被错误替换。ES6 写法function foo(x, y default) { return [x, y] } console.log(foo(1)) // [1, default] console.log(foo(1, 0)) // [1, 0]优点写法更简洁语义更清晰不会误伤0、false、面试加分点默认参数是在函数调用时生效的而且它会形成一个单独的参数作用域。2默认参数可以配合解构使用这个是 ES6 很常见的写法。function ajax(url, { method GET, timeout 3000 } {}) { console.log(url, method, timeout) } ajax(/api) ajax(/api, { method: POST })为什么好在配置对象场景下非常实用尤其适合请求参数组件配置初始化选项面试亮点默认参数 解构赋值是 ES6 中非常有实用价值的组合很多库和框架源码里都会用到。3剩余参数rest作用用于接收多余参数形式是...变量名。function sum(...args) { return args.reduce((prev, cur) prev cur, 0) } console.log(sum(1, 2, 3)) // 6和arguments的区别arguments类数组对象不能直接调用数组方法不够直观rest是真正的数组更语义化可以直接用数组方法示例function fn(a, b, ...rest) { console.log(a) // 1 console.log(b) // 2 console.log(rest) // [3, 4, 5] } fn(1, 2, 3, 4, 5)面试加分说法rest参数本质上是对arguments的改进让不定参数处理更符合现代 JavaScript 的数组式操作习惯。4扩展运算符...在函数里扩展运算符主要用于将数组展开为参数列表。const arr [1, 2, 3] console.log(Math.max(...arr)) // 3替代 ES5 写法Math.max.apply(null, arr)作用函数传参更方便可读性更强配合 rest 构成“收集”和“展开”的完整能力面试亮点rest是“收集参数”spread是“展开参数”两者在语法上很像但语义相反。这句话特别适合面试。5箭头函数这是 ES6 函数扩展里最核心的一部分。基本写法const add (a, b) a b等价于const add function(a, b) { return a b }特点一写法更简洁const square x x * x如果只有一个参数可以省略括号如果函数体只有一行表达式可以省略return。特点二没有自己的this这是最重要的点。箭头函数的this不是运行时绑定的而是定义时所在作用域的this。function Timer() { this.count 0 setInterval(() { this.count console.log(this.count) }, 1000) }这里箭头函数中的this会继承外层Timer的this。特点三不能作为构造函数const Person () {} new Person() // TypeError因为箭头函数没有prototype也没有自己的this。特点四没有argumentsconst fn () { console.log(arguments) // 报错或取外层 }如果要获取不定参数应该用rest。特点五不能使用yield所以箭头函数不能作为 Generator 函数。面试加分点箭头函数最大的价值不是“简写”而是它固定了this的指向避免了传统函数在回调中this丢失的问题。这句很加分。6函数的name属性增强ES6 对函数的name属性做了增强。function foo() {} console.log(foo.name) // foo匿名函数赋值给变量时也能推导出函数名const bar function() {} console.log(bar.name) // bar箭头函数也一样const baz () {} console.log(baz.name) // baz作用调试更方便错误栈信息更清晰这个点虽然不如箭头函数常考但说出来会显得你比较细。7参数作用域这是很多人容易忽略的高级点。ES6 中函数参数会形成一个独立作用域。示例let x 1 function foo(x, y function() { return x }) { let x 2 return y() } console.log(foo(5)) // 5这里y默认值里的x取的是参数作用域中的x不是函数体里的x。面试加分说法ES6 的默认参数不只是语法糖它还会引入独立的参数作用域这也是一些边界行为和 ES5 不同的原因。8严格模式相关变化ES6 中如果函数参数使用了默认值、解构赋值或rest参数函数内部就不能显式再设定严格模式。function foo(a 1) { use strict // 报错 }因为参数会形成独立作用域和显式严格模式的处理有冲突。这个属于进阶知识能提一下就不错。9尾调用优化Tail Call Optimization什么是尾调用如果函数最后一步是调用另一个函数这就叫尾调用。function f(x) { return g(x) }ES6 的意义ES6 在规范层面支持尾调用优化。理论上的好处减少调用栈占用避免深递归栈溢出提升递归效率但实际要补充一句虽然 ES6 规范层面提到了尾调用优化但现实中大多数 JavaScript 引擎并没有很好地实现所以实际开发中不能完全依赖它。这句很重要很显成熟。三、面试里怎么把这些内容组织得更好建议按下面几个层次回答第一层参数增强默认参数解构 默认值rest 参数spread 传参第二层函数写法增强箭头函数更简洁的表达形式固定 this第三层函数行为增强name属性增强参数作用域尾调用优化这样回答会显得特别清楚。四、标准版面试回答ES6 对函数的扩展主要体现在几个方面。第一是参数能力增强比如支持默认参数、解构赋值默认值以及rest参数。默认参数让函数定义更直观也避免了 ES5 中通过||设置默认值误伤0、false这类值的问题。rest参数则替代了以前不太方便的arguments因为它拿到的是真正的数组。第二是扩展运算符...可以把数组展开成参数列表常用来替代apply。第三是箭头函数。箭头函数让函数写法更简洁但更重要的是它没有自己的this会继承定义时外层作用域的this所以很适合回调场景。同时它也不能作为构造函数没有自己的arguments。第四是函数的一些行为层面的增强比如name属性更完善了默认参数会形成独立的参数作用域以及 ES6 规范中还提到了尾调用优化。如果从工程实践来看我觉得 ES6 对函数最核心的提升是让函数参数处理更自然让回调中的this更可控也让函数表达形式更简洁、更适合现代开发。五、如果想回答得更精彩可以补充这几个重点1箭头函数不是普通函数的完全替代品你可以主动说箭头函数并不是用来完全替代普通函数的。如果需要动态this、需要作为构造函数、或者需要arguments我还是会使用普通函数。这句特别专业。2默认参数不只是语法糖默认参数除了简化写法还引入了独立的参数作用域这是 ES6 函数行为上一个比较本质的变化。3rest和spread要区分清楚rest是收集参数spread是展开参数语法一样但语义相反。六、对比总结表扩展作用说明默认参数给参数设置默认值替代 ES5 参数解构默认值配置项更方便常用于对象参数rest参数收集剩余参数真正数组替代arguments扩展运算符...展开参数常替代apply箭头函数更简洁的函数写法无自身this、argumentsname属性增强获取函数名更准确调试更方便参数作用域默认参数有独立作用域ES6 新行为尾调用优化理论上优化递归现实支持有限七、精简版面试回答如果时间比较短可以这样答ES6 对函数主要新增了几类扩展一是参数增强比如默认参数、解构默认值和rest参数二是扩展运算符可以把数组展开成参数列表三是箭头函数它不仅写法更简洁更重要的是没有自己的this适合回调场景四是函数行为上的增强比如name属性更完善、默认参数形成独立作用域以及规范层面的尾调用优化。我觉得 ES6 对函数最大的提升是让参数处理更优雅也让this的使用更加可控。八、一句话总结面试官真正想听的是你是否知道ES6 函数新增了哪些能力你能不能分层分类回答而不是散点背诵你是否理解箭头函数、默认参数、rest/spread 的本质你有没有结合实际开发讲出它们的价值和边界

相关文章:

3. 函数新增了哪些扩展?

一、先给一个面试开场思路如果面试官问:ES6 对函数新增了哪些扩展?不要一上来就堆概念。 比较好的回答方式是先分类:ES6 对函数的扩展,我一般会从 参数、作用域、函数写法、this 绑定、尾调用、函数名、rest/spread 这几个方面来说…...

kotlin协程取消执行

取消启动协程的整个scope,该scope下面的所有协程都会被取消。协程内部是通过抛出一个特殊的异常来实现取消的:CancellationException。如果想在取消时传递取消的原因,可以在调用cancel时主动提供一个CancellationException的实例:…...

阻塞和非阻塞、同步和异步、挂起

阻塞和非阻塞阻塞和非阻塞指的是线程在调用后,线程是否干等。挂起的是任务,阻塞的是线程,任务在线程中处理,线程可以处理不同的任务。即任务挂起、线程阻塞。阻塞的特征:线程完全工作或干等在语句从调用开始到返回结果…...

OpenClaw多通道管理:千问3.5-9B同时服务飞书与钉钉机器人

OpenClaw多通道管理:千问3.5-9B同时服务飞书与钉钉机器人 1. 为什么需要多通道管理? 去年我接手了一个跨部门协作项目,团队同时使用飞书和钉钉两种沟通工具。每次需要查询数据或生成报告时,成员们要么在飞书群里我,要…...

终极指南:如何高效使用geerlingguy/dotfiles提升开发效率

终极指南:如何高效使用geerlingguy/dotfiles提升开发效率 【免费下载链接】dotfiles My configuration. Minimalist, but helps save a few thousand keystrokes a day. 项目地址: https://gitcode.com/gh_mirrors/dotfiles52/dotfiles 在软件开发领域&#…...

docker在centos7上的搭建

docker与传统虚拟机对比 传统虚拟机基于安装在主操作系统上(带环境安装) 缺点:资源占有多,冗余多,运行速度慢, dockers:打包软件运行所需所有资源,无需捆绑一整个操作系统&#x…...

入门python小工具(2)之生成简单照片墙

工具功能:在背景板中按照选择格式粘贴照片形成有规则形状的照片墙。如图使用介绍: 需要自行准备好背景图片、粘贴入墙的照片和粘贴黑白格式图片(上图的格式图片为梅花)。按照运行时的输入提示输入文件路径即可。源代码&#xff1a…...

ZGC实战:如何在大内存场景下实现毫秒级GC停顿(附调优参数详解)

ZGC深度调优:TB级堆内存下的毫秒级GC实战指南 引言:大内存时代的GC挑战 在当今云计算与大数据时代,Java应用堆内存规模正经历指数级增长。从早期的GB级到如今的TB级,传统垃圾回收器如G1、CMS已无法满足低延迟需求。某头部电商平台…...

[渗透教程]-024-Hashcat密码破解(仅供学习)

Hashcat 简介 Hashcat 自称是世界上最快的密码恢复工具。它在2015年之前拥有专有代码库,但现在作为免费软件发布。适用于 Linux,OS X 和 Windows 的版本可以使用基于 CPU 或基于 GPU 的变体。支持 hashcat 的散列算法有 Microsoft LM hash,MD4,MD5,SHA 系列,Unix 加密格…...

2026年4月OpenClaw(Clawdbot)如何集成?华为云新手攻略:搭建及大模型API、Skill配置指南

2026年4月OpenClaw(Clawdbot)如何集成?华为云新手攻略:搭建及大模型API、Skill配置指南。OpenClaw(Clawdbot)是2026年主流的AI自动化助理平台,能借助阿里云轻量服务器达成724小时稳定运转&#…...

探索触控艺术:GestureViews 开源库深度剖析与推荐

探索触控艺术:GestureViews 开源库深度剖析与推荐 【免费下载链接】GestureViews ImageView and FrameLayout with gestures control and position animation 项目地址: https://gitcode.com/gh_mirrors/ge/GestureViews GestureViews 是一款专注于提供流畅手…...

如何安装OpenClaw(Clawdbot)?2026年4月京东云轻松部署:安装及大模型API、Skill配置

如何安装OpenClaw(Clawdbot)?2026年4月京东云轻松部署:安装及大模型API、Skill配置。OpenClaw(Clawdbot)是2026年主流的AI自动化助理平台,能借助阿里云轻量服务器达成724小时稳定运转&#xff0…...

深入理解HtmlTextView表格支持:从链接到WebView的完整流程

深入理解HtmlTextView表格支持:从链接到WebView的完整流程 【免费下载链接】html-textview TextView to display simple HTML 项目地址: https://gitcode.com/gh_mirrors/ht/html-textview Android开发中显示HTML内容一直是开发者面临的挑战之一,…...

无障碍辅助工具链:OpenClaw+Kimi-VL-A3B-Thinking实现图片语音描述服务

无障碍辅助工具链:OpenClawKimi-VL-A3B-Thinking实现图片语音描述服务 1. 项目背景与动机 去年在一次志愿者活动中,我遇到一位视障开发者正在尝试用编程解决日常信息获取问题。看着他费力地通过屏幕阅读器逐字听取代码时,我突然意识到&…...

攻克表情显示难题:Noto Emoji企业级解决方案

攻克表情显示难题:Noto Emoji企业级解决方案 【免费下载链接】noto-emoji Noto Emoji fonts 项目地址: https://gitcode.com/gh_mirrors/no/noto-emoji 当你精心设计的聊天应用在用户手机上显示为"□□"乱码,当跨国团队的沟通因表情差异…...

嵌入式工程师成长之路(1)——元件基础(完整版)

点击下面图片带您领略全新的嵌入式学习路线 🔥爆款热榜 88万+阅读 1.6万+收藏 文章目录 前言 一、认识元件 ①、认识元件 ②、认识封装 二、电阻 1.上拉电阻与下拉电阻 ①、定义 ②、应用 ③、阻值选择 ④、因上下拉电阻引发的问题 ⑤、因一颗上拉电阻引发的思考 2.高精密采…...

OpenClaw日志分析:千问3.5-35B-A3B-FP8任务失败排查方法论

OpenClaw日志分析:千问3.5-35B-A3B-FP8任务失败排查方法论 1. 问题背景与排查思路 上周我在尝试用OpenClaw自动化处理一批产品截图时,遇到了千问3.5-35B-A3B-FP8模型频繁报错的情况。任务看似简单:让AI识别截图中的UI元素并生成改进建议&am…...

ubuntu服务器离线安装pytorch(cpu版本和gpu版本)

一、查看服务器是否有nvidia显卡(无输出则没有nvidia显卡,则不需要安装nvidia驱动、cuda、cudnn,有输出则会显示cuda版本,本服务器显示cuda版本是12.4)nvidia-smi lspci | grep -i nvidia二、本地下载对应版本的torch&…...

Linux下进行用户的切换与创建以及细微设置

目录 为什么要创建普通用户 创建新用户 Step1:正确登入自己的云服务器 add指令添加普通用户 passwd设置登录密码 查看所有用户 ls/home cat/etc/passwd cat /etc/passwd |cut -d: -f 1-3 lastlog su -l切换用户 查看当前为何用户 删除用户 ​编辑 sud…...

避坑指南:YOLOv8模型部署到小程序的5个常见错误及解决方案

YOLOv8模型部署到小程序的避坑实战手册 第一次把YOLOv8模型塞进小程序时,我盯着屏幕上那个"500 Internal Server Error"发呆了半小时。这已经是第三次部署失败了,Docker日志里那些红色错误信息像在嘲笑我的天真。后来才发现,原来只…...

OpenClaw+千问3.5-35B-A3B-FP8:自动化财务报表生成与分析

OpenClaw千问3.5-35B-A3B-FP8:自动化财务报表生成与分析 1. 为什么需要自动化财务处理 每个月末,我都会面对同样的烦恼:银行流水、电子发票、Excel表格散落在不同平台,手动整理耗时费力。直到发现OpenClaw与千问3.5模型的组合&a…...

如何快速掌握大规模移动应用开发:10个核心技巧与最佳实践

如何快速掌握大规模移动应用开发:10个核心技巧与最佳实践 【免费下载链接】discussions Discussions about projects, technologies, and processes around building large-scale mobile apps 项目地址: https://gitcode.com/gh_mirrors/di/discussions GitH…...

一款基于 .NET 开源、跨平台应用程序自动升级组件露

基础示例:单工作表 Excel 转 TXT 以下是将一个 Excel 文件中的第一个工作表转换为 TXT 的完整步骤: 1. 加载并读取Excel文件 from spire.xls import * from spire.xls.common import * workbook Workbook() workbook.LoadFromFile("示例.xlsx"…...

JavaScript交互功能实现:StartBootstrap Freelancer 导航栏与滚动效果

JavaScript交互功能实现:StartBootstrap Freelancer 导航栏与滚动效果 【免费下载链接】startbootstrap-freelancer A flat design, one page, MIT licensed Bootstrap portfolio theme created by Start Bootstrap 项目地址: https://gitcode.com/gh_mirrors/st/…...

PX41.13.3版本常用参数

1.预解锁参数COM_PREARM_MODE 默认值 Disabled2. TAKE OFF起飞模式,规定时间内是否起飞成功COM_LKDOWN_TKO 默认值3s3.飞控与机载电脑通信,信号丢失时间判断以及动作COM_OBC_LOSS_L 默认值5sCOM_OBC_ACT 默认值 降落模式COM_OBC_RC_ACT 默认值 定点模…...

HtmlTextView项目维护指南:如何继续开发这个停止维护的开源项目

HtmlTextView项目维护指南:如何继续开发这个停止维护的开源项目 【免费下载链接】html-textview TextView to display simple HTML 项目地址: https://gitcode.com/gh_mirrors/ht/html-textview 你是否正在寻找一个轻量级的Android HTML文本显示解决方案&…...

JS中彻底删除JSON对象组成的数组中的元素

在 JS 中,对于某个由 JSON 对象组成的数组,例如:var test [{ "a": "1", "b": "2" }, { "a": "3", "b": "4" }, { "a": "5", "b…...

OpenClaw私人教练:Phi-3-mini定制健身计划系统

OpenClaw私人教练:Phi-3-mini定制健身计划系统 1. 为什么需要AI私人教练 去年夏天,我发现自己陷入了典型的"健身困境":办了昂贵的健身房会员卡,却因为缺乏科学指导而收效甚微。传统健身APP的模板化方案无法适应我不断…...

PCB设计新手必看:从布局到EMC的10个实用避坑技巧

PCB设计新手必看:从布局到EMC的10个实用避坑技巧 刚接触PCB设计时,总会在各种细节上栽跟头。记得我第一次画板子时,晶振离MCU太远导致时钟信号不稳定,调试了整整两天才找到问题。这种经历让我深刻意识到,PCB设计不仅是…...

如何用ok-ww实现《鸣潮》全自动战斗与声骸收集:终极懒人指南

如何用ok-ww实现《鸣潮》全自动战斗与声骸收集:终极懒人指南 【免费下载链接】ok-wuthering-waves 鸣潮 后台自动战斗 自动刷声骸 一键日常 Automation for Wuthering Waves 项目地址: https://gitcode.com/GitHub_Trending/ok/ok-wuthering-waves 你是否厌倦…...