2017-08-14 26 views
1

如果我想在一行中定义多个符号,语法有点冗长:简明的定义ES6符号的方式?

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'当然是任意的例子。我意识到可以用这个特殊的例子来搞明白;)

+0

解构似乎是实现这一点最简洁的方法。我不知道你是否可以击败解构,尽管 – Vivick

+0

不确定这是否有效,但也许's =符号,a = s('a'),b = s('b'),c = s('c ')' – Slai

+0

@Slai - 你应该测试它 - 我不会说这更简洁,它只是更短:p –

回答

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() }(); 

为无限量的变量。

2

你可能错过了一个有趣的FP部分,那就是在一个纯系统中,你总是可以用一个命名参考替换一个匿名函数这是返回的(更一般地说,你可以总是用它将返回的值替换一个函数),假设你正在替换的函数和你替换它的函数采用相同数量的参数。

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

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

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

+0

好点。实际上,我经常只是传递函数本身(如您所建议的),而不是创建一个新的匿名函数,但在这种特殊情况下我不会发生这种情况 - 感谢您指出它:) –

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情况下手动更容易维护。

+0

为什么使用代理?对于可迭代来说,这是一个完美的用例。 – estus

+0

这给了他们基于属性的名字。我完全同意,迭代是另一个很好的解决方案。 – loganfsmyth

+0

这是一个很好的观点。我想这应该在答案中说明。通常,代码可调试性不应该为代码高尔夫而牺牲。 – estus