A-A+

js运算符的一些特殊应用

2018年06月08日 javascript 暂无评论 阅读 16 views 次

本文集合了了js运算符的一些特殊应用。
js位运行符的运用。
js运算符的使用技巧。

回目录

是否包含指定字符: ~

~"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)
}
回目录

取整: |

num | 0

num 整数

例:

1.3 | 0 //1
回目录

取半: >>

num >> 1

num 整数
例:求 50 的 1/2

50 >> 1 //25

有除号 / 干嘛不用呢?多好呀: 50/2 //25

回目录

成长值评级: ||

需求1:
成长值为5是1星;
成长值为10是2星;
成长值为12是3星;
成长值为15是4星;
其他都是0星。

({'5':1,'10':2,'12':3,'15':4}[val] || 0);

val 成长值。

回目录

判断奇偶: &

num & 1

num 整数

例:

var num=3; if (num & 1) { console.log("num是奇数"); //num是奇数 } else { console.log("num是偶数");
}
回目录

交换两个数字的值: ^=

使用位运行符:

var num1 = 1, num2 = 2;
num1 ^= num2;
num2 ^= num1;
num1 ^= num2;
console.log(num1,num2); //2 1

使用数组:

var num1 = 1, num2 = 2;
num1 = [num2, num2 = num1][0];
console.log(num1,num2); //2 1
回目录

2的n次方: << 和 **
1 << n-1

使用位运行符:

2的n次方
例:2的3次方:1<<3 //8

使用幂运行符:

个人觉得这个不如直接使用  的方式好。

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 正确
回目录

是否是指定字符串开头: ! 和 ^

!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
回目录

字符串转数字: +

+str

例:

var str='123'; typeof(str) //string typeof(+str) //number
回目录

转为 Boolean 值: !!

!!obj

例:

!!'text' //true
其实是一种利用符号进行的类型转换,转换成数字类型 ~~true == 1 ~~false == 0 ~~"" == 0 ~~[] == 0 ~~undefined ==0 ~~!undefined == 1 ~~null == 0 ~~!null == 1 
按位非运算符,简单的理解就是改变运算数的符号并减去1,当然,这是只是简单的理解能转换成number类型的数据
那么,对于typeof var!==”number”的类型来说,进行运算时,会尝试转化成32位整形数据,如果无法转换成整形数据,就转换为NaN;  JS在位运算上用了更简便的一种方法来实现这中运算,那么它的实现原理大致上可以这样理解: 
var testData=-2.9;  var testResult=(typeof testData==="number"&&!isNaN(testData)&&testData!==Infinity)?(testData>0)?-Math.floor(testData)-1:-Math.ceil(testData)-1:-1; 
首先,如果一个数据在尝试转换为32整形数据时,结果<0,那么就需要对其上舍入,比如-2.9->-2,如果>0,对其下舍入,比如:2.6->2;  一个数据如果不能转换为32位二进制表示,就转换为NaN;继而转为-1;比如~{}/~NaN ==-1;  又比如~function(){return 100;}->-1;  在Jquery里面,有用到比如if(!~this.className.indexOf(str)){ //do some thing…..};这里,对于this.className.indexOf(str)的返回值,要么大于-1,要么就是等于-1;在其等于-1的时候,~-1===0;然后,!~-1===true;那么就可以得出this不包含str这个class名…;  对于~~运算符,同理,它也可以表示为: 
var testData=2.1;  var testResult=(typeof testData==="number"&&!isNaN(testData)&&testData!==Infinity)?(testData>0)?Math.floor(testData):Math.ceil(testData):0; 
 
打赏作者
如果文章对您有所帮助请打赏支持本站发展。

您的支持将鼓励我们继续创作!

[微信] 扫描二维码打赏

[支付宝] 扫描二维码打赏

标签:

给我留言

您必须 登录 才能发表留言!

Copyright © 前端技术分享休闲玩耍去处分享-大一网 保留所有权利.   Theme  Ality

用户登录 ⁄ 注册

分享到: