2.9 运算符
2.9.1、一元运算符
一元运算符只有一个参数,即要操作的对象或值。
1、delete:删除对以前定义的对象属性或方法的引用,但此运算符不能删除开发者未定义的属性和方法。示例:
1 var o=new Object;
2 o.name="Nicholas";
3 o.show=function(){
4 return "test";
5 };
6 console.log(o.name); //outpus Nicholas
7 console.log(o.show()); //outpus test
8
9 delete o.name;
10 delete o.show;
11
12 console.log(o.name); //outpus undefined
13 console.log(o.show()); //outpus TypeError: o.show is not a function
14
15 delete o.toString;
16 console.log(o.toString()); //outpus [object Object]
2、void:对任何值都返回undefined,该运算符通常用于避免输出不应该输出的值。
如在链接中打开新窗口,代码如下:
<a href="javascript:window.open('about:blank')">Click Me</a>
点击链接后会在新窗口中出现[object]。这是因为window.open()方法返回了对新打开窗口的引用。然后该对象将被转换成要显示的字符串。要避免这种结果,可以用void运算符调用window.open()函数:
<a href="javascript:void(window.open('about:blank'))">Click Me</a>
3、前增量/前减量运算符:从C中借用的两个运算符。示例:
1 var iNum=10;
2 console.log(++iNum); //outpus 11 same as iNum=iNum+1
3 console.log(iNum); //outpus 11
4 console.log(--iNum); //outpus 10 same as iNum=iNum-1
5 console.log(iNum); //outpus 10
4、后增量/后减量运算符:从C中借用的两个运算符。与前增量/前减量一样,也是给数值加1或减1,不同的是后缀式运算符是在计算过包含它们的表达式后才进行增量或减量运算的。示例:
1 var iNum=10;
2 iNum--
3 console.log(iNum); //outpus 9
4 console.log(iNum--); //outpus 9
5 console.log(iNum); //outpus 8
6 iNum++
7 console.log(iNum); //outpus 9
8 console.log(iNum++); //outpus 9
9 console.log(iNum); //outpus 10
5、一元加法和一元减法:用法与高中数学中学到的用法相同,一元加法对数字无任何影响,一元减法就是对数值求负。但一元回法和一元减法对字符串进行运算时与parseInt()相似,主要的不同是只有对以"ox"开头的字符串,一元运算符才把它转换为10进制的值。示例:
1 var iNum=25;
2 iNum=+iNum;
3 console.log(iNum); //outpus 25
4
5 var sNum="50";
6 console.log(typeof sNum); //outpus string
7 console.log(+sNum); //outpus 50
8 console.log(typeof +sNum); //outpus number
9
10 var sNum1="017";
11 var sNum2="0xB";
12 console.log(-sNum1); //outpus -17
13 console.log(-sNum2); //outpus -11
2.9.2 位运算符
1、位运算NOT:由(~)表示,处理过程如下:
(1) 把运算数转换为32位数字
(2) 把二进制形式转换成它的二进制反码;
(3) 把二进制反码转换为浮点数
示例:
1 var iNum1=25; //25 is equal to 0000 0000 0000 0000 0000 0000 0001 1001
2 var iNum2=~iNum1; //conver to 1111 1111 1111 1111 1111 1111 1110 0110
3 console.log(iNum2); //outpus -26
4
5 //位运算符NOT实质上是对数字求负,然后减1,因此下面的代码也可以得到同样的效果
6 var iNum3=25;
7 var iNum4=-iNum3-1;
8 console.log(iNum4);
2、位运算AND:由(&)表示,直接对数字的二进制形式进行计算。规则为全为1才为1,否则为0。示例:
1 var iNum1=25; //25 is equal to 0000 0000 0000 0000 0000 0000 0001 1001
2 var iNum2=iNum1&3; // 3 is equal to 0000 0000 0000 0000 0000 0000 0000 0011
3 console.log(iNum2); // and is 0000 0000 0000 0000 0000 0000 0000 0001 outpus 1
3、位运算OR:由(|)表示,直接对数字的二进制形式进行计算。规则为全为0才为0,否则为1。示例:
1 var iNum1=25; //25 is equal to 0000 0000 0000 0000 0000 0000 0001 1001
2 var iNum2=iNum1|3; // 3 is equal to 0000 0000 0000 0000 0000 0000 0000 0011
3 console.log(iNum2); // or is 0000 0000 0000 0000 0000 0000 0001 1011 outpus 27
4、位运算XOR:由(^)表示,直接对数字的二进制形式进行计算。规则为只有一个数位存放的是1时才为1,否则为0。示例:
1 var iNum1=25; //25 is equal to 0000 0000 0000 0000 0000 0000 0001 1001
2 var iNum2=iNum1^3; // 3 is equal to 0000 0000 0000 0000 0000 0000 0000 0011
3 console.log(iNum2); // xor is 0000 0000 0000 0000 0000 0000 0001 1010 outpus 26
5、左移运算:由(<<)表示,把数字中的所有数位向左移动指定的数量,保留符号位,左移一位相当于乘以2。
6、有符号右移运算:由(>>)表示,把数字中的所有数位向右移动指定的数量,保留符号位,右移一位相当于除以2。
7、无符号右移运算:由(>>>)表示,把数字中的所有数位向右移动指定的数量。对于正数跟有符号的右移完全一样,对于负数作为正数来处理。
示例:
1 var iOld=2;
2 var iOld1=64;
3 var iOld2=64;
4 var iOld3=-2;
5
6 var iNew=iOld<<5;
7 var iNew1=iOld1>>5;
8 var iNew2=iOld2>>>5;
9 var iNew3=iOld3>>>1;
10
11 console.log(iNew); //outpus 64
12 console.log(iNew1); //outpus 2
13 console.log(iNew2); //outpus 2
14 console.log(iNew3); //outpus 2147483647
负数iOld3无符号右移的计算方法如下:
先把-2转换成无符号的等价形式,即-2的二进制补码:
-2的非负版本二进制表示:0000 0000 0000 0000 0000 0000 0000 0010
该二进制的反码:1111 1111 1111 1111 1111 1111 1111 1101
在二进制反码上加1:1111 1111 1111 1111 1111 1111 1111 1110
最后再右移一位:0111 1111 1111 1111 1111 1111 1111 1111 即为:2147483647
2.9.3 Boolean运算符
1、逻辑NOT:由(!)表示,返回值一定是Boolean值,行为如下:
如果运算数是对象,返回false
如果运算数是数字0,运回true
如果运算数是0以外的任何数字,反回false
如果运算数是null,返回true
如果运算数是NaN,返回true
如果运算数是undefined,发生错误
2、逻辑AND:由(&&)表示,如果运算数均为Boolean型,只有当运算数均为true时才返回true,否则返回false。AND运算的运算数可以是任何类型,返回值不一定是Boolean值:
如果一个运算数是对象,另一个是Boolean值,返回该对象
如果两个运算数都是对象,返回第二个对象
如果某个运算数是null,返回null
如果某个运算数是NaN,返回NaN
如果某个运算数是undefined,发生错误
ECMAScript中的逻辑AND也是简便运算,即如果第一个运算数决定了结果,就不再计算第二个运算数,示例:
1 var bFalse=false;
2 var bResult=bFalse&&bUnknow;
3 console.log(bResult); //outpus false
4
5 var bTrue=true;
6 var bResult=bTrue&&bUnknow;
7 console.log(bResult); //outpus ReferenceError: bUnknow is not defined
3、逻辑OR运算符:由(||)表示,如果运算数均为Boolean型,只有当运算数均为false时才返回false,否则返回true。OR运算的运算数可以是任何类型,返回值不一定是Boolean值:
如果一个运算数是对象,另一个是Boolean值,返回该对象
如果两个运算数都是对象,返回第一个对象
如果某个运算数是null,返回null
如果某个运算数是NaN,返回NaN
如果某个运算数是undefined,发生错误
ECMAScript中的逻辑OR也是简便运算,即如果第一个运算数决定了结果,就不再计算第二个运算数,示例:
1 var bTrue=true;
2 var bResult=bTrue||bUnknow;
3 console.log(bResult); //outpus true
4
5 var bFalse=false;
6 var bResult=bFalse||bUnknow;
7 console.log(bResult); //outpus ReferenceError: bUnknow is not defined
2.9.4 乘性运算符
1、乘法运算符:由(*)表示,正常情况下跟数学中的乘法相同,特殊情况下有些特殊值:
如果运算的结果太大或太小,生成结果为Infinity或-Infinity
如果某个运算数是NaN,结果为NaN
Infinity乘以0,结果为NaN
Infinity乘以0以外的任何数字,结果为Infinity或-Infinity,由第二个运算数的符号决定
Infinity乘以Infinity,结果为Infinity
2、除法运算符:由(/)表示,正常情况下跟数学中的乘法相同,特殊情况下有些特殊值:
如果运算的结果太大或太小,生成结果为Infinity或-Infinity
如果某个运算数是NaN,结果为NaN
Infinity被Infinity除,结果为NaN
Infinity被任何数字除,结果为Infinity
0除以一个非无穷大的数字,结果为NaN
Infinity被0以外的任何数字除,结果为Infinity或-Infinity,由第二个运算数的符号决定
3、取模运算符:由(%)表示,正常情况下跟数学中的乘法相同,特殊情况下有些特殊值:
如果被除数是Infinity,或者除数是0,结果为NaN
Infinity被Infinity除,结果为NaN
如果除数是无穷大的数,结果为被除数
如果被除数为0,结果为0