js运算符的特殊应用
- 是否包含指定字符: ~
- 取整: |
- 取半: >>
- 成长值评级: ||
- 判断奇偶: &
- 交换两个数字的值: ^=
- 2的n次方: << 和 ** 1 << n-1
- 是否是指定字符串开头: ! 和 ^
- 字符串转数字: +
- 转为 Boolean 值: !!
- 转为数字类型:~~
1、是否包含指定字符: ~
~"str1".indexOf("str2") //str1 被查找的字符串 //str2 查找的字符串 //如果 str1 不含有 str2 ,则返回数字 0 。
例子
var str1='abc'; var str2='a'; if(~str1.indexOf(str2)){ console.log('有'+str2) //有a }else{ console.log('无'+str2) }
2、取整: |
num | 0 //num为正数时,相当于Math.floor()向下取整 //num为负数时,相当于Math.ceil()向上取整 // |后面必须是0,是0达到的是取整的效果,不是0,相当于转换为二进制之后相加的结果 //(4|4)=4 即转换为二进制之后100 |100 相加得到100=4
例子
1.3 | 0 //1
3、取半: >>
num >> 1 //num 整数
例:求 50 的 1/2
50 >> 1 //25
4、成长值评级: ||
需求1:
成长值为5是1星;
成长值为10是2星;
成长值为12是3星;
成长值为15是4星;
其他都是0星。
({'5':1,'10':2,'12':3,'15':4}[val] || 0); //val 成长值。
5、判断奇偶: &
num & 1 //num 整数 //例子 var num=3; if (num & 1) { console.log("num是奇数"); //num是奇数 } else { console.log("num是偶数"); }
6、交换两个数字的值: ^=
方法1:使用位运行符:
var num1 = 1, num2 = 2; num1 ^= num2; num2 ^= num1; num1 ^= num2; console.log(num1,num2); //2 1
方法2:使用数组:
var num1 = 1, num2 = 2; num1 = [num2, num2 = num1][0]; console.log(num1,num2); //2 1
7、2的n次方: << 和 **
方法1:使用位运行符:
1 << n-1 //2的n次方 //例子:2的3次方: 1<<3 //8
方法2:使用幂运行符:
x**y //x的y次方 //例:2的3次方: 2**3 //8
方法比较:
使用 <<
的方式可以支持负数,**
需要用括号否则出错。
使用 **
比较直观,没研究过 <<
方法的任意数的任意次方的规律。
1<<3 //8 2**3 //8 -1<<3 //-8 -2**3 // 报错 -(2**3) //-8 3<<2 //12 错误 3**2 //9 正确
8、是否是指定字符串开头: ! 和 ^
!str1.indexOf("str2") //例: var str1='abc'; var str2='a'; if(!str1.indexOf(str2)){ console.log('是开头') }else{ console.log('不是开头') }
使用正则方式
/^a/.test('abc') //a开头,true /c$/.test('abc') //c结尾,true
9、字符串转数字: +
+str //例: var str='123'; typeof(str) //string typeof(+str) //number
10、转为 Boolean 值: !!
!!obj //例: !!'text' //true
11、转为数字类型:~~
~~‘1’=1 ~~true == 1 ~~false == 0 ~~"" == 0 ~~[] == 0 ~~undefined ==0 ~~!undefined == 1 ~~null == 0 ~~!null == 1