繁体   English   中英

将 object 文字转换为 ES6 Javascript 中的函数

[英]Converting object literals into functions in ES6 Javascript

我在hackernoon.com 阅读了这篇文章,它试图解释一种将javascript Switch/Case 变成它自身的功能版本的特定方法。

文章达到了一个点,他们设置了一个名为 switchcase 的switchcase ,定义为:

const switchcase = cases => defaultCase => key =>
  cases.hasOwnProperty(key) ? cases[key] : defaultCase

他们还说这个 function 有一个问题,因为“整个 object 文字在传递给 switchcase 函数之前已经过评估”。 因此他们决定将 object 文字中的值转换为函数。 为此,他们使用以下语法:

const switchcaseF = cases => defaultCase => key =>
  switchcase(cases)(defaultCase)(key)()

我的问题是:最后一个语法是如何工作的? 谁能帮我分解一下?

通过使用函数,您还需要为defaultCase取一个 function。

 const switchcase = cases => defaultCase => key => cases.hasOwnProperty(key)? cases[key]: defaultCase const switchcaseF = cases => defaultCase => key => switchcase(cases)(() => defaultCase)(key)() // ^^^^^^^^^^^^^^^^^ ^^ console.log(switchcaseF({ foo: () => 'bar' })('nothing')('foo')); console.log(switchcaseF({ foo: () => 'bar' })('nothing')('baz'));

如果用简单的 function 重写它,它将被清除。

首先,重写switchcase 这个 function 是用三个 arguments 柯里化下一个 function 的结果

function switchcase(cases, defaultCase, key){
    if(cases.hasOwnProperty(key)){
        return cases[key];
    }
    return defaultCase;
}

所以,如果重写switchcaseF我们得到下一个:

function switchcaseF(cases, defaultCase, key){
    var selectedFunc = switchcase(cases, defaultCase, key);

    return selectedFunc();
}

最后一个语法是如何工作的? 谁能帮我分解一下?

考虑switchcaseswitchcaseF的定义。

const switchcase = cases => defaultCase => key =>
  cases.hasOwnProperty(key) ? cases[key] : defaultCase

const switchcaseF = cases => defaultCase => key =>
  switchcase(cases)(defaultCase)(key)()

如果我们在switchcase中内联switchaseF的应用程序,我们会得到以下结果。

const switchcaseF = cases => defaultCase => key =>
  (cases.hasOwnProperty(key) ? cases[key] : defaultCase)()
//|____________________________________________________|
//                           |
//          switchcase(cases)(defaultCase)(key)

此外,我们可以将 function 应用程序移动到条件表达式中。

const switchcaseF = cases => defaultCase => key =>
  cases.hasOwnProperty(key) ? cases[key]() : defaultCase()

现在,考虑您链接到的文章中的示例。

const counter = (state = 0, action) =>
  switchcaseF({
    'INCREMENT': () => state + 1,
    'DECREMENT': () => state - 1
  })(() => state)(action.type)

如果我们在counter中内联switchcaseF的应用程序,我们会得到以下结果。

const counter = (state = 0, action) => {
  const cases = {
    'INCREMENT': () => state + 1,
    'DECREMENT': () => state - 1
  }
  const defaultCase = () => state
  const key = action.type
  return cases.hasOwnProperty(key) ? cases[key]() : defaultCase()
}

因此,如果action.type'INCREMENT'那么结果是state + 1 如果action.type'DECREMENT'那么结果是state - 1 否则,结果为state

我们写() => state + 1而不是简单的state + 1的原因是为了惰性求值 我们只在调用 function 时评估() => state + 1的主体。 这可以防止不正确的行为,如下例所示。

 const switchcase = cases => defaultCase => key => cases.hasOwnProperty(key)? cases[key]: defaultCase const never = () => { while (true); } const example = key => switchcase({ never: never() })('it works')(key) console.log(example('it should work')) // expected 'it works' but never returns

使用switchcaseF解决了这个问题。

 const switchcaseF = cases => defaultCase => key => cases.hasOwnProperty(key)? cases[key](): defaultCase() const never = () => { while (true); } const example = key => switchcaseF({ never: () => never() })(() => 'it works')(key) console.log(example('it should work')) // 'it works' as expected

但是,请注意,您也可以使用 getter 使其与switchcase一起使用。

 const switchcase = cases => defaultCase => key => cases.hasOwnProperty(key)? cases[key]: defaultCase const never = () => { while (true); } const example = key => switchcase({ get never() { return never(); } })('it works')(key) console.log(example('it should work')) // 'it works' as expected

我们也可以让defaultCase变得懒惰。

 const switchcase2 = cases => defaultCase => key => cases.hasOwnProperty(key)? cases[key]: defaultCase.value const never = () => { while (true); } const example = key => switchcase2({ get never() { return never(); } })({ get value() { console.log('yes'); return 'it works'; } })(key) console.log(example('it should work')) // 'yes' 'it works' as expected

如果您不希望它变得懒惰,那么您可以将其strict包装如下。

 const switchcase2 = cases => defaultCase => key => cases.hasOwnProperty(key)? cases[key]: defaultCase.value const never = () => { while (true); } const strict = value => ({ value }) const example = key => switchcase2({ get never() { return never(); } })(strict('it works'))(key) console.log(example('it should work')) // 'it works' as expected

希望能解开你的疑惑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM