ES6 粗箭头和括号`(...) => ({...})`
ES6 Fat Arrow and Parentheses `(...) => ({...})`
我一直在研究一些 Graph QL/React/Relay 示例,并且我 运行 研究了一些 st运行ge 语法。
在 Graph QL 对象中定义字段时,使用以下语法:
const xType = new GraphQLObjectType({
name: 'X',
description: 'A made up type for example.',
fields: () => ({
field: {/*etc.*/}
})
});
据我所知,这只是定义一个匿名函数并将其分配给 xType.fields。该匿名函数 returns 包含字段定义的对象。
我假设 Graph QL 模式机制可以正常工作,这必须定义为返回对象的函数,而不仅仅是一个对象。但让我感到困惑的部分是花括号周围的括号。
这是为了区分对象定义和函数定义吗?是为了 reader 清楚起见吗?
google 搜索发现的唯一相似语法是在 airbnb 风格指南中,它似乎是 readability/clarity 的东西。
随着我开始更多地使用 Graph QL,我只是在寻找超出我假设的确认或解释。
fields: () => ({
field: {/*etc.*/}
})
是一个隐式 returns 和 object(字面量)的函数。不使用 ()
JavaScript 解释器将 {}
解释为函数体的包装器而不是 object.
不使用 parens: ()
,field: ...
语句被视为 label
语句和函数 returns undefined
。等效语法是:
fields: () => { // start of the function body
// now we have to define an object
// and explicitly use the return keyword
return { field: {/*etc.*/} }
}
所以 parents 为了清楚起见不在那里。它用于使用箭头函数的 implicit-returning 特性。
这是为了编译器和 reader 的清晰起见。您示例中的 field:
语法似乎是一个明确的赠品,即这是一个对象文字,但以这段代码为例:
let f = () => {
field: 'value'
}
console.log(f()) //=> undefined
您可能希望这会记录 field
设置为 'value'
的对象,但它会记录 undefined
。为什么?
本质上,您将对象文字视为具有单个 属性 的对象文字,编译器将其视为一个函数体(由打开和关闭大括号表示,就像典型的函数一样)和单个 label statement,它使用语法 label:
。由于后面的表达式只是一个文字字符串,它永远不会返回(甚至不会分配给一个变量),函数 f()
实际上什么都不做,它的结果是 undefined
.
但是,通过在您的 "object literal," 两边放置括号,您告诉编译器将相同的字符视为一个表达式而不是一堆语句,因此返回您想要的对象。 (参见 this article on the Mozilla Development Network,来自评论部分。)
let g = () => ({
field: 'value'
})
console.log(g()) //=> { field: 'value' }
我一直在研究一些 Graph QL/React/Relay 示例,并且我 运行 研究了一些 st运行ge 语法。
在 Graph QL 对象中定义字段时,使用以下语法:
const xType = new GraphQLObjectType({
name: 'X',
description: 'A made up type for example.',
fields: () => ({
field: {/*etc.*/}
})
});
据我所知,这只是定义一个匿名函数并将其分配给 xType.fields。该匿名函数 returns 包含字段定义的对象。
我假设 Graph QL 模式机制可以正常工作,这必须定义为返回对象的函数,而不仅仅是一个对象。但让我感到困惑的部分是花括号周围的括号。
这是为了区分对象定义和函数定义吗?是为了 reader 清楚起见吗?
google 搜索发现的唯一相似语法是在 airbnb 风格指南中,它似乎是 readability/clarity 的东西。
随着我开始更多地使用 Graph QL,我只是在寻找超出我假设的确认或解释。
fields: () => ({
field: {/*etc.*/}
})
是一个隐式 returns 和 object(字面量)的函数。不使用 ()
JavaScript 解释器将 {}
解释为函数体的包装器而不是 object.
不使用 parens: ()
,field: ...
语句被视为 label
语句和函数 returns undefined
。等效语法是:
fields: () => { // start of the function body
// now we have to define an object
// and explicitly use the return keyword
return { field: {/*etc.*/} }
}
所以 parents 为了清楚起见不在那里。它用于使用箭头函数的 implicit-returning 特性。
这是为了编译器和 reader 的清晰起见。您示例中的 field:
语法似乎是一个明确的赠品,即这是一个对象文字,但以这段代码为例:
let f = () => {
field: 'value'
}
console.log(f()) //=> undefined
您可能希望这会记录 field
设置为 'value'
的对象,但它会记录 undefined
。为什么?
本质上,您将对象文字视为具有单个 属性 的对象文字,编译器将其视为一个函数体(由打开和关闭大括号表示,就像典型的函数一样)和单个 label statement,它使用语法 label:
。由于后面的表达式只是一个文字字符串,它永远不会返回(甚至不会分配给一个变量),函数 f()
实际上什么都不做,它的结果是 undefined
.
但是,通过在您的 "object literal," 两边放置括号,您告诉编译器将相同的字符视为一个表达式而不是一堆语句,因此返回您想要的对象。 (参见 this article on the Mozilla Development Network,来自评论部分。)
let g = () => ({
field: 'value'
})
console.log(g()) //=> { field: 'value' }