利用位反操作来简化 indexOf 判断

补码

在计算机系统中,数值用补码来表示。任何数值 n 的位反等于 -(n + 1):

1
~n === -(n + 1)

可以得到:

1
2
3
4
5
6
7
8
~9 === -10
~8 === -9
~1 === -2
~0 === -1
~-1 === 0
~-2 === 1
~-9 === 8
~-10 === 9

很明显,只有 ~-1 才等于 0. 对非 -1 值取反永远不为 0.

String#indexOf

String 的 indexOf 方法,找到时,返回自然数;没找到,则返回 -1. 常见代码:

1
2
3
if (str.indexOf('sub') !== -1) {
   // code
}

利用位反操作,可简化为:

1
2
3
if (~str.indexOf('sub')) {
   // code
}

更普适的规律是:

  1. n !== -1 可简化为 ~n
  2. n === -1 可简化为 !~n

Array#indexOf

涉及状态判断时,很容易写出以下代码:

1
2
3
if (statusCode === 301 || statusCode === 302) {
  // code
}

利用 Array#indexOf, 上面的代码可简化成:

1
2
3
if ([301, 302].indexOf(statusCode) !== -1) {
   // code
}

用位反操作,可进一步简化:

1
2
3
if (~[301, 302].indexOf(statusCode)) {
   // code
}

类似的,可以:

1
2
3
if (~["loaded", "complete"].indexOf(readyState)) {
   // code
}

写在最后

一般来说,位反等简化方式有损可读性。可读性有两方面:

  1. 自己的代码给他人看。这时代码的通俗易懂很重要,尽量少用奇技淫巧。
  2. 自己看他人的代码。这时要让自己的知识面尽可能广,包括吃透各种奇技淫巧。

从学习的角度讲,吃透一些奇技淫巧,经常能深入到语言的部分底层细节,非常有益处。

还有一个不容忽视的现象:奇技淫巧有阶段性。好的技巧,在小圈子流行后,有可能会慢慢被大众接受,也就不再是奇技淫巧了,比如 (function(){ /* code */ })().

总之,技巧不怕多,权衡去用就好。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值