ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

jstips 第 43 期:在函数参数中使用解构赋值(Destructuring in Function Parameters)

jstips 第 43 期:在函数参数中使用解构赋值(Destructuring in Function Parameters) 教程【免费下载链接】jstipsThis is about useful JS tips!项目地址https://gitcode.com/gh_mirrors/js/jstips点击查看免费下载导读本篇基于 jstips 仓库第 43 期技巧对应文件 _posts/es_ES/javascript/2016-02-12-use-destructuring-in-function-parameters.md英文版见 _posts/en/javascript/2016-02-12-use-destructuring-in-function-parameters.md讲解如何在函数参数位置直接使用 ES6 解构赋值Destructuring Assignment让接收 options 对象的函数签名变得声明式、可读、自解释。读完你将掌握参数级解构的写法、与默认参数Default Parameters的组合技巧、参数缺失/类型错误等边界情况的正确处理以及它在 Node.js 中的可用性与历史限制。参数解构把对象参数直接拆开很多开发者早已熟悉 ES6 的解构赋值语法——它让我们可以从数组或对象中一次性提取多个值。但鲜为人知的是解构语法同样可以直接写在函数的参数列表里var sayHello function({ name, surname }) { console.log(Hello ${name} ${surname}! How are you?); }; sayHello({ name: John, surname: Smith }) // - Hello John Smith! How are you?当调用方传入{ name: John, surname: Smith }时参数列表中的{ name, surname }会立即把该对象的name与surname两个属性拆成两个局部变量函数体内部无需再写params.name、params.surname。这种写法最典型的应用场景就是接收一个 options/配置对象的函数函数签名直接暴露它需要的字段而不是一个不透明的options对象调用方一眼就能看出契约。叠加默认参数调用方留空的字段自动填充对于可选项很多、调用方经常只传其中一部分的 options 对象场景可以让解构与默认参数协同工作把调用方省略或忘传的字段自动填充为默认值var sayHello2 function({ name Anony, surname Moose } {}) { console.log(Hello ${name} ${surname}! How are you?); };逐段拆解这个签名{ name Anony, surname Moose }声明解构目标对象并对name、surname两个属性分别给出默认值 {}为整个解构参数声明默认值为空对象{}——当调用方完全没传参数或传入了错误类型见下文参数处理时就改用{}作为解构来源从而避免运行时崩溃。实际调用效果sayHello2() // - Hello Anony Moose! How are you? sayHello2({ name: Bull }) // - Hello Bull Moose! How are you?注意一个细节sayHello2({ name: Bull })只传了name此时surname属性缺失便由默认值Moose顶上。这正是属性级默认值与整体对象默认值两层防护的配合。参数处理边界情况与防御性写法普通解构下的undefined泄漏如果不使用任何默认值当传入对象缺少函数签名中声明的字段时未匹配到的参数一律为undefined需要调用方自行兜底var sayHelloTimes function({ name, surname }, times) { console.log(Hello ${name} ${surname}! Ive seen you ${times} times before.); } sayHelloTimes({ name: Pam }, 5678) // - Hello Pam undefined! Ive seen you 5678 times before. sayHelloTimes(5678) // - Hello undefined undefined! Ive seen you undefined times before.整个参数缺失直接抛 TypeError更糟糕的情况是需要被解构的那个参数根本没传。此时解构无从谈起函数直接抛出异常可能导致整个应用崩溃sayHelloTimes() // - Uncaught TypeError: Cannot match against undefined or null...从概念上讲这类似于访问一个未定义对象的属性——都是对undefined/null取值只是异常类型不同。这提醒我们只要函数签名中有解构参数就必须考虑一个参数都不传的调用路径。属性默认值 对象默认值双保险为解构参数同时加上属性级默认值和整体 {}默认值可以把上述问题大部分掩盖掉var sayHelloTimes2 function({ name Anony, surname Moose } {}, times) { console.log(Hello ${name} ${surname}! Ive seen you ${times} times before.); }; sayHelloTimes2({ name: Pam }, 5678) // - Hello Pam Moose! Ive seen you 5678 times before. sayHelloTimes2(5678) // - Hello Anony Moose! Ive seen you undefined times before. sayHelloTimes2() // - Hello Anony Moose! Ive seen you undefined times before.对照三种调用可以看到 {}覆盖了整个对象缺失的情形而属性默认值覆盖了对象存在但个别属性缺失的情形——两者职责互补。只加属性默认值、不加对象默认值仍会崩溃如果把整体 {}去掉只保留属性级默认值那么对象缺失这一层防护就没了var sayHelloTimes2a function({ name Anony, surname Moose }, times) { console.log(Hello ${name} ${surname}! Ive seen you ${times} times before.); }; sayHelloTimes2a({ name: Pam }, 5678) // - Hello Pam Moose! Ive seen you 5678 times before. sayHelloTimes2a(5678) // - Hello Anony Moose! Ive seen you undefined times before. sayHelloTimes2a() // - Uncaught TypeError: Cannot match against undefined or null.从最后一行可以看到sayHelloTimes2a()依旧抛出TypeError。原文档的结论非常明确属性级默认值只对属性缺失负责只有 {}这类整体对象默认值才能兜住对象本身缺失的极端调用。可用性与历史限制需要注意解构赋值并非在写作时2016 年前后的所有运行环境中默认可用在当时的 Node.js 中解构赋值可能默认未开启。若想提前体验可在启动时显式传入 Harmony 标志node --harmony-destructuring your_script.js在浏览器端当时的支持情况也参差不齐建议实际部署前先在目标运行环境验证。上述可用性信息以原文档写作时tip 43对应 2016 年 2 月为背景。如今的主流 Node.js 版本与浏览器早已原生支持参数解构与默认参数--harmony-destructuring标志仅用于理解这段演进历史。对于现代运行环境请以当前环境的实测结果为准。与仓库内其他 ES6 技巧的呼应参数解构与默认参数是 ES6 参数体系的两块基石本仓库中还有几期技巧与之直接相关建议对照阅读Tip 12「ES6 函数中的伪必填参数」_posts/en/javascript/2016-01-12-pseudomandatory-parameters-in-es6-functions.md利用默认参数未传值时执行默认表达式的特性让_err(...)这类抛错函数成为默认值从而把参数从可选的变成伪必填的。这与本期的属性默认值填充形成互补——默认值既可以兜底也可以主动报错。Tip 44「了解传值机制」_posts/en/javascript/2016-02-13-know-the-passing-mechanism.md理解对象参数是按引用值传递call-by-sharing有助于把握解构拿到的是引用还是副本避免在解构后误改调用方对象。Tip 54「如何在函数中使用可选参数含可选回调」_posts/en/javascript/2016-05-06-use-optional-arguments.md展示了不用解构时通过arguments/剩余参数手动解析可选参数的传统写法与本期写法对比更能体会参数解构在可读性上的优势。此外本期技巧在仓库中还有 简体中文版 与 繁体中文版可作为双语对照阅读。小结一句话概括本期技巧当函数需要接收 options 对象时直接在参数列表里解构它——配合属性级默认值与 {}整体默认值就能用最少的代码写出既自解释、又对边界情况健壮不传参、少传属性、传错类型的函数签名。撰写健壮的库 API 时这套参数解构 双层默认值的组合是值得优先采用的模式。赞分享教程【免费下载链接】jstipsThis is about useful JS tips!项目地址https://gitcode.com/gh_mirrors/js/jstips点击查看免费下载相关推荐jstips 第 43 期ES6 函数参数解构Destructuring in Function Parameters完整实战指南jstips 第 43 期ES6 函数参数解构Destructuring in Function Parameters完整实战指南 本篇对应 jstips教程jstips 第 12 期ES6 伪强制参数Pseudomandatory Parameters——用默认参数实现必传校验jstips 第 12 期ES6 伪强制参数Pseudomandatory Parameters——用默认参数实现必传校验 导读 在 JavaScript教程如何快速上手LibVMI5分钟搭建虚拟化内省开发环境如何快速上手LibVMI5分钟搭建虚拟化内省开发环境 LibVMI是一款强大的虚拟化内省工具能够让开发者直接访问和分析虚拟机的内存与状态是系统安全研究、调虚拟化网络安全操作系统上一篇如何让老旧电视焕发新生MyTV-Android电视直播软件使用指南下一篇3步构建高性能Android电视直播应用MyTV-Android技术实践指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表