element-ui的switch组件源码有这样一个判断
if (!~[this.activeValue, this.inactiveValue].indexOf(this.value)) {
this.$emit('input', this.inactiveValue);
}
这个用法比较新颖,因为默认的写法都是 ['xx', 'yy'].indexOf(who) >= 0
先看一下~的含义是 非按位取反运算符,总结的规律是 -(x+1) 。
复习一些二进制知识:
原码
原码表示法最高位为符号位,该位为0表示正数,1表示负数。其余位表示数的绝对值。
反码
对于一个带符号的数来说,正数的反码与其原码相同;负数的反码为其原码除符号位以外的各位按位取反。反码常用来做求补码过程中的中间形式。
补码
正数的补码与其原码和反码相同;负数的补码是对它的原码除符号位以外各位取反,并在末位加1而得到,即为该数的补码加1。计算机内的数一般以补码形式表示。在补码中用(-128)D代替了(-0)D,注意:(-128)D没有相对应的原码和反码,(-128)D = (1000,0000)B。
求补运算
求补运算不考虑符号位,对它的原码各位取反,并在末位加1而得到。对一个数进行求补运算所得的是该数相反数的补码。
总结:所以~['x'].indexOf('x') 永远返回<0的数字,等于0说明不存在。!0又会转为false,所以!~['x'].indexOf('x')可以判断是否存在于数组。不用去写>=0了。
其他用法:
~~ 转换成数字并且把小数点去掉 效率比Math.floor高