箭头函数场景下的对象属性名简写疑问:是否有更简洁赋值方式?
针对你的JavaScript对象属性简写问题的解决方案
好问题!确实,当前JS的对象字面量语法里,{foo}是属性名简写(对应{foo: foo}),但{foo()}会被解析成对象的方法定义(相当于把函数本身赋值给foo属性,而不是执行函数后的结果),所以直接这么写肯定会报错。
目前原生JS里还没有专门的语法糖直接实现你想要的{foo()}等价于{foo: foo()}(因为前者的语法已经被方法定义占用了),不过有几种可行的写法可以帮你简化代码:
1. 最稳妥的原生写法(推荐团队协作场景)
虽然你觉得有点繁琐,但这是最清晰、兼容性最好的标准写法,可读性拉满,几乎不会有歧义:
const foo = () => 1; const bar = { foo: foo() }; // 结果:{ foo: 1 }
2. 提前缓存函数结果(适合结果需要复用的场景)
如果这个函数的执行结果要在多个地方用到,先把结果存起来再用属性简写,反而更高效:
const foo = () => 1; const fooResult = foo(); const bar = { foo: fooResult }; // 等价于 { foo: 1 }
如果只是单次使用,其实和第一种写法差别不大,但复用场景下能减少重复执行函数的开销。
3. 自定义工具函数(适合高频使用这类逻辑的场景)
如果你经常需要把具名函数的执行结果绑定到同名属性上,可以封装一个小工具函数来简化:
// 工具函数:接收一个具名函数,返回「函数名: 执行结果」的对象 const fnToProp = (fn) => ({ [fn.name]: fn() }); // 使用示例 const foo = () => 1; const bar = fnToProp(foo); // 结果:{ foo: 1 }
注意这个方法依赖函数的name属性,所以只适合有明确变量名的具名函数(刚好符合你的场景),如果是匿名函数的话属性名会变成anonymous,就不适用了。
反例:别这么写!
有人可能会想到用立即执行函数来凑,但这反而更繁琐,完全没必要:
const foo = () => 1; const bar = (() => ({ foo: foo() }))(); // 结果对,但写法更绕
总结一下:如果只是偶尔用,直接用方案1就好;如果频繁遇到这种场景,方案3能帮你省不少重复代码。
内容的提问来源于stack exchange,提问作者Dude
相关产品推荐
相关产品推荐

