Javascript 程序化解构

Javascript 程序化解构,javascript,Javascript,我有一个不同的用例,当使用解构的概念时,我希望新变量的名称来自不同的变量 对于ex(通常的分解): varo={p:42,q:true}; var{p:foo,q:bar}=o; console.log(foo,bar);//工作正常您需要分配一个左值,但据我所知,您不能声明动态生成的变量名,如让[dynamicName]=value中所述。但是,对象属性是另一种选择,可以动态生成: varo={p:42,q:true}; var容器={}; var x1=“p”; var x2=“foo”

我有一个不同的用例,当使用解构的概念时,我希望新变量的名称来自不同的变量

对于ex(通常的分解):

varo={p:42,q:true};
var{p:foo,q:bar}=o;

console.log(foo,bar);//工作正常
您需要分配一个左值,但据我所知,您不能声明动态生成的变量名,如
让[dynamicName]=value
中所述。但是,对象属性是另一种选择,可以动态生成:

varo={p:42,q:true};
var容器={};
var x1=“p”;
var x2=“foo”;
var x3=“q”;
var x4=“bar”;
({[x1]:容器[x2],[x3]:容器[x4]}=o);
log(container.foo、container.bar)回答得很好。我将尝试用规范细节来解释

当我们声明一个变量时,就像这样

var {[x1]: window[x2], [x3]: window[x4]} = o;
BindingPattern:
    ObjectBindingPattern
    ArrayBindingPattern

ObjectBindingPattern:
    {}
    {BindingRestProperty}
    {BindingPropertyList}
    {BindingPropertyList, BindingRestProperty}

...
...

BindingPropertyList:
    BindingProperty
    BindingPropertyList, BindingProperty

...
...

BindingProperty:
    SingleNameBinding
    PropertyName: BindingElement

BindingElement:
    SingleNameBinding
    BindingPattern Initializer

SingleNameBinding:
    BindingIdentifier Initializer
AssignmentPattern:
    ObjectAssignmentPattern
    ArrayAssignmentPattern

ObjectAssignmentPattern:
    {}
    {AssignmentRestProperty}
    {AssignmentPropertyList}
    {AssignmentPropertyList, AssignmentRestProperty}

AssignmentPropertyList:
    AssignmentProperty
    AssignmentPropertyList, AssignmentProperty

AssignmentProperty:
    IdentifierReference Initializer
    PropertyName: AssignmentElement

AssignmentElement:
    DestructuringAssignmentTarget Initializer

DestructuringAssignmentTarget:
    LeftHandSideExpression

LeftHandSideExpression:
    NewExpression
    CallExpression

CallExpression:
    CoverCallExpressionAndAsyncArrowHead
    SuperCall
    CallExpression Arguments
    CallExpression[Expression]
    CallExpression.IdentifierName
    CallExpression TemplateLiteral
为了简洁起见,我从规范中删除了所有下标文本

它将按照以下生产方式生产:

正如
{[x1]:window[x2],[x3]:window[x4]}
不是一个,而是一个。生产过程是这样的

var {[x1]: window[x2], [x3]: window[x4]} = o;
BindingPattern:
    ObjectBindingPattern
    ArrayBindingPattern

ObjectBindingPattern:
    {}
    {BindingRestProperty}
    {BindingPropertyList}
    {BindingPropertyList, BindingRestProperty}

...
...

BindingPropertyList:
    BindingProperty
    BindingPropertyList, BindingProperty

...
...

BindingProperty:
    SingleNameBinding
    PropertyName: BindingElement

BindingElement:
    SingleNameBinding
    BindingPattern Initializer

SingleNameBinding:
    BindingIdentifier Initializer
AssignmentPattern:
    ObjectAssignmentPattern
    ArrayAssignmentPattern

ObjectAssignmentPattern:
    {}
    {AssignmentRestProperty}
    {AssignmentPropertyList}
    {AssignmentPropertyList, AssignmentRestProperty}

