按位取反运算符 (~)的用法和应用场景
用法
说明:Javascript 按位取反运算符 (~) ,对一个表达式执行位非(求非)运算。如 ~1 = -2 ; ~2 = -3 ; ~99 = -100;
result = ~ 【数字】
所有一元运算符(如 ~ 运算符)都按照下面的规则来计算表达式的值:
1、 如果应用于未定义的表达式或 null 表达式,则会引发一个运行时错误。
2、 将对象转换为字符串。(例如~[9] 会把数组变为字符串“9”,然后执行~“9”,“9” 要变为数值9,最后结果为-10)
3、 如果可能,将字符串转换为数字。 否则,将引发运行时错误。
4、 布尔值被视为数字(如果为 false,则为 0;如果为 true,则为 1)。
应用场景
一般的检索一串字符串中是否包含某串字符时我们通常会用到 if("3234".indexOf("1") !== -1) 来判断需要检索的字符中是否包含想查找的关键字,看起来代码过于冗长,使用按位取反运算符(~)改造代码,1. if("3234".indexOf("1") !== -1) --> if(~"3234".indexOf("1")) 改造后的代码的功能是一致的,并且代码更加简洁优雅,当检索得到的值为0时,按位取反得到-1 ,当当检索得到的值为-1时,按位取反得到0,而Javascript的0在判断时转为布尔值为false,如果仅仅if("3234".indexOf("1"))这样判断是否是否存在关键字,如果关键字在第一位,返回值为0 ,就得不到预期的结果,使用按位取反运算符 (~)刚好解决了这个问题
console.log("3234".indexOf("0"))
// 输入 -1 结果为真
console.log(~"3234".indexOf("0"))
// 输入 0 结果为假 符合预期
console.log("3234".indexOf("3"))
// 输入 0 结果为假
console.log(~"3234".indexOf("3"))
// 输入 -1 结果为真 符合预期