【问题标题】:ES6, parameter destructuring with default values. A way to write lessES6,使用默认值解构参数。少写的方法
【发布时间】:2018-08-14 17:58:08
【问题描述】:

我可以避免写所有字段with = ""吗?

const defaultPlayer = {
        name: "",
        surname: "",
        age: "",
        skill: ""
      }
// ...
mapPropsToValues = ({ player }) => player || defaultPlayer

我可以使用javascript来避免一直写= ""吗?

我的意思是,如果我已经知道每个字段的默认值为 ""(空字符串),我该怎么做而不是显式地写每个字段?

【问题讨论】:

  • 喜欢将"" 保存在变量中??或者你是什么意思?
  • 嗯,那些你想要的默认值,没有理由不明确地写下来。也很可能这些甚至不是所有的字符串,也许默认的age 应该是整数0 而默认的skill 应该是null
  • 不,我的意思是,如果我已经知道每个字段的默认值是""(空字符串),我该怎么做而不是明确地写每个字段?
  • @JohnSam 除非您在某处拥有所有字段(名称)的列表,否则您需要明确地写下来。
  • 仅供参考,您的地图函数将采用[{ player: somePlayer}] 之类的内容并将其映射到[somePlayer][defaultPlayer]。不确定这是否是所需的行为。

标签: javascript ecmascript-2017


【解决方案1】:

您可以使用with 块和Proxy 对象和eval 来完成此操作:

let defaultPlayer;
with (new Proxy({}, {
  has(o, key) {
    try { eval(key); }
    catch (e) { return true; }
  },
  get() {
    return '';
  }
})) {
  defaultPlayer = {
    userName,
    age,
    surname,
    isAdmin: false
  };
}

console.log(defaultPlayer);

当您省略属性值时,它会查找与键同名的变量。例如,{x}{x: x} 相同。我们可以使用 with() 语句让 JavaScript 在查找变量之前检查对象的属性。我们将定义一个 Proxy,而不是普通对象,它会为在本地环境中看不到的任何变量返回 ''(通过在 eval 输入它们的名称时测试异常)。

☠️ 这是一个带有讨厌的边缘情况的淫秽黑客。永远不要使用它。 ☠️

【讨论】:

  • 哈哈,我已经想知道我是否应该只推荐const defaultPlayer = new Proxy({}, {get(t, key) { return typeof key=="symbol" ? t[key] : ""; }}); :D
  • @Bergi,这也是“淫秽黑客”吗?你会用吗?我可以吗?
  • @JohnSam 这比 Jeremy 所做的不那么淫秽,但仍然令人讨厌。不要使用它。
  • @JohnSam 我认为没有任何体面的方法可以完成您的建议,不。 :(
猜你喜欢
  • 1970-01-01
  • 2016-10-30
  • 2016-03-20
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
  • 2017-06-14
  • 2012-08-04
  • 1970-01-01
相关资源
最近更新 更多