前端不要使用尤达表达式

前端代码里对于逻辑判断是常量在前还是变量在前,个人一直没有定论。没有定论的结果就是没有标准,没有标准的结果就是程序代码中两种风格并存,个人觉得很不爽。于是就在网上搜索资料,偶然发现有个说法叫尤达表达式,似乎答案就在这块,于是就有了下文。

尤达表达式?

尤达表达式是计算机编程中的一种风格,其中表达式的两个部分与条件语句中的典型顺序相反。这种风格的命名,来源于星球大战的一个角色,绝地大师尤达(Yoda)。剧中,该角色喜欢以颠倒的语序说英语。比如“当九百岁你活到,看起来很好你将不”。  

例子

1
2
3
4
5
6
7

if ( $value == 42 ) { /* ... */ }
// Reads like: "If the value is equal to 42..."

// 尤达表达式
if ( 42 == $value ) { /* ... */ }
// Reads like: "If 42 equals the value..."

恍然大悟,原来这就是尤达表达式。

尤达表达式的优缺点分析

优点

  • 表面出现意外的赋值,但不被发现

    比如在逻辑判断中,我们误将===写成了=,假如是value=1,并不会报错,但如果是1=value,错误直接就会被发现

  • 解决不安全的null类型操作java

缺点

  • 易读性降低

结论

优点1,个人觉得虽然变量在前会遮蔽了错误,但是这个错误,其实可以通过其它方式lint的其它规则,哪怕是code review进行避免。而优点2,比如在Java中可以体现,在JS里,实际上变量在左边还是右边,都无法避免这个空类型错误。对于缺点很明显。

尤达表达式的缺点足以盖住其优点,所以个人建议,前端不使用尤达表达式

lint

有了结论,那么就需要想办法去推进规范的写法。为了控制前端代码风格,一般我们都会加入lint,而尤达这个写法也是有对应的lint,so我们可以以此来控制逻辑判断上的代码风格。

ESLint中

1
"yoda":"never"

相关说明,戳这里

TSLint中

1
"binary-expression-operand-order": true

相关说明,戳这里

写在最后

  1. 似乎一个逻辑判断如何写,只要不错就不重要?No,即使是上述的尤达表达式,这么个细节,实际上背后也是优秀程序员对于编程风格的思考,而我们也需要多思考。
  2. 因为对于逻辑判断写法的追求,才引导了我了解到尤达表达式,so,讲究细节,从来不是多余   

    参考文档