按位非运算符“~”
2015-10-06 11:21
489 查看
按位非运算符“~”
先看看w3c的定义:位运算 NOT 由否定号(~)表示,它是 ECMAScript 中为数不多的与二进制算术有关的运算符之一。
位运算 NOT 是三步的处理过程:
把运算数转换成 32 位数字
把二进制数转换成它的二进制反码(0->1, 1->0)
把二进制数转换成浮点数
简单的理解,对任一数值 x 进行按位非操作的结果为 -(x + 1)
console.log('~null: ', ~null); // => -1 console.log('~undefined: ', ~undefined); // => -1 console.log('~0: ', ~0); // => -1 console.log('~{}: ', ~{}); // => -1 console.log('~[]: ', ~[]); // => -1 console.log('~(1/0): ', ~(1/0)); // => -1 console.log('~false: ', ~false); // => -1 console.log('~true: ', ~true); // => -2 console.log('~1.2543: ', ~1.2543); // => -2 console.log('~4.9: ', ~4.9); // => -5 console.log('~(-2.999): ', ~(-2.999)); // => 1
那么, ~~x就为 -(-(x+1) + 1)
console.log('~~null: ', ~~null); // => 0 console.log('~~undefined: ', ~~undefined); // => 0 console.log('~~0: ', ~~0); // => 0 console.log('~~{}: ', ~~{}); // => 0 console.log('~~[]: ', ~~[]); // => 0 console.log('~~(1/0): ', ~~(1/0)); // => 0 console.log('~~false: ', ~~false); // => 0 console.log('~~true: ', ~~true); // => 1 console.log('~~1.2543: ', ~~1.2543); // => 1 console.log('~~4.9: ', ~~4.9); // => 4 console.log('~~(-2.999): ', ~~(-2.999)); // => -2
~value的使用
判断数值中是否有某元素时,以前这样判断:if(arr.indexOf(ele) > -1){...} //易读
现在可以这样判断,两者效率:
if(~arr.indexOf(ele)){...} //简洁
~~value的使用
对于浮点数,~~value可以代替parseInt(value),而且前者效率更高些parseInt(-2.99) //-2 ~~(-2.99) //-2
测试
var time1 = +new Date(); var count = 5000000; var ele = 1; var arr = [1,2,4,5,2]; var h = 1.01; console.time('parseInt'); for (var i = count; i > 0; i--) { parseInt(h); } console.timeEnd('parseInt'); //84.385ms console.time('~~'); for (var i = count; i>0; i--) { ~~h; } console.timeEnd('~~'); //13.386ms console.time('arr.indexOf(ele) > -1'); for (var j = count; j>0; j--) { arr.indexOf(ele) > -1; } console.timeEnd('arr.indexOf(ele) > -1'); //16.263ms console.time('~arr.indexOf(ele)'); for (var i = count; i>0; i--) { ~arr.indexOf(ele); }
相关文章推荐
- NSbundle
- win7 x64双机联调
- Leetcode Binary Tree Level Order Traversal II
- spring 源码如何导入到eclipse
- QT中一些常用的类
- wkhtmltoxwkhtmltopdf linux 安装
- jQuery源码分析之jQuery.eq()和jQuery.get()方法比较
- java中的堆、栈、常量池
- 在view中实现UIViewController的跳转 By H.L
- HDU 3911 Black And White (线段树区间更新)
- PS之2.光与色的关系(2)
- 如何分析一个QT类
- Spring整合CXF发布Web Services
- Android XUtils框架学习及注意事项
- json加密
- 用sql做apriori商品关联销售分析
- spring mvc 环境搭建
- 【codevs10月月赛(第三次)】day 1
- go语言 安装版 Windows7安装截图
- SQL2008无法连接到.\SQLEXPRESS,用户'sa'登录失败(错误18456)图文解决方法