JavaScript对象解构和别名

时间:2016-02-21 02:58:46

标签: javascript ecmascript-6 babeljs

有没有办法在JavaScript中对对象进行解构,并为本地解构对象设置别名?

类似的东西:

const env = {ENV_VAR_X, ENV_VAR_Y, ENV_VAR_Z} = process.env;

...并让env成为包含所选环境变量的局部常量。 (我知道我的例子不适用于babel)

{
  ENV_VAR_X: "s867c7dsj4lal7", 
  ENV_VAR_Y: "hd73m20s-a=snf77f", 
  ENV_VAR_Z: "production"
}

有没有办法实现这种混叠?

另一方面,我使用babel作为我的转换程序,然后使用节点运行脚本,以便我可以利用更多ECMAScript 6功能。

1 个答案:

答案 0 :(得分:9)

根据我对规范的解读,这应该是可以解析的,但这并不意味着你的想法。它将从右到左解析为

const env = ({ENV_VAR_X, ENV_VAR_Y, ENV_VAR_Z} = process.env);

生产地点

({ENV_VAR_X, ENV_VAR_Y, ENV_VAR_Z} = process.env)
与所有其他作业一样,

被定义为评估RHS ,即process.env

因此,您的代码等同于

const {ENV_VAR_X, ENV_VAR_Y, ENV_VAR_Z} = process.env;
const env = process.env;

验证这一点非常容易:

const foo = {a: 1, b: 2};
const bar = {a} = foo;

会导致新的常量a被声明为值1,正如您所期望的那样。但是,bar的值是“解构对象的别名”,即{a: 1};它与foo相同,即{a: 1, b: 2}bar === foo

在SO讨论组和ES讨论小组中已多次讨论您要做的事情。底线是没有办法做到这一点。你所能做的就是:

const {ENV_VAR_X, ENV_VAR_Y, ENV_VAR_Z} = process.env;
const env = {ENV_VAR_X, ENV_VAR_Y, ENV_VAR_Z};

换句话说,没有办法“将对象解构为对象”,或“从对象中挑选对象”。您只能将对象解构为变量。

你可以回归过去的方式:

const env = {ENV_VAR_X: process.env.ENV_VAR_X, ...
我知道这很可怕。

您可以使用下划线中的pick函数或编写自己的函数,但这需要您说

const env = _.pick(process.env, 'ENV_VAR_X', "ENV_VAR_Y', 'ENV_VAR_Z');

只是稍微不那么可怕。

我们为ES7提出了"rest properties" and "spread properties",但它们似乎对我们没有帮助。

我们需要的是一种将属性选择到另一个对象的新语法。已经提出了各种各样的建议,其中没有一个获得太多牵引力。一个是“扩展点符号”,它允许将一个卷曲括号的结构放在一个点之后。在你的情况下,你会写

const env = process.env.{ENV_VAR_X, ENV_VAR_Y, ENV_VAR_Z};
                       ^^

您可以详细了解此提案here