如何从javascript中的一个线性箭头函数返回匿名对象? [复制]

Posted

技术标签:

【中文标题】如何从javascript中的一个线性箭头函数返回匿名对象? [复制]【英文标题】:How to return anonymous object from one liner arrow function in javascript? [duplicate] 【发布时间】:2016-10-27 04:18:38 【问题描述】:

我最近切换到 es6 并开始在我的代码中使用箭头函数。 在重构时我遇到了下面的代码

data.map(function(d) 
   return id: d.id, selected: bool;
);

我把上面的代码改成了这个-

data.map((d) => id: d.id, selected: bool);

但是我从上面的代码中得到了错误。我不知道这里有什么问题? 我知道如果没有代码块,那么箭头函数会提供隐式返回。

但不知道如何返回空对象或初始化了某些属性的匿名对象?

编辑:

如果我这样做有什么问题?只是为了好奇。

data.map((d) => new id: d.id, selected: bool);

【问题讨论】:

这是我在研究这个主题rainsoft.io/when-not-to-use-arrow-functions-in-javascript(尤其是第 2 点和第 4 点)时发现的一个有趣的稍微相关的读物 关于您的编辑,这将引发 TypeError。 new 关键字需要构造函数。你可以做new Object(id: d.id, selected: bool),但这将首先创建文字对象(使用... 语法),然后将其复制到另一个对象(使用new Object(...) 构造函数)。最好在 Pointy 的答案中使用括号 【参考方案1】:

在对象初始化器周围加上括号:

data.map((d) => (id: d.id, selected: bool) );

括号对其中的表达式的值没有影响,但它们确实具有消除所包含表达式的第一个标记的歧义的句法效果。如果没有括号,JavaScript 解析器必须决定 标记是指“这里开始一个函数体”还是“这里开始一个对象初始化程序”。它总是选择前者(即代码块)。

因此,引入括号可以消除混淆:前导 ( 唯一可以表示的意思是“这里有一个表达式”,因此 括号内只能是“这里有一个对象初始化器。” (换句话说,你不能在表达式中间放置一段代码;如果你尝试,那么你会得到一个语法错误。)

【讨论】:

请您也解释一下编辑的部分吗? @WitVault 使用new 是错误的,因为new 仅在它之后是对函数的引用时才有效。如果你尝试这样做,你也会得到一个错误。 你是对的,我得到了错误。但只是想了解底层发生了什么。 @JoshM。在 JavaScript 中 new 后跟一个对象字面量或对象引用 never 是有意义的。 new 运算符仅适用于函数。 我知道 现在 是这样工作的,但是当引入箭头函数/lambdas 时,似乎 new 的目的可以扩展以使其更多干净。【参考方案2】:

您好,我认为您需要添加括号来返回对象字面量

// 给正文加上括号以返回一个对象字面量表达式: 参数 => (foo: bar)

来自https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions

【讨论】:

+1;具体在Advanced Syntax 部分下。【参考方案3】:

你也可以使用

data.map((d) => 
    return id: d.id, selected: bool
 );

【讨论】:

谢谢,但操作人员并没有这么问。 one liner

以上是关于如何从javascript中的一个线性箭头函数返回匿名对象? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Javascript 中的连续函数返回布尔值?

如何从javascript中的函数返回值[重复]

如何从javascript中的去抖动函数返回值? [复制]

如何将id从webmethod中的函数返回到javascript代码

如何使用blueprism中的invoke js从javascript函数返回输出

JavaScript箭头函数中的this详解