1、JS运算符 位运算符一. 按位与运算符(&)1. 该运算符对它的运算数逐位执行布尔AND操作,只有两个运算数中相应的位都为1时,结果中的这一位才为1,它要求其运算数为整型,如果运算数不是整型,则会尝试将其转换为32位整型,如果无法转换,就返回NaN。/ 运算数均为整型alert(9 & 9); / 9alert(9 & 10); / 8alert(1 & 3); / 1/ 运算数可以被转换为整型alert(9 & 9); / 9alert(9 & 10); / 8alert(1.25 & 3.25); / 1/ 一个或两个运算数均无法被转换整型alert(1 & a); / 0alert( &
2、 /d/); / 0alert(NaN & NaN); / 0alert(Infinity & Infinity); / 0alert(NaN & Infinity); / 0alert(null & null); / 0alert(undefined & undefined); / 0alert(null & undefined); / 0二. 按位或运算符(|)1. 该运算符对它的运算数逐位执行布尔OR操作,如果其中一个运算数中相应位为1或者两个运算数中的相应位都为1,结果中的这一位就为1,它要求其运算数为整型,如果运算数不是整型,则会尝试将其转换为32位整型,如果无法转换,就返回NaN。
3、/ 运算数均为整型alert(9 | 9); / 9alert(9 | 10); / 11alert(1 | 3); / 3/ 运算数可以被转换为整型alert(9 | 9); / 9alert(9 | 10); / 11alert(1.25 | 3.25); / 3/ 一个运算数无法被转换整型alert(1 | a); / 1alert(10 | null); / 10alert(100 | NaN); / 100/ 两个运算数均无法被转换成整型alert( | /d/); / 0alert(NaN | NaN); / 0alert(Infinity | Infinity); / 0aler
4、t(NaN | Infinity); / 0alert(null | null); / 0alert(undefined | undefined); / 0alert(null | undefined); / 0三. 按位非运算符()1. 该运算符的作用,相当于改变运算数的符号并减1。它要求其运算数为整型,如果运算数不是整型,则会尝试将其转换为32位整型,如果无法转换,就返回NaN。alert(5); / 相当于-5 - 1 = -6alert(); / -1alert(); / -1alert(10); / -11alert(10); / -11alert(aa); / -1alert(/d
5、/); / -1alert(undefined); / -1alert(Infinity); / -1alert(NaN); / -1alert(null); / -1alert(function() ); / -12. 的运算原理/ 网上有个老外对的运算原理做了分析,他的分析如下(以foo为例,foo是经过整型转换后的结果):typeof foo = number & !isNaN(foo) & foo != Infinity ? foo 0 ? Math.floor(foo) : Math.ceil(foo) : 0;/ 基于老外的分析,的运算原理可以想象为这样:typeof foo =
6、number & !isNaN(foo) & foo != Infinity ? foo 0 ? -(Math.floor(foo) + 1) : -(Math.ceil(foo) + 1) : -1;3. 一个较特殊的例子alert(function()alert(20);(); / 先输出20,然后输出-1,why?/ 分析:(1) ()的优先级要高于,所以function()alert(20);会先与()结合,再与结合;(2) 会执行其后的语句,但执行结果不会成为运算数,即function()alert(20);()不会成为20;(3) 还会对其后的语句进行求值运算,我们通过模拟来验证一
7、下:var func = function() alert(1);func.valueOf = function() return 10;alert(function() alert(1);); / -1alert(func); / -11四. 左移运算符()1. 该运算符有两个运算数:ab,将a左移b位相当于a乘以2的b次方;两个运算数都要求是整数,或可以被转换为整数。/ 运算数均为整数alert(1 2); / 4/ 运算数可以被转换为整数alert(1 2); / 42. 当运算数a无法被转换为整数时,运算结果为0。alert( 2); / 0alert(NaN 2); / 0alert
8、(Infinity 2); / 0alert(function() 2); / 0alert(undefined 2); / 0alert(null 2); / 03. 当运算数b无法被转转换为整数时,运算结果为运算数a,相当于a0。alert(2 ); / 2alert(20 NaN); / 20alert(10 Infinity); / 104. 当运算数a和b均无法被转换为整数时,运算结果为0。alert(a Infinity); / 0alert(NaN )1. 该运算符有两个运算数:a 1); / Math.floor(7/2) = 3alert(-7 1); / Math.floor(-7/2) = -4/ 运算数无法被转换为整数alert(NaN 1); / 0alert(NaN NaN); / 0alert(20 NaN); 20六. 用0补足的右移运算符()1. 该运算符有两个运算数:ab,当运算数无法被转换成整数时,运算结果的情况与左移运算符相同。alert(a 2); / 0alert(a NaN); / 0alert(20 NaN); / 20