JavaScript高级程序设计(3)基本概念 中
操作符
ECMA-262描述了一组用于操作数据值的操作符,包括算数操作符、位操作符、关系操作符和相等操作符。他们能够适应很多值,例如字符串、数字值、布尔值甚至对象。在应用对象时,相应的操作符都会调用对象的valueof()和toString()方法。取得可以操作的值。
一元操作符:只能操作一个值。
1.递增和递减操作符。
前置性(++i):++位于要操作的变量之前 变量先加1,然后赋值给左边的变量。
后值性(i++):++位于要操作的变量之后 ,先赋给左边的变量,然后再+1。
递减同理;
var num1 = 2; var num2 = 20; var num3 = --num1 + num2; //等于21 var num4 = num1 + num2; //等于21 var num5 = num1-- +num2; //等于22 var num6 = num1 + num2; //等于21
他们不仅适用于整数,还可以用于字符串、布尔值、浮点数值和对象。应用不同的值有不同的规则。
- 一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减 1 的操作。字符串变量变成数值变量。
- 一个不包含有效数字字符的字符串时,将变量的值设置为NaN。字符串变量变成数值变量。
- 布尔值为false,先将其转换为 0 再执行加减 1 的操作。布尔值变量变成数值变量。
- 布尔值true,先将其转换为 1 再执行加减 1 的操作。布尔值变成数值变量。
- 浮点数值时,执行加减 1 的操作。
- 对象时,先调用对象的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.一元加和减操作符
以一个加号(+)表示,放在数值前面,对数值不会产生任何影响。非数值前面,会对这个值进行转换。
以一个减号(-)表示,放在数值前面,变成负数。非数值前面,对这个值进行转换,变成负数。
位操作符
按位非(NOT) 波浪线(~)表示,结果是返回数值的反码。
按位于(AND) 和号字符(&)表示,只在两个数值的对应位都是 1 时才返回 1 ,任何一位是 0 ,结果都是 0 。
按位或(OR) 竖线符号(|)表示,有一个位是 1 的情况下就返回 1 ,而只有在两个位都是 0 的情况下才返回 0 。
按位异或(XOR) 插入符号(^)表示,两个数值对应位上只有一个 1 时才返回 1 ,如果对应的两位都是 1 或都是 0 ,则返回 0 。
左移 两个小于号(>>)表示,会将数值的所有位向左移动指定的位数。不会影响操作数的符号位
有符号右移 两个大于号(<<)表示,会将数值向右移动,会用符号位填充所有空位。
无符号右移 三个大于号(<<<)表示,二进制数向右移位,直接右移,对于正数,结果和>>相同,对于负数,会把负数的二进制补码当成正数的二进制码处理
布尔操作符
逻辑非(NOT):叹号(!)表示,将它的操作数转换为一个布尔值,然后再对其求反。
同时使用两个逻辑非操作符,可以将值转换为真正的布尔值。
逻辑与(AND):两个和号(&&)表示。
当两个操作数相应的Boolean值均为true时,返回true;有一个false,都会返回false。
短路操作:如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值。
逻辑或(AND):两个竖线符号(||)表示。
当两个操作数相应的Boolean值均为false时,返回false;有一个true,都会返回true。
短路操作:第一个操作结果为true,就不会对第二个操作数求值了。
计算操作符
乘法操作符由一个星号(*)表示,计算两个数值的乘积。
除法操作符由一个斜线符号(/)表示,执行第二个操作数除第一个操作数的计算。
求模(余数)操作符由一个百分号(%)表示。执行常规的除法计算,返回除得的余数
加性操作符(+)
如果是数值,执行常规的加法计算。
如果有字符串,则会拼接起来。添加圆括号(),就可以对数值执行算术计算,然后再将结果与字符串拼接起来。
减法操作符(-)
如果是数值,执行常规的减法计算,
如果是其他,则会转换,在进行计算
1、除了加(+)之外,如果操作数不是Number类型,会自动调用Number()转换为Number类型再进行计算。
2、对于加减(+-),除了作为算术运算符。还可以作为一元操作符(见上)。当然,由于字符串操作中对加号(+)的重载,还可以用于将任意数值(的字符串)相连,这也是第1点中为什么要除了加(+),它在含有非Number类型值时,会将所有操作数转换为字符串相连接。
3、与一般类C语言不同,在ES中,除(/)和取模(%)并不会区分整数和浮点数,比如 5 / 2 = 2.5 而不是2,5.3 % 3 = 2.3 而不是2。
4、任意运算,只要操作数含NaN,结果就是NaN。但并不是结果为NaN就一定有一个操作数为NaN,比如0/0也返回NaN。
5、对于含无穷Infinity的运算,规定比较多,这里就不列举了,可以参考原书,或者自行测试。
关系操作符
小于(<)、大于(>)、小于等于(<=)和大于等于(>=)对两个值进行比较,都会返回一个布尔值。
1.如果两个操作数都是数值,则执行数值比较。
2.如果两个操作数都是字符串,则比较相对应的字符编码值。
3、操作符是对象时,调用valueOf()(如果没有,就调用toString()),再将结果按上面规则比较。
4、任意数和NaN比较返回false。
相等操作符
等于号(==) 不等于(!=) 先转换操作数,然后再比较它们的相等性。
全等(===) 不全等(!==)不会转换操作数,直接比较。
a===b则一定有a==b,而a!=b则一定有a!==b。
条件操作符
variable = boolean_expression ? true_value : false_value;
该表达式主要是根据 boolean_expression 的计算结果有条件地为变量赋值。如果 Boolean_expression 为 true,就把 true_value 赋给变量;如果它是 false,就把 false_value 赋给变量。
赋值操作符(=) 右则的值赋给左侧的变量。
每种主要的算术运算以及其他几个运算都有复合赋值运算符:
- 乘法/赋值(*=)
- 除法/赋值(/=)
- 取模/赋值(%=)
- 加法/赋值(+=)
- 减法/赋值(-=)
- 左移/赋值(<<=)
- 有符号右移/赋值(>>=)
- 无符号右移/赋值(>>>=)
逗号操作符
使用逗号操作符可以在一条语句中执行多个操作。
var iNum1 = 1, iNum = 2, iNum3 = 3;
多用于声明多个变量。