Javascript 程序化解构
我有一个不同的用例,当使用解构的概念时,我希望新变量的名称来自不同的变量 对于ex(通常的分解):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”
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在那里提到了错误。