如何从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中的一个线性箭头函数返回匿名对象? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何将id从webmethod中的函数返回到javascript代码