在数组中查找某个值时,可以使用indexOf()方法
if(arr.indexOf(item) > -1){// 在arr数组中存在item值
}
if(arr.indexOf(item) === -1){// 在arr数组中不存在item值
}
可以使用按位运算符~将代码进一步简化,当按位运算符右侧的变量不为-1时,返回true,否则返回false
if(~arr.indexOf(item)){// 在arr数组中存在item值
}
if(!~arr.indexOf(item)){// 在arr数组中不存在item值
}
js中的按位运算符包括 位与&、位或|、位异或^、非位~ 这四种,按位运算是针对二进制数值的运算
&同一位上都为1(真)时才为1(真),其余为0(假)
例如:
var a = 1; // 转二进制 0001
var b = 2; // 转二进制 0010
console.log(a & b); // 0000 转十进制 0
|同一位上都为0(假)时才为0(假),其余为1(真)
例如
var a = 1; // 转二进制 0001
var b = 2; // 转二进制 0010
console.log(a | b); // 0011 转十进制 3
^同一位上数值相同则为0(假),不同则为1(真)
例如
var a = 1;// 转二进制 0001
var b = 3;// 转二进制 0010
console.log(a ^ b);// 0011 转十进制 3
~(理解起来稍微有点绕 这篇文章解释的很好)要想更好的理解按位非运算符,需要先搞清楚计算机在内存中的计算和存储方式,可参考文章
按位非~的逻辑是按位取反,操作的是二进制数
例1:对2进行~2操作
1.2(原码)的二进制为00000010
2.~2按位取反后为11111101(包括符号位也取反)
3.由于计算机中所有有符号数都是以补码的形式存在,所以进行转换
4.11111101的反码为10000010(符号位不变)
5.10000010的补码为10000011(在反码的基础上+1)
6.10000011的十进制为-3
例2:对0进行~0操作
1.0(原码)的二进制为00000000
2.~0按位取反后为11111111
3.由于计算机中所有有符号数都是以补码的形式存在,所以进行转换
4.11111111的反码为1000000
5.1000000的补码为1000001
6.1000001的十进制为-1
由上述两个例子可知,按位非操作符的本质其实就是操作数的负值减1
~2 = -2-1 = -3
~0 = -0-1 = -1
所以在使用indexOf操作符判断数组中是否存在某值时,可以用按位非~来辅助判断,是因为~-1 = 1 - 1 = 0,而其他数的取反操作不等于0。