Javascript 定义ES6符号的简明方法?

Javascript 定义ES6符号的简明方法?,javascript,ecmascript-6,symbols,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)) 这是可能的最简洁的方式,还是有一些专用的语法来声明我不知道的多个符号 当然,“a”、“b”和“c”只是任意的例子。我意识到一个人可以通过这个特殊的例子变得聪明 FP有一个有趣的

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

const a = Symbol('a'),
    b = Symbol('b'),
    c = Symbol('c');
我想出了一个更简洁的方法:

const [a, b, c] = ['a','b','c'].map(key => Symbol(key))
这是可能的最简洁的方式,还是有一些专用的语法来声明我不知道的多个符号


当然,“a”、“b”和“c”只是任意的例子。我意识到一个人可以通过这个特殊的例子变得聪明

FP有一个有趣的部分你可能会错过,那就是在纯系统中,你总是可以用返回的命名引用替换匿名函数,更一般地说,你总是可以用它返回的值替换函数,假设要替换的函数和要替换的函数具有相同数量的参数

const [a, b, c] = ["a", "b", "c"].map(Symbol);
应该可以正常工作,只要您记住,通过传递期望多于1个参数的函数,可能会在这里造成意外


当然,没有比你已经拥有的更简洁的了。。。但是仍然比没有更重要。

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

const [a, b, c] = ["a", "b", "c"].map(Symbol);
应该可以正常工作,只要您记住,通过传递期望多于1个参数的函数,可能会在这里造成意外


当然,没有比你已经拥有的更简洁的了。。。如果您不介意使用ES6独有的、不能进行多填充的功能,那么有一个选项是使用代理,为每个属性访问返回一个符号。您可以创建一个助手模块文件,如

module.exports = function autoSymbols() {
  return new Proxy({}, {
    get(target, name, receiver){
      return Symbol(name);
    },
  });
}
那就做吧

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

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

如果您不介意使用ES6独有的功能(不能进行多填充),那么有一个选项是使用代理,为每个属性访问返回一个符号。您可以创建一个助手模块文件,如

module.exports = function autoSymbols() {
  return new Proxy({}, {
    get(target, name, receiver){
      return Symbol(name);
    },
  });
}
那就做吧

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

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

它可以尽可能简洁

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

用于无限量的变量。

它可以尽可能简洁

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

对于无限量的变量。

解构似乎是实现这一点的最简洁的方法。我不知道你是否能打败解构,虽然我不确定这是否有效,但也许s=Symbol,a=s'a',b=s'b',c=s'c'@Slai-你应该测试它-我不会说它更简洁,它只是更短:对于记录,s=Symbol确实有效,谢谢:解构似乎是实现这一点的最简洁的方法。我不知道你是否能打败解构,虽然我不确定这是否有效,但也许s=Symbol,a=s'a',b=s'b',c=s'c'@Slai-你应该测试一下-我不会说这更简洁,只是更短:p对于记录,s=Symbol确实有效,谢谢:为什么是代理?这是iterable的完美用例,它根据属性为它们命名。我完全同意iterable是另一个很好的解决方案,这是一个很好的观点。我想这应该在答案中说明。一般来说,符号可调试性不应该为代码+1而牺牲。这是非常聪明的,谢谢你:它有点复杂,所以我接受了埃斯特斯的答案,但我仍然可以尝试它。。。当你说手动枚举符号会更容易维护时,你是在说同样的话-更容易阅读-还是有更多的内容?哦,通过枚举它们,我的意思是像你在问题中所做的那样手动列出它们,因为我看到你的小冗长示例更容易维护,你只需要写一次,为什么要用代理?这是iterable的完美用例,它根据属性为它们命名。我完全同意iterable是另一个很好的解决方案,这是一个很好的观点。我想这应该在答案中说明。一般来说,符号可调试性不应该为代码+1而牺牲。这是非常聪明的,谢谢你:它有点复杂,所以我接受了埃斯特斯的答案,但我仍然可以尝试它。。。当你说手动枚举符号更容易维护时,你是说
同样的事情-更容易阅读-或者还有更多吗?哦,通过列举它们,我的意思是像你在问题中所做的那样手动列出它们,因为我认为你的详细示例更易于维护,而且你只需要编写一次。这一点很好。实际上,我经常按照您的建议传入函数本身,而不是创建一个新的匿名函数,但在这种特殊情况下,我没有想到这一点——感谢您指出:这一点很好。实际上,我经常按照您的建议传入函数本身,而不是创建一个新的匿名函数,但在这种特殊情况下,我没有想到这一点-感谢您指出: