Javascript 返回对象的ECMAScript 6 arrow函数

Javascript 返回对象的ECMAScript 6 arrow函数,javascript,ecmascript-6,arrow-functions,Javascript,Ecmascript 6,Arrow Functions,从arrow函数返回对象时,由于语法中存在歧义,似乎有必要使用一组额外的{}和return关键字 这意味着我不能写p=>{foo:bar},但必须写p=>{return{foo:bar};} 如果arrow函数返回的不是对象,则不需要{}和返回,例如:p=>“foo” p=>{foo:bar}返回未定义的 修改后的p=>{“foo”:“bar”}抛出“SyntaxError:意外标记:':” 是否有明显遗漏的内容?必须将返回的对象文字括在括号中。否则,将考虑使用大括号表示函数体。以下工作: p

从arrow函数返回对象时,由于语法中存在歧义,似乎有必要使用一组额外的
{}
return
关键字

这意味着我不能写
p=>{foo:bar}
,但必须写
p=>{return{foo:bar};}

如果arrow函数返回的不是对象,则不需要
{}
返回,例如:
p=>“foo”

p=>{foo:bar}
返回
未定义的

修改后的
p=>{“foo”:“bar”}
抛出“
SyntaxError
:意外标记:'


是否有明显遗漏的内容?

必须将返回的对象文字括在括号中。否则,将考虑使用大括号表示函数体。以下工作:

p => ({ foo: 'bar' });
不需要将任何其他表达式括在括号中:

p => 10;
p => 'foo';
p => true;
p => [1,2,3];
p => null;
p => /^foo$/;
等等


参考资料:

您可能想知道,为什么语法有效(但没有按预期工作):

这是因为:

因此,如果将上述代码传输到ES5,它应该如下所示:

var func = function (p) {
  foo:
  "bar"; //obviously no return here!
}

如果arrow函数体用大括号括起来,则不会隐式返回。将对象用括号括起来。它看起来像这样

p => ({ foo: 'bar' })
通过将主体包装在parens中,函数将返回
{foo:'bar}


希望这能解决你的问题。如果没有,我最近写了一篇关于箭头函数的文章,其中更详细地介绍了它。我希望你觉得它有用

您可以随时查看以下内容以获得更多自定义解决方案:

x => ({}[x.name] = x);
ES6 Arrow函数返回一个对象 正确的方法

  • 正常函数返回一个对象
  • 
    const getUser=user=>{return{name:user.name,age:user.age};};
    const user={name:“xgqfrms”,年龄:21};
    log(getUser(user));
    //{姓名:“xgqfrms”,年龄:21}
    
  • (js表达式)
  • 
    const getUser=user=>({name:user.name,age:user.age});
    const user={name:“xgqfrms”,年龄:21};
    log(getUser(user));
    //{姓名:“xgqfrms”,年龄:21}
    
    解释

    裁判

    问题: 当您在做以下事情时:

    p => {foo: "bar"}
    
    JavaScript解释器认为您正在打开一个多语句代码块,在该代码块中,您必须显式地提到一个返回语句

    解决方案: 如果箭头函数表达式具有单个语句,则可以使用以下语法:

    p => ({foo: "bar", attr2: "some value", "attr3": "syntax choices"})
    
    p => {return {foo: "bar", attr2: "some value", "attr3": "syntax choices"}}
    
    但是,如果希望有多个语句,则可以使用以下语法:

    p => ({foo: "bar", attr2: "some value", "attr3": "syntax choices"})
    
    p => {return {foo: "bar", attr2: "some value", "attr3": "syntax choices"}}
    
    在上面的示例中,第一组大括号打开一个多语句代码块,第二组大括号用于动态对象。在arrow函数的多语句代码块中,必须显式使用返回语句


    有关更多详细信息,请检查

    我很好奇为什么parens会起作用。@wrschneider因为没有parens,js parser认为它是一个函数体,而不是一个对象,而foo是@wrschneider更具体地说,就AST节点而言,使用括号表示一个表达式语句,其中可以存在一个对象表达式,而默认情况下,大括号被解释为块语句。不知道为什么这样做,但如果您想使用
    p
    的值作为对象文本的键,则可以这样做:
    p=>({[p]:'bar'})
    。如果没有
    []
    ,它要么是
    未定义的
    ,要么就是字面意义上的字母
    p
    @DanMan,它被称为对象文本的一个特征。标签是一个很少使用且深奥的特征。它们真的有价值吗?我觉得它们应该被弃用,并最终被删除。@Kenmore请参阅-向后兼容性。浏览器将拒绝实现破坏现有功能的功能sites@Kenmore如果嵌套循环已标记,则可以退出嵌套循环。不经常使用,但绝对有用。为什么我们不必在括号内使用return关键字?我不清楚什么时候使用return关键字,什么时候不使用它,JS非常灵活,为这种语言的新用户创建了大量的bug。我希望它像“Java”语言一样严格,它甚至不会返回新对象。在那里创建的对象将被丢弃。这与这个问题没有什么关系。