今天项目中看到一个js片段,引起了我的注意,之前也看过类似的,但是当时只是无意看到,大约知道是位运算符,因为之前没用上所以就没太留意,既然现在项目中有人用到了,就好好研究下。
var names = [];
var name = 'tom';
if (!~names.indexOf(name )){
console.log(name );
}
!~names.indexOf(name ) 是什么意思了?反正测试可以得出结果值有这个的规律 -(X+1),感觉还不是太明白。
于是,先查了一下文档:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators
概述:
按位操作符(Bitwise operators) 将其操作数(operands)当作32位的比特序列(由0和1组成),而不是十进制、十六进制或八进制数值。例如,十进制数9,用二进制表示则为1001。按位操作符操作数字的二进制形式,但是返回值依然是标准的JavaScript数值。
~ 即 (按位非)
a | NOT a |
---|---|
0 | 1 |
1 | 0 |
对任一数值 x 进行按位非操作的结果为 -(x + 1)。例如,~5 结果为 -6。
var str = 'rawr';
var searchFor = 'a';
// 这是 if (-1*str.indexOf('a') <= 0) 条件判断的另一种方法
if (~str.indexOf(searchFor)) {
// searchFor 包含在字符串中
} else {
// searchFor 不包含在字符串中
}
// (~str.indexOf(searchFor))的返回值
// r == -1
// a == -2
// w == -3
例子
- ~value的使用
判断数值中是否有某元素时,以前这样判断:
if(arr.indexOf(ele) > -1){...} //易读
现在可以这样判断,两者效率:
if(~arr.indexOf(ele)){...} //简洁
- ~~value的使用
对于浮点数,~~value可以代替parseInt(value),而且前者效率更高些
parseInt(-2.99) //-2
~~(-2.99) //-2
位运算的效率会比运算符高。