高效javascript函数的关键是易理解、少出错、省资源:参数≤2个,多用解构对象;一函数一职责;避免无谓拷贝;合理使用async/await与promise.all;默认值直接写参数中。

写高效的 JavaScript 函数,关键不在“炫技”,而在于让函数更易理解、更少出错、更省资源。以下是从工程实践和性能角度提炼出的实用清单,不堆砌理论,直指日常开发中的痛点。
参数控制在两个以内,多用配置对象
参数超过三个,调用时就容易记混顺序,测试也要覆盖大量组合。把相关参数打包成对象,既自解释又方便扩展。
- 别这样写:
formatDate(year, month, day, format, locale) - 改成这样:
formatDate({ year, month, day, format: 'yyyy-MM-dd', locale: 'zh-CN' }) - 好处:新增字段无需改函数签名;默认值可直接写在解构里;调用时字段名一目了然
一个函数只解决一个问题
函数名要是动词短语,且能准确说出它“做了什么”。如果函数里出现多个 if 分支处理不同逻辑,或者同时读数据、校验、发请求、更新 UI,那它大概率该拆了。
- 例如:
handleUserLogin()不如拆成validateCredentials()、fetchUserProfile()、persistSession() - 拆开后每个函数都更容易单元测试,也便于在其他流程中复用
- 判断标准:函数体里有没有“和”“或”“同时”这类连接词——有,就该分
避免参数内部重组和无谓拷贝
JS 引擎对临时数组、对象分配很敏感。尤其在高频调用或循环中,[...arguments] 或 Array.from(arguments) 会触发内存分配和 GC 压力。
- 能直接用
arguments[i]就别转数组;能用for遍历就别用map再生成新数组 - 接收不定参数时,优先考虑是否真需要数组方法;否则用 rest 参数配合
for...of更轻量 - 深层嵌套对象传入后又深拷贝?先问一句:是不是真的要副本,还是只读访问就够了?
用 async/await 管理异步,但别滥用 await
async/await 让异步代码线性可读,但它本身不提速。真正影响性能的是执行顺序——串行等结果,还是并行拉数据。
- 需要依赖前序结果时,自然 await:
const user = await getUser(); const posts = await getPosts(user.id); - 彼此无关的任务,用
Promise.all并行:const [user, prefs] = await Promise.all([getUser(), getUserPrefs()]); - 避免在循环里 await(除非必须串行);改用
map + Promise.all批量发起
默认值写在参数里,别在函数体里做判断
ES6 默认参数是语法级支持,比运行时 || 或三元更清晰、更安全(不会误判 0、false、'')。
- 推荐:
function debounce(fn, delay = 150) { ... } - 不推荐:
function debounce(fn, delay) { delay = delay || 150; ... } - 对象参数也一样:
function request({ url, method = 'GET', timeout = 5000 }) { ... }
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











