【发布时间】:2017-11-12 09:27:30
【问题描述】:
问题
函数参数解构是 ES6 中一个了不起的特性。
假设我们想要一个名为f 的function 接受一个Object,它有一个a 键
function f({ a }) {
return a;
}
对于未向函数提供参数的情况,我们有默认值以避免Type Error
function f({ a } = {}) {
return a;
}
这将有助于以下情况
const a = f(); // undefined
虽然会失败
const a = f(null); // TypeError: Cannot match against 'undefined' or 'null'.
你可以看到 Babel 如何将函数转译为 ES5 here。
可能的解决方案
可以通过参数验证和预处理来避免。在Python 中我可以使用装饰器,但是在 JS 中我们没有将它们标准化,所以使用它们还不是一个好主意。
不过,假设我们有一个装饰器checkInputObject,它使用给定的项目列表(或嵌套解构情况下的树)进行必要的检查并提供默认值。
我们可以在没有@ 符号的情况下按以下方式使用它
const f = checkInputObject(['a'])(({ a }) => a);
使用@ 表示法可能看起来像这样
@checkInputObject(['a'])
function f({ a }) {
return a;
}
我也可以在函数本身中进行所有需要的操作,然后才使用解构,但在这种情况下,我失去了函数参数解构的所有优点(我根本不会使用它)
function f(param) {
if (!param) {
return;
}
const { a } = param;
return a;
}
我什至可以实现一些常见的函数,比如checkInputObject,以便在函数内部使用它
const fChecker = checkInputObject(['a']);
function f(param) {
const { a } = fChecker(param);
return a;
}
不过,使用附加代码对我来说并不优雅。我希望不存在的实体被分解为undefined。
假设我们有
function f({a: [, c]) {
return c;
}
在f() 的情况下获得undefined 会很好。
问题
您知道任何优雅且方便的方法可以使 [嵌套] 解构抵抗不存在的嵌套键吗?
我担心的是:似乎这个功能在公共方法中使用是不安全的,我需要在使用它之前自己进行验证。这就是为什么在私有方法中使用之前它似乎没用。
【问题讨论】:
-
使用
try ... catch? -
当输入与预期格式不匹配时,您究竟希望
checkInputObject做什么,从而引发异常?这正是您的代码已经完成的工作。 -
如果你想编写一个在使用无效参数 (
if (!param) return;) 调用时什么都不做的函数,你应该明确地写出来。反正很少需要这样的功能。 -
@Bergi 在我写过的问题的“可能的解决方案”部分,我希望
undefined用于未解构的值,就像未提供的普通参数一样。例如,当您调用(a => a)()时,它将返回undefined并且不会失败,因此我希望对未提供的项目进行类似的解构。 -
@Charlie 但是如果你打电话给
(a => a.prop)(),它会失败。是的,你总是可以添加语法来接受更多的值而不会失败,但你为什么要这样做呢?我看不出写一个“总是默默地忽略失败”功能的意义。
标签: javascript ecmascript-6 destructuring