有没有办法在 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 作为我的转译器,然后使用 Node 运行脚本,以便我可以利用更多 ECMAScript 6 功能。
根据我对规范的阅读,这应该是可以解析的,但这并不意味着你的想法。它将被从右到左解析为
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 提出了“剩余属性”和“扩展属性”,但它们似乎对我们没有帮助。
我们需要的是一种新的语法来将属性拾取到另一个对象中。为此提出了各种建议,但没有一个获得太大关注。一种是“扩展点表示法”,它允许将花括号结构放在点后面。在你的情况下,你会写
const env = process.env.{ENV_VAR_X, ENV_VAR_Y, ENV_VAR_Z};
^^
您可以在此处了解有关此提案的更多信息。
要为已破坏的值分配新名称,只需使用以下命令:
obj = {x: 10, y: "Something"};
const { x: otherName } = obj;