art*_*tch 12 javascript coffeescript
CoffeeScript有这样的语法糖:
item.getFoo?().fooParam?.bar
Run Code Online (Sandbox Code Playgroud)
这转化为长的javascript等价与getFoo==null
和fooParam==null
检查.问题是:有没有办法在vanilla javascript中使用这种语法,而不是使用CoffeeScript之外的库/翻译器/编译器?我们在项目中使用Traceur,但它没有这样的语法,因为它不符合ES6(尽管我希望如此).也许某种方式在Traceur fork中实现它?
如果你不想要确切的 CoffeeScript 语义,你可以做一些欺骗:
return item.getFoo ? (item.getFoo().fooParam || {}).bar : undefined;
Run Code Online (Sandbox Code Playgroud)
这里有一些技巧。
item.getFoo
fooParam
缺失、错误或不存在,我们用一个空对象替换它。CoffeeScript 本来可以在这里摆脱困境。bar
无论它是否存在,我们都会返回 的值。如果它确实存在,您将获得您想要的值。如果它不存在但fooParam
已设置,您将得到undefined
. 如果它因为未定义而不存在fooParam
并且我们回退到{}
,您仍然会得到undefined
。如果三元运算符妨碍,您可以编写一些帮助程序:
function defaultObject(input) { // A helper to put somewhere
return input || {};
}
return defaultObject((item.getFoo || defaultObject)().fooParam).bar;
Run Code Online (Sandbox Code Playgroud)
这甚至更棘手:用 调用时defaultObject
将返回,因此您不需要在函数调用周围使用三元运算符。如果不为真,将返回另一个空对象,从而不再需要另一个. 如果为真,则行为类似于恒等函数并返回它。{}
getFoo
fooParam
defaultObject
||
fooParam
defaultObject
我确信这可以进一步降低,但我建议避免这种模式。任何阅读你的代码的人都会感到相当困惑,并指责你把代码库搞得一团糟。
归档时间: |
|
查看次数: |
1710 次 |
最近记录: |