AssignmentPropertyList:
    AssignmentProperty
    AssignmentPropertyList, AssignmentProperty

AssignmentProperty:
    IdentifierReference Initializer
    PropertyName: AssignmentElement

AssignmentElement:
    DestructuringAssignmentTarget Initializer

DestructuringAssignmentTarget:
    LeftHandSideExpression

LeftHandSideExpression:
    NewExpression
    CallExpression

CallExpression:
    CoverCallExpressionAndAsyncArrowHead
    SuperCall
    CallExpression Arguments
    CallExpression[Expression]
    CallExpression.IdentifierName
    CallExpression TemplateLiteral
在本例中(
{[x1]:window[x2],[x3]:window[x4]}
),生产过程如下所示
->
BindingProperty
->
PropertyName:BindingElement
->
SingleNameBinding
->
BindingIdentifier

此时,
window[x2]
不是
BindingIdentifier
。这就是为什么您会得到
SyntaxError
Uncaught SyntaxError:Unexpected token[


但是它在
({[x1]:window[x2],[x3]:window[x4]}=o)
的情况下工作,因为它不再是一个变量声明,而是一个变量

生产是这样的

var {[x1]: window[x2], [x3]: window[x4]} = o;
BindingPattern:
    ObjectBindingPattern
    ArrayBindingPattern

ObjectBindingPattern:
    {}
    {BindingRestProperty}
    {BindingPropertyList}
    {BindingPropertyList, BindingRestProperty}

...
...

BindingPropertyList:
    BindingProperty
    BindingPropertyList, BindingProperty

...
...

BindingProperty:
    SingleNameBinding
    PropertyName: BindingElement

BindingElement:
    SingleNameBinding
    BindingPattern Initializer

SingleNameBinding:
    BindingIdentifier Initializer
AssignmentPattern:
    ObjectAssignmentPattern
    ArrayAssignmentPattern

ObjectAssignmentPattern:
    {}
    {AssignmentRestProperty}
    {AssignmentPropertyList}
    {AssignmentPropertyList, AssignmentRestProperty}

AssignmentPropertyList:
    AssignmentProperty
    AssignmentPropertyList, AssignmentProperty

AssignmentProperty:
    IdentifierReference Initializer
    PropertyName: AssignmentElement

AssignmentElement:
    DestructuringAssignmentTarget Initializer

DestructuringAssignmentTarget:
    LeftHandSideExpression

LeftHandSideExpression:
    NewExpression
    CallExpression

CallExpression:
    CoverCallExpressionAndAsyncArrowHead
    SuperCall
    CallExpression Arguments
    CallExpression[Expression]
    CallExpression.IdentifierName
    CallExpression TemplateLiteral

这里的产品是用
调用表达式[Expression]
完成的。这就是为什么
({[x1]:window[x2],[x3]:window[x4]}=o)
是有效的,并且它正在工作。

“我仍然无法用x2,x4替换foo,bar。”…代码示例没有准确地说明您试图做什么或出现了什么错误。您还可以更清楚地解释您试图实现的目标以及原因吗?@ADyson好的,如果失败的尝试对您有任何帮助,请检查更新的问题。我想我试图实现的目标是问题本身明确提到的。以及我不应该对这个概念感到好奇吗?谢谢你的时间:)我从来没有说过你不应该感到好奇吗?只是想知道你是否有一个实际的用例,仅此而已。你仍然没有提到由此产生的错误消息。“无法”这并不意味着什么。你能像其他人一样把最后一位变成一个代码段吗?问题是你需要一个左值来赋值。而不是
var{[x1]:foo[x3]:bar}=o;
try
({[x1]:window[x2],[x3]:window[x4]}=o);
。这类似于尝试编写
let[dynamic string]=value;
,您不能根据我所知道的内容生成要动态声明的变量名。@ADyson在那里提到了错误。