辩:代码中括号的取舍

最近写了一行js代码

(new Date).getTime()

被复查代码的同事揪出来要求整改,他能接受的版本是
new Date().getTime()

诚然,后边这个写法的确比较常见,但是它真的比前面那个好吗?

下面让我来分析一下

我们为什么需要括号?常见有3种原因:

  1. 程序设计语言的语法规则
  2. 利用括号表达式改变代码优先级
  3. 提高代码可读性

对于原因1,我们无从争辩:语法定义中需要括号,你偏不加,等着程序报错吧

对于原因2,比较靠谱的观点是,复杂的表达式需要多加括号,“简单”的表达式可以从简

简单-复杂的把握,各人自有分寸

我的尺度是:

if(a > 10 && a < 0 || b > 100 && b < -20) {
// blah blah blah
}
因为大学里学C++/Java的时候,我记的很清楚: 条件表达式的结合优先级

比较操作 > 与操作 > 或操作 (其实我认为这是逻辑常识)

当然有人认为这个不可靠,优先级不清晰(包括我以为大牛师兄),很可能程序执行的结果,和预期大相径庭

于是乎,上面的代码可以写成:

if(  ( (a > 10) && (a < 0) ) ) || ( (b > 100) && (b < -20) ) )
) {
// blah blah blah
}

不知的你们怎么看,反正我看了觉得有点累赘。 不过我容忍别人的尺度;你写这样的代码,我不会要求你把那些括号去掉。

[补充]:可能有些同学已经记不清逻辑运算的优先级了,那么换各更直观的例子:

sqrt(x*x + y*y)
大家会习惯写成这样么?

sqrt( (x*x) + (y*y) )
小学老师教导我们:“四则混合运算,先算乘除,再算加减”


对于原因3,我基本不同意。 

提高代码可读行有好多种方式,比如适当的空格和缩进,比如合理的注释,等等。个人以为,大量添加括号的结果基本都是让人看了头晕,在没有代码错误提示的编辑器里还非常容易出现括号不匹配的错误。

大家不妨比较一下前面if条件的两种写法,我觉得前面一个可读性更好


回到起始的例子,

在JavaScript 的语法中,创建对象的new运算,如果构造器没有参数的话,后面的括号是可选的。(这一点是js语法不同与的Java不同之处,我认为有非常积极的意义)

于是乎 new Date()  和 new Date 都是合法的表达式,其语义相同

OK,依据我们对原因2的讨论,我更倾向使用 new Date. (补充一点,大家写new Date() 我也没啥意见,程序有N种写法,多加一对括号我不会觉得恶心)

好了,现在新的问题来了, new运算 和 . 运算,哪个的优先级高? 这个不是那么直观,上课的时候老师也没强调过。。。

这样 如果我写 new Date.getTime()  就可能是 好几种理解了,我们加括号看的明确点:

 可能1. (new Date).getTime()

 可能2. new (Date.getTime)()

 可能3. new (Date.getTime())

 可能4. (new Date.getTime)()

...

实验下来,貌似JavaScript默认的优先级是“可能2”。 为了避免这样情况出现,我写成了

(new Date).getTime()

能么,大家常写的这个

new Date().getTime()

就完美了么???

事实上,这种写法也存在优先级错误的可能性。

 可能1. (new Date()).getTime()

 可能2. new (Date().getTime)()

 可能3. new (Date().getTime())

 可能4. (new Date().getTime)()

...

这样看来,我的写法比它更写法简洁且更无歧义


个人以为,通常的这种写法,是从Java语言带过来的习惯。用不同语言的时候,多思考,也许你会发现更加适合的代码风范。。。


以上,欢迎批判


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值