Javascript ES6解构、动态分配

Javascript ES6解构、动态分配,javascript,ecmascript-6,Javascript,Ecmascript 6,这样做会创建两个新的变量(来自else),但是如果我这样写的话: let text, value; if (typeof f == 'string') { text = value = f; } else { let { text, value } = f; } 我收到一个语法错误。这里最好的方法是什么?你需要在作业周围准备好: let text, value; if (typeof f == 'string') { text = value =

这样做会创建两个新的变量(来自
else
),但是如果我这样写的话:

let text, value;
if (typeof f == 'string') {
    text = value = f;
} else {
    let {
        text, value
    } = f;
}

我收到一个语法错误。这里最好的方法是什么?

你需要在作业周围准备好:

let text, value;
if (typeof f == 'string') {
    text = value = f;
} else {
    {
        text, value
    } = f;
}
()

出于同样的原因,您需要这些参数:告诉解析器它应该使用表达式,而不是语句。如果没有parens,当它遇到
{
时,它认为这是块的开始。但与函数不同,它必须是parens,而不是前导一元数
+
,等等:

let文本,值;
if(typeof f=='string'){
文本=值=f;
}否则{

+{//或者,
const{text,value}=(typeof f=='string')?{text:f,value:f}:f;
回答得很好。次要说明:括号只需要围绕大括号;赋值本身可以在外部。@Zirak:不,括号需要围绕整个赋值表达式;否则是错误:。它们甚至有一个特定的消息:“您试图分配给一个带括号的表达式,例如,使用
({a}=0
而不是
({a}=0)
”,如果您仔细想想,这一点也不奇怪:由于paren仅在
{}
周围,它看起来像paren中的对象初始值设定项(因为在ES6中,您可以使用这种速记形式)。我不知道巴贝尔。谢谢。@RoyiNamir::-)从上面的链接看,这不是很明显,但这只是REPL工具。主要是一个非常强大的传输工具。你可以使用ES6的大部分,它会将其传输到ES5。当然,传输工具可能会降低效率。。。
let text, value;
if (typeof f == 'string') {
    text = value = f;
} else {
    ({                // ( at start
        text, value
    } = f);           // ) at end
}
let text, value;
if (typeof f == 'string') {
    text = value = f;
} else {
    +{                 // <== Doesn't work like it does with IIFEs
        text, value
    } = f;
}