利用位反操作来简化 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循环也可以实现同样的效果(判断字符是否存在). var specialWord = new Array("'", "\\", "<", ">", "%", "?", "/", "+", "@", "&", "#", "$", "……", "^", "~", "!", "‘", "’", ".

利用sockstunnel翻越

- - 0.618網絡空間
首先在你的linux vps上搭建python環境(一般來說,linux vps都已搭好了python 環境). 然後運行如下命令(假設你在/root下):. 這樣在/root/下,就生成了privkey.pem和cacert.pem. 修改sslserver.py裏的. keyfile="privkey.pem",為.

转角的空间利用

- Ivy - IDSOO
拐角的空间如果不充分利用似乎有一些浪费. 日本的设计工作室Torafu Architects设计的这个隔板巧妙地利用了拐角,搭建了一个可以放置物品的平台,设计实用、美观、大方.

旧灯泡的再利用

- Jimmy - 微奇生活
生活水平提高了,家家户户也用上了节能灯,那些废旧的白炽灯泡如何利用呢. 看看下面这些妙点子吧,可以种盆栽,做工艺品,还能用来养金鱼~~灯泡还会跳舞呢. 简洁的线圈灯:Coil Lamp. 微博:@新浪 | @腾讯     订阅:Google | 九点 | QQ | 鲜果 | 有道 | 邮箱.

[译]jboss漏洞利用

- - 互联网 - ITeye博客
原文地址:http://resources.infosecinstitute.com/jboss-exploitation/. JBoss Application Server是一个基于Jave EE的web应用服务器. 如果Jboss没有正确配置,它会允许攻击者进行各种恶意攻击. 由于JMX console可以通过端口8080远程访问,攻击者和恶意用户可以通过使用Jboss console中的DeploymentScanner功能部署他们自己的WAR(web archive)文件或shell脚本.

利用HTTP Cache来优化网站

- scourgen - 博客园-首页原创精华区
用户总是讨厌等待,面对加载的Video和页面,是非常糟糕的用户体验. 所以如何利用Cache来优化网站,值得深入研究. 缓存是一个到处都存在的用空间换时间的例子. 通过使用多余的空间,我们能够获取更快的速度. 用户在浏览网站的时候,浏览器能够在本地保存网站中的图片或者其他文件的副本,这样用户再次访问该网站的时候,浏览器就不用再下载全部的文件,减少了下载量意味着提高了页面加载的速度.

利用 nose 测试 web.py 程序

- Ken - python.cn(jobs, news)
#index.py   ----    web.py主文件. #nose_test.py ---- 测试文件脚本. -s:显示脚本print信息,默认是print的信息是不输出的. nose会查找脚本中 test_*命名的函数和Test_*命名的类. 运行测试脚本时,首先会运行脚本func级别的setUp()函数,.

Google专利“用手套看世界”

- Saint Raphael - Solidot
美国专利商标局(USPTO)授予了Google一项专利“Seeing with your hand”,简而言之是利用整合传感器的手套观察周围环境或利用手势控制电脑. 发明人之一是Google联合创始人Sergey Brin. Google在专利中解释了灵感来源:如果有东西掉进到沙发下面,人们会很自然的将手伸进沙发下去摸,通过触摸确定位置.