定义ES6符号的简明方法?

时间:2017-08-14 23:13:28

标签: javascript ecmascript-6 symbols

如果我想在一行中定义多个符号,语法有点冗长:

const a = Symbol('a'),
    b = Symbol('b'),
    c = Symbol('c');

我想出了一个更简洁的方法来做到这一点:

const [a, b, c] = ['a','b','c'].map(key => Symbol(key))

这是最简洁的方法,还是有一些专门的语法来声明我不知道的多个符号?

P.S。 'a'''b'和'c'当然只是任意的例子。我意识到人们可以通过这个特殊的例子变得聪明;)

3 个答案:

答案 0 :(得分:2)

你可能会错过一个有趣的FP部分,那就是在纯系统中,你总是可以用返回的命名引用替换匿名函数(更常见的是,你可以随时将函数替换为它将返回的值),假设您要替换的函数和替换它的函数使用相同数量的参数。

const [a, b, c] = ["a", "b", "c"].map(Symbol);

只要你记住你可以在这里造成事故,通过传递期望超过1个参数的函数,应该工作得很好。

当然,没有比你已经拥有的更简洁。 ......但仍然不止。

答案 1 :(得分:1)

如果您不介意使用无法填充的仅ES6功能,可以使用一个选项,即使用Proxy为每个属性访问返回一个符号。你可以制作一个像

这样的辅助模块文件
module.exports = function autoSymbols() {
  return new Proxy({}, {
    get(target, name, receiver){
      return Symbol(name);
    },
  });
}

然后做

const {a, b, c} = require('./auto-symbols');

虽然我个人认为手动枚举Symbol实例更容易维护。

答案 2 :(得分:1)

它可以像

一样简洁
const [a, b, c] = ['a','b','c'].map(Symbol);

这里没有办法跳过 abc 重言式,因为应该明确写出变量名,以及符号说明。

符号描述有助于调试。如果它们可以省略(不推荐),则变为

const [a, b, c] = [,,].map(Symbol);

用于固定数量的变量。和

const [a, b, c, d /*, ... */] = function* () { for(;;) yield Symbol() }();

无限量的变量。