js中indexOf 的按位化简
创始人
2024-02-29 22:33:38
0

在数组中查找某个值时,可以使用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。

相关内容

热门资讯

骄成超声(688392)披露提... 截至2025年12月22日收盘,骄成超声(688392)报收于122.82元,较前一交易日上涨7.6...
男子把80万元奔驰借给朋友却被... 男子把80万元奔驰借给朋友却被对方3万元抵押,律师:涉嫌诈骗
这种情况下,败诉方在诉讼中所作... 山东高院:败诉方在诉讼中所作陈述,是否构成商业诋毁? 当事人通过民事诉讼行使合法权益,不属于“传播”...
国家数据局:将持续推进公共数据... 南都讯 记者李玲 发自北京 “为充分释放公共数据价值,我们组织实施公共数据‘跑起来’示范场景建设,已...
创新构建“儒韵同心圆”消保模式... 2025年,邹城金融监管支局深入践行新时代“枫桥经验”,立足“孟子故里、儒风邹城”文化底蕴,以人民为...
央行:一次性信用修复政策不区分... 【大河财立方消息】12月22日,中国人民银行举行新闻发布会,介绍一次性信用修复政策有关情况。中国人民...
成都男子9天举报92次违停,交... "一条非机动车道的争夺战:成都市民9天举报92次违停,89次成功。150元罚款为何挡不住违停?当举报...
优衣库“偷拍防盗”逾越了法律与... 近日,优衣库部分门店被指“偷拍”消费者来防盗。在社交媒体上,有消费者反映,在优衣库因“被当小偷”引发...