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

标签: Programming | 发表时间:2011-09-30 02:44 | 作者:lifesinger thanq
分享到:
出处:http://lifesinger.wordpress.com

补码

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

~n === -(n + 1)

可以得到:

~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. 常见代码:

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

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

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

更普适的规律是:

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

Array#indexOf

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

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

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

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

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

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

类似的,可以:

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

写在最后

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

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

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

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

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

相关 [利用 indexof 判断] 推荐:

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

- thanq - 岁月如歌
在计算机系统中,数值用补码来表示. 任何数值 n 的位反等于 -(n + 1):. ~9 === -10 ~8 === -9 ~1 === -2 ~0 === -1 ~-1 === 0 ~-2 === 1 ~-9 === 8 ~-10 === 9. 很明显,只有 ~-1 才等于 0. 对非 -1 值取反永远不为 0..

js 中for循环和indexOf()性能对比

- Xin - 博客园-首页原创精华区
在js中提供了indexOf()函数以获取某个字符在字符串中的index,可以通过它也判断某个字符或字符串是否存在. 但同时在js中for循环也可以实现同样的效果(判断字符是否存在). ", "¥"); //可以继续添加特殊字符 此 / 字符也不可输入 输出时会破坏JSON格式.

判断文件编码

- - ITeye博客
* @param file 文件. * @return 编码:GBK,UTF-8,UTF-16LE. 已有 0 人发表留言,猛击->> 这里<<-参与讨论. —软件人才免语言低担保 赴美带薪读研.

[转]判断文件编码

- - an74520的专栏
* * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

驾车如何判断车距?

- 谢小兔 - 百度知道_精彩推荐
悬赏分:0 - 解决时间 2010-12-30 19:40. 以轿车为例,假设前方有一个身高1.7至1.8米左右的人,脚面高在10厘米左右,膝盖高在45厘米左右,臀部在70厘米左右. 1、当你看到车前端由地面向人体脚面或脚跟上移并停留此处时,车前端与人体之间的距离为3米. 2、当你看到车前端升高到人体膝盖高度处时,车前端与人体距离为1米.

判断网络是否连接

- - CSDN博客推荐文章
作者:liao3841054 发表于2012-3-23 14:47:18 原文链接. 阅读:8 评论:0 查看评论.

Siri中文判断表现不佳

- - Solidot
苹果对中国的重视显而易见,iOS6和Mountain Lion加入了中国本地化功能,语音助手Siri开始支持普通话和粤语. 根据目前的测试,Siri的表现完全不如人意,并不具备可用性. 如果将Siri的运行分为语音识别阶段和语言理解阶段:语音识别阶段,如果用语速较慢,发音比较标准的普通话去询问Siri,那么它基本可以正常识别,但偶尔也会出现错误,出错几率高于Android上的几款国产语音软件;在语音的理解阶段,Siri的表现就完全不及格了,基本没办法去和Siri对话,而且经常会因为听不懂而返回错误代码.

百度如何判断用户粘度

- - 网站运营优化
  百度不停的提出用户粘度的重要性,最近k站后也给粘度高的网站很大的权重提升,但是,我查看了好多关于搜索引擎原理的书籍,都没有提到如何实现用户粘度是怎么样判断的. 很多使用cnzz来跟踪流量的站长都知道,里边可以统计出单个用户点击次数、页面停留时间、进入页面、离开页面等信息来判断粘度的高低,那是我们在网站挂了cnzz的统计代码,他可以监控这些数据,那么百度是怎么样判断的呢.

Nginx之if多重判断写法

- - 开心平淡对待每一天。热爱生活
nginx的if语法比较严格,并且还没and && || 这类写法,这样只能投机倒把另外想办法实现多重判断. 重点一 set $iftmp Y 将iftmp设置为Y,set命令是一个大大的亮点. 重点二 还是set部分set $iftmp "${iftmp}Y" 在set里面 ${iftmp}Y将参数叠加一次,${iftmp}是一个大大的亮点..