繁体   English   中英

JavaScript object 解构和别名

[英]JavaScript object destructuring and aliasing

有没有办法在 JavaScript 中解构 object 并别名为本地解构的 object?

就像是:

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 功能。

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

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;

如您所料,结果声明了一个值为1的新常量a 但是, 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 属性”和“spread 属性” ,但它们似乎对我们没有帮助。


我们需要的是一种新的语法,用于将属性挑选到另一个对象中。 为此提出了各种建议,但没有一个得到了很大的关注。 一种是“扩展点符号”,它允许在点之后放置一个花括号结构。 在你的情况下,你会写

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

您可以 在此处了解有关此提案的更多信息。

要找到为破坏的值分配新名称,只需使用:

obj = {x: 10, y: "Something"};
const { x: otherName } = obj;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM