阅读javascript高级程序设计随笔(五)
2.5 操作符
操作符包括算术操作符、位操作符、关系操作符合相等操作符。ECMAScript操作符与众不同的是,它们能够适用很多值,例如字符串、数字值、布尔值甚至对象。在应用于对象时,相应的操作符通常都会调用对象的valueOf()或toString(),以便取得可以操作的值。
2.5.1 一元操作符
只能操作一个值的操作符叫做一元操作符。
1.递增和递减操作符
递增和递减操作符,各有两个版本:前置型和后置型。例如:
var num= 4;
num++;//后置型
++num;//前置型
前置型和后置型区别是前置型是先进行递增或递减运算,然后再参加运算;后置型是先参加运算,再进行递增或递减运算。例如:
var num = 4;
//alert(++num+1);//输出6 写成alert((++num)+1)结果也是一样
//alert(num+++1);//输出5 写成alert((num++)+1)结果也是一样
递增递减操作符不仅仅用在整数,还可以用在字符串、布尔值、浮点数和对象。它们遵循的规则以下:
1.在应用与一个包含有效数字字符的字符串时,先转换为数字值,再执行加减1的操作
2.在应用与一个不包含有效数字字符的字符串时,将变量的值设为NaN
3.在应用于布尔值false时,先将其转换为0再执行加减1的操作
4.在应用于布尔值true时,先将其转换为1再执行加减1的操作
5.在应用于浮点数值时,执行加减1操作。
6.在应用于对象,先调用对象的valueOf()方法以取得一个可供操作的值。然后对该值应用前述的规则。如果结果是NaN,则调用toString()方法后再应用前述规则。
例子:
var s1 = "2"; var s2 = "z"; var b = false; var f = 1.1; var o = { valueOf: function(){ return -1; } }; s1++; //值变成3 s2++;//值变成NaN b++;//值变成1 f--; //值变成0.10000000000000009(由于浮点舍入错误所致) o--;//值变成-2;
2.一元加和减操作符
2.5.2 位操作符
位操作符用于在最基本的层次上,即按内存中表示数值的位来操作数值。
对于有符号的整数,32位中的前31位用于表示整数的值,第32位用于表示数值的符号:0表示整数,1表示负数。这个表示符号的位叫符号位。
计算机是以二进制码来存储数据,而且是使用的是补码。
1.正数的补码就是它的原码。
例如:+9(32位)
原码为: 0000 0000 0000 0000 0000 0000 0000 1001
补码为: 0000 0000 0000 0000 0000 0000 0000 1001
2.负数的补码等于其绝对值的原码各位取反,然后整个数加1的数值
例如:-7(32位)
原码为: 1000 0000 0000 0000 0000 0000 0000 0111
绝对值:0000 0000 0000 0000 0000 0000 0000 0111
取反后: 1111 1111 1111 1111 1111 1111 1111 1000
加1: 1111 1111 1111 1111 1111 1111 1111 1001
所以补码是 1111 1111 1111 1111 1111 1111 1111 1001
按位非(NOT)(波浪线~)
var num1 = 25; // 0000 0000 0000 0000 0000 0000 0001 1001
var num2 = ~num1; // 1111 1111 1111 1111 1111 1111 1110 0110
alert(num2); //-26
按位与(AND)(&)
var result = 25 & 3; //0000 0000 0000 0000 0000 0000 0001 1001
//0000 0000 0000 0000 0000 0000 0000 0011
alert(result);//1 // 0000 0000 0000 0000 0000 0000 0000 0001
按位或(or)(|)
var result = 25 & 3; //0000 0000 0000 0000 0000 0000 0001 1001
//0000 0000 0000 0000 0000 0000 0000 0011
alert(result);//27 // 0000 0000 0000 0000 0000 0000 0001 1011
按位异或(XOR)(^)
var result = 25 & 3; //0000 0000 0000 0000 0000 0000 0001 1001
//0000 0000 0000 0000 0000 0000 0000 0011
alert(result);//26 // 0000 0000 0000 0000 0000 0000 0001 1010
左移
左移操作符(<<),这个操作符将数值的所有位向左移动指定的位数。
var oldValue = 2; // 二进制10
var newValue = oldValue << 5;//左移5位 1000000,就是十进制的64
其实这个操作结果等于2*Math.pow(2,5);
在左移后,原数值的右侧多出了5个空位,左移操作会以0来填充这些空位。左移操作不会影响符号位。
有符号右移
有符号右移操作符(>>),这个操作与左移操作相反,数值向右移动,但保留符号位。
var oldValue= 64;// 0000 0000 0000 0000 0000 0000 0100 0000 红色为符号位
var newValue = oldValue>>5;//0000 0000 0000 0000 0000 0000 0000 0010 红色为符号位,蓝色为自动填充的0
向右移动空出的位置自动填充符号位的值
无符号向右移动操作符号(>>>)
2.5.3布尔操作符
1.逻辑非
逻辑非操作符由一个叹号(!)表示。逻辑非操作符首先将它的操作数转换为一个布尔值,然后求反。
2.逻辑与
逻辑与操作符号(&&),有两个操作数。逻辑与操作可以应用任何类型的操作数,而不仅仅是布尔值。在有一个操作数不是布尔值的情况下,逻辑与操作不一定返回布尔值。它遵循以下规则:
$ 如果第一个操作数是对象,则返回第二个操作数。
$ 如果第二个操作数是对象,则只有第一个操作数的求值结果为true的情况下才会返回该对象
$ 如果两个操作数都是对象,则返回第二个操作数
$ 如果有一个操作数是null,则返回null;(除了第一个操作数是false的情况)
$ 如果有一个操作数是NaN,则返回NaN;(除了第一个操作数是false的情况)
$ 如果有一个操作数是undefined,则返回undefined。(除了第一个操作数是false的情况)
如果两个操作数都是布尔值,会根据以下
----------------------------------------------
第一个操作数 第二个操作数 结果
----------------------------------------------
true true true
true false false
false true false
false false false
-----------------------------------------------
逻辑与也叫短路与,即如果第一个操作数能绝对结果,那么就不会再对第二操作数求值。当第一个操作数为false,就不管第二个操作数,直接返回false。
例子:
var found = true; var result = (found && someUndefinedVariable); //这里会发生错误 alert(result);//不执行
在浏览器报了Uncaught ReferenceError: someUndefinedVariable is not defined的错误。这说明不能在逻辑与操作中使用未定义的值。如果把found改为false,这个错误就不会发生了,因为发生短路,后面不求值。
3.逻辑或
逻辑或操作符(||)表示,有两个操作数。
在有一个操作数不是布尔值的情况下,逻辑与操作不一定返回布尔值。它遵循以下规则:
$ 如果第一个操作数是对象,则返回第一个操作数。
$ 如果第二个操作数求值结果为false,则返回第二个操作数
$ 如果两个操作数都是对象,则返回第一个操作数
$ 如果有一个操作数是null,则返回null;(除了第一个操作数是true的情况)
$ 如果有一个操作数是NaN,则返回NaN;(除了第一个操作数是true的情况)
$ 如果有一个操作数是undefined,则返回undefined。(除了第一个操作数是true的情况)
如果两个操作数都是布尔值,会根据以下
----------------------------------------------
第一个操作数 第二个操作数 结果
----------------------------------------------
true true true
true false true
false true true
false false false
-----------------------------------------------
逻辑或也叫短路或,当第一个操作数是true,就不会执行第二个操作数,直接返回true。