【问题标题】:JavaScript object destructuring and aliasingJavaScript 对象解构和别名
【发布时间】:2016-02-21 02:58:45
【问题描述】:

有没有办法在 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 功能。

【问题讨论】:

  • 在 FF Nightly 中为我工作.. gist.github.com/liam4/393863561cb20e1b90b0
  • 这太棒了,同时也很不幸!使用 babel6,但它不会:( 我想要一个针对它的示例。
  • 在 babel 修复它之前,我不确定解构是否真的可行.. :(
  • 它也不适用于 node latest :( 看起来我将不得不采取详细的路线。
  • 我已经向 babel 的问题跟踪器添加了一个功能请求。希望它可以尽快修复。没有唯一的方法可以实现这一点,而无需编写双重赋值,一个用于解构对象,一个用于别名对象?

标签: javascript ecmascript-6 babeljs


【解决方案1】:

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

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了解更多关于此提案的信息。

【讨论】:

  • 明白了。所以这根本不可能吗?我唯一的选择是 a) 处理分配给局部变量 bar 的整个对象,或者 b) 定义一个包含目标对象所需属性的新变量?
  • "导致一个新的常量 a 被声明为值为 1," --- a 不会被声明,因为在该语句中没有声明它。
  • “因此,您的代码相当于 [...]”的危险错误:ENV_VAR_* 变量变为全局变量,而不是 const。证明:(function() { const a = {x} = {x: 1}; })(); console.log(window.a === undefined && window.x === 1); // true.
猜你喜欢
  • 2020-06-14
  • 1970-01-01
  • 1970-01-01
  • 2020-04-11
  • 1970-01-01
  • 2017-07-08
  • 2018-05-02
  • 2019-06-15
  • 2014-10-24
相关资源
最近更新 更